快手前端通用静态托管服务KFX演进历程:从崎岖土路到平坦高速
快手静态部署托管服务(KFX)历经四年发展,经历了三个阶段,一步步从勉强能行车的“崎岖土路”到现在多车道并行的“平坦高速”,这一转变极大地提升了资源利用率和效率,满足业务的实际需要。本文将带你了解其背后的演进历程。
一、KFX前端通用静态托管服务
KFX是什么:KFX 是快手前端通用静态托管服务。
为什么要有KFX?静态托管服务是前端工程化发展的必然结果。快手前端部署的发展大致经历了这三个阶段:
1.直接在物理机上部署ng服务
2.构建带有ng服务和静态文件的镜像,通过容器上线
3.通过静态托管服务上线 (KFX)
三个阶段分别代表着前端部署虚拟化和静态托管的演化过程,资源利用率和效率都得到极大的提升。有同学看到这就会觉得,怎么能又省资源又提高效率呢,这是不是不符合 space–time tradeoff 啊?实际上是符合的,因为我们有其他的代价:静态托管服务是对前端这种静态资源部署的场景特化支持, 因此牺牲的是灵活性和通用性,即难以扩展到部署的其他场景,但在前端场景,聚焦于静态部署已经足够满足业务前端的部署要求。
简单总结来讲就是,大家不满足于通过容器部署上线web服务,发布的时间实在是太慢了,因此KFX出现来解决了这一问题:一条土路建成了。
二、KFX平台演进过程
初始情况
2022年春,KFX平台基础的静态托管能力已初步建成,支持静态服务路由/版本变更、回滚操作。集群数1个,应用数不到100个。
2.1 崎岖山路
土路,意味着能通车了,但是崎岖不平、问题多多。
面临的问题
土路的最大问题就是土。KFX最初仅支持最核心的静态托管能力,解决大家最痛的效率问题, 把上线时间从容器的分钟级缩短到了秒级,这也是我们最开始的口号。然而崎岖土路的问题可太多了,有时候人家走了一遍,踩到坑里去了,甚至想回去绕远路。具体来说:
问题1:不好走
土路路面不平整,能达到目的地, 但是走起来真的很费劲。服务总会出现奇奇怪怪的问题导致不好用, 能走但是不好走的问题体现在:
-
业务发布风险高,每次只能全量发布。
-
分布式集群,通信策略设计有问题,偶发出现版本不一致。
-
业务总会因为各种各样的原因上线失败。
-
上线没有审批功能,想什么时候上就什么时候上。
-
应用无权限隔离控制等
这些问题大多是架构设计不合理、功能不健全导致的,就像是路还没修特别好,就开始通车了,出问题也是在所难免的。
问题2:车道少
土路路面狭窄,难以承载大量或重型车辆,限制了运输效率。KFX 对于多应用,并发大的场景,还没有合适的预案和降级策略。2022年有一次线上压测问题,就是由于高并发下磁盘写入速度瓶颈问题导致的。从来都没有跑过大车,突然就来了装满水泥的混凝土搅拌车,直接就陷在泥里出不来了。
问题3:维护成本高
土路需要频繁的维护和修补,尤其是在恶劣天气后。KFX最初服务稳定性不好,会出现概率性的OOM, 数据库偶发连接失败等问题。为了临时缓解问题,我们甚至有一段时间设置了凌晨四点固定重启服务🥲。 很多用户反馈的问题并不是用户自己操作的问题,而是平台自身的问题。这也就意味着,在用户自身正确操作的情况下,我们还是会有接不完的oncall。
解决方案
这一阶段我们的核心工作是“建”,通过对不合理的架构设计进行重构升级,对缺失的核心能力进行补全。
包括重新设计了心跳检测方案、重构了服务发现机制, 接入公司的星环平台,打通了服务目录和权限控制,同时通过接入流程中心提供了审批能力。其中最重要的是,在pluto灰度服务的加持下,kfx 具备了灰度发布功能,包含白名单、百分比、泳道等各种小流量发布策略,这是历史性的一步,从此大家发布应用不再是一把梭哈了。
实际情况
2022年冬,KFX平台支持灰度发布功能,完成了核心架构的升级。入驻星环平台,作为官方静态部署产品。集群数3个,应用数超过400+,主要覆盖5个部门。
2.2 柏油马路
马路,跑的车越来越多,问题也越来越多。
经过大约一年的建设,我们补全了灰度发布功能,支持了白名单、百分比、泳道等各种小流量发布策略。完成了核心架构的升级,从根源上避免了 版本不一致、服务间接性OOM等问题。土路的不平整基本上被改造完全, 该填平的填平,该硬化的硬化,KFX 进入了柏油马路阶段。
路好了,车就更多了。2023年这一年是KFX规模化扩张最快的一年,也带来了复杂度的快速提升:我们从3个集群,400+个应用,到23年底一共 6 个独立的部署集群,1400+个应用。
面临的问题
规模增长,需求也随之增长, 功能不断增加, 为了满足各种功能的自动化需求,我们先后提供了5 个 流水线 插件,适配了风驰平台(快手前端一站式平台),支持了html能力增强 ,支持了 域名容灾、CDN 域名调度、KConf(快手分布式配置中心) 注入、环境标识等功能。规模增长、功能增加,带来的是架构的复杂度不断增加,以及...更多的线上问题。怎么个多法呢,从23年2月到7月,几乎月均一个线上故障。一个复盘文档没写完,就要赶另外一个复盘文档了。一次故障的改进项没做完,下一次就来了😵💫😭。
解决方案:稳
路是修宽了点,车多了,故障也上来了,痛啊,怎么办呢?不要紧,总会有办法的。
这一阶段我们的核心工作是“稳 ”,23年我们启动了 KFX 整体稳定性治理。
(一)KFX 整体稳定性治理
一说到稳定性治理,大家都知道按照事前、事中、事后拆,但是事前事中事后具体要做什么呢?结合KFX当前的实际情况,我们整体的规划从规范、架构、工程化和运维四个维度出发,结合事前、事中、事后拆解如下, 共计 20+ 重要事项:
这里展开讲讲kfx的自动化e2e测试, e2e测试是我们稳定性建设的核心内容,在今天看起来,也是非常有价值的。
(二)KFX 自动化e2e建设
为什么e2e测试对于KFX服务尤其重要?
1、多种使用场景与复杂的用户行为:
KFX发展至今,支持了halo平台,halo流水线、kdev流水线、风驰平台, 多个流水线插件,这些平台和流水线都可以以任何组合方式进行上线部署操作,单个模块或者功能的正确性已经无法保证整体逻辑的正确。一个具体的例子就是 在 2023 H5容灾域名未替换故障里,就是业务方通过 风驰平台上线,发现问题后使用平台(跨入口操作)进行了快速回滚导致的。
2、回滚链路稳定性差:
在KFX的发布SOP中,我们会将新功能先发布至staging集群,用户在这里发布自己的staging服务(用于业务提测等),大部分功能缺陷支持了halo平台,halo流水线、kdev流水线、风驰平台,多流水线插件,均可任意组合操作。在这个阶段被发现并及时修复,但往往不包括回滚。因为在staging环境下 用户几乎不会使用回滚。但是, 回滚链路不是高频使用链路,但是是核心关键链路,可以说是生命线。用户不用怎么办,我们来找机器人用,因此e2e就是一个很好覆盖核心且低频链路的方案。
3、外部依赖与复杂配置:
KFX 集群有3个独立部署的服务,服务的上下游除了内部之间通过 ksn/内网域名依赖外,还有上游的网关、终端cli、流水线、各平台,下游的 blobstore,数据库,kconf 等, 不同急缺依赖的情况还有各自差异化的地方。单个功能的验证正确,并不代表就不会存在其他的潜在影响。e2e能在prt环境对整体集群进行模拟,尽可能的将问题更早的暴露出来。
综上,建设KFX 的 自动化e2e测试是稳定性治理的必然路径。
整体的e2e测试架构图如下:
这里核心说明三个点:
(一)全量case交叉覆盖:
首先我们枚举了所有用户从所有平台的可能路径,所有的策略类型、变更类型、增强功能。最全的情况是对每一种操作之间进行笛卡尔积,但是这样case的数量将会超过三位数,会导致每次运行的时间过长,因此,我们对case 之间的耦合情况进行划分,相互耦合的case 需要固定出现,而相互独立的case情况则可以作为随机case 出现。
举一个例子:
版本变更和路由变更是会有耦合的,所以版本(不变/增加/回滚) x 路由(不变/新增/删除/编辑) 这12种情况一定需要出现。 然后kconf注入功能和 版本路由变更是相互独立的,所以 版本(不变/增加/回滚)x 路由(不变/新增/删除/编辑) x kconf(注入/不注入)不是 24种情况,而仍然是12种情况, 只需要在前12种情况中,分别一次注入和不注入,剩下的随机即可。按照这个思路优化,我们得出了核心链路P0共68个case。
(二)预发环境混合场景测试
KFX 不是只有一个服务而是多个服务,每次上线的时候 会经历 “新A旧B”的过渡状态,然后才到“新A新B” 的过程, 其中的过渡态也是非常重要的,往往可能会暴露出各种兼容性问题,因此我们在 e2e的链路上也考虑了这种场景,来做混合测试。如下图所示:
(三)复合链路交叉测试
单条链路的稳定并不能保证整个系统的链路稳定,因为应用是有状态的,链路之间是存在耦合的,上面说的H5容灾域名未替换故障里,就是因为 KFC发布 + 平台回滚导致的问题。因此我们做了链路间的交叉测试,比如对于 流水线发布+默认策略+版本变更的case, 跑完后在此基础上执行 平台发布+默认策略+版本回滚,之后可以再随机其他的场景case,通过这样的方式来验证链路间可能的耦合情况。
实际情况
2023年冬,KFX平台做了kfx-api 架构精简化, 建设了自动化e2e、全链路日志、多集群维度监控等核心功能,保障了服务的稳定性。集群数6个,应用数超过1400+,主要覆盖10多个部门。
2.3 高速公路
高速公路比起马路,跑的车又多又快,但是逃不掉的是维护成本
面临的问题
经过一年的稳定性建设,到24年,KFX已经逐步建设成为稳定的公路了,同时朝着高速公路的方向努力。高速公路的特质是高并发、稳定,同时并发量越大,车越多,维护成本就越高,因此有效的控制和降低维护成本也是一个重要的方向。想要建设成为高速公路,做到像高速公路一样又多又稳的跑车,KFX还需要从下面几个方向做能力扩展,总结来看就是以扩为主要方向,以稳和控为约束方向:
【扩】高吞吐量:支持更多的部署场景,支持更大的并发能力。
【稳】稳定性赋能:除了系统本身的稳定性,作为部署域的解决方案,有责任为业务提供稳定性保障。
【控】运维成本降低:在扩张的前提下,维护成本不能线性增加,我们希望整个系统能够稳定又低成本的运行。
解决方案
这一阶段我们的核心工作是 “扩”:扩宽部署域更多的场景,横向上扩宽部署能力,能支持除静态部署之外的应用,在纵向上,扩展支持线下环境部署,建设更快更好用的测试环境部署方案。
多场景建设(扩)
实施背景:
①测试环境标准化部署
KFX的静态部署在线上环境的建设,到今天为止已经相对成熟了。但直接将线上环境的方案迁移到测试环境使用,则还是会出现诸多问题,线上环境第一要素是“稳”,测试环境第一要素是“快”。
-
测试环境需要支持快速发布、预览、测试, 直接使用线上的流程会让测试环境变得效率不那么高。
-
测试环境有高频率/高并发/并行的特征。
-
测试环境会复用代理服务,甚至有直接使用mock代理后端服务的场景,比如白屏检测、性能检测。
②SSR场景、node场景扩展
目前SSR在公司还没有一套完善的配套设施,来提供整个从部署、运行到维护链路的解决方案。通常的方案是直接使用容器云,当作一般的api服务部署,然而api容器部署方案并没有特殊适配SSR的场景,会存在以下问题:
-
部署成本高:直接使用容器云, 部署、上线、运维成本相对于CSR静态部署陡然提升,
-
场景功能缺失:灰度,白名单,CDN 降级功能需要单独开发
具体方案:
我们通过 LED 与 KFX 结合,提供了测试环境部署域整体的解决方案:即域名 + 代理 + 路由 + 部署 + 运行环境。
核心功能:
-
一键部署:结合Gundam 工程生态,触发流水线后能自动分配可访问域名并部署可用环境, 完成创建工程后即可部署一个稳定的测试环境。
-
配置化生成代理:由于项目的代理是跨分支复用的,因此可以在工程中以配置的方式进行维护,在流水线执行部署时会根据代理配置自动生成相应域名下的代理。
-
自动化泳道模式:根据插件配置可以切换 主干部署和泳道部署能力, 在泳道模式下,会自动根据分支来设置泳道,同时分配泛域名。此时通过泛域名访问无需注入泳道,方便快速分享。
业务稳定赋能(稳)
实施背景:
KFX 最开始以策略模式作为交互方式,策略模式的功能扩展性更强,能适配更多的场景,但很多的用户都不得不去理解“部署一个默认/灰度策略”是什么意思,为什么一次灰度发布到推全的过程要去上线好几次(发布几个灰度策略,再删除灰度策略,再发布默认策略) 。比起常规的上线单流程,策略模式显得不那么容易理解。
具体方案:
因此,伴随着工程标准化的建设,我们跟商业化一起共建了分级发布的上线模式,并作为标准的能力落地到KFC的插件中。
运维成本降低(控)
智能oncall 接入:
oncall问题一直都是基建工具躲不掉的工作,除了一部分是能从反馈中转化需求做改进之外,更多咨询类的问题只是纯纯的体力工作。
-
紧跟时代的浪潮,kfx 也拥抱ai 智能oncall。在24年Q3,我们接入了koncall服务,上线了KFX AI小助手,结合kfx的实际情况对AI的回答质量不断优化调整。
报警治理:
除用户oncall之外,另一个繁重的问题就是报警oncall,我们每天面临着下面诸多的报警。报警治理主要从两个方向出发,首先识别是否是有效报警。
-
对于有效报警深入分析原因并尽量从根本上解决:
-
mysql连接偶发超时异常,通过数据库从代理改为数据源发现+直连的模式
-
优化实例退出流程,减少服务请求失败的概率
-
优化 dns 逻辑,防止 dns 丢包阻塞进程,导致进程 oom
-
对于无效报警,通过动态调整阈值、调整等级、报警去重等方案转化为有效报警。
从之前周峰值1000+报警,降低到周均50以内。
非活跃服务治理:
kfx服务上托管的应用随着时间在不断增长,过多的应用会拖慢服务的启动速度,因此需要对长期无流量的应用进行识别并下线。
-
建立 KFX 项目数量管控,常态化项目退出机制
-
处理下线项目数量 469 个,占直接托管项目数量 51%
实际情况
2024年冬,KFX平台支持分级部署,支持 api 代理优先模式。集群数7个,应用数超过6000+,主要覆盖30+个部门。
三、总结与反思
从22年开始,KFX从崎岖土路 一步步走到平坦高速,下面列出了三个阶段的演化。
KFX的发展历程总体来看是按照渐进式演进的方式发展,在规模化的现状下秉承着稳定性优先的策略,并结合标准化和自动化,朝着降低运维成本和提高系统维护性和观测性的方向做功。
展望未来,KFX将继续持续演进,以“扩、稳、控”为核心方向,不断优化架构,提升系统稳定性和运维效率,致力于建设更加智能、高效、稳定的服务平台,打造一条真正的“高速公路”,让业务在更快、更稳、更智能的道路上前行。
相关文章:
快手前端通用静态托管服务KFX演进历程:从崎岖土路到平坦高速
快手静态部署托管服务(KFX)历经四年发展,经历了三个阶段,一步步从勉强能行车的“崎岖土路”到现在多车道并行的“平坦高速”,这一转变极大地提升了资源利用率和效率,满足业务的实际需要。本文将带你了解其背…...
hackmyvm-buster
题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…...
React加TypeScript最新部署完整版
React TypeScript 全流程部署指南 一、环境准备与项目初始化 关于node.js及npm的安装请参见我的文章。 1.1 创建项目(React TypeScript) # 使用官方推荐脚手架(Vite 5.x) npx create-vitelatest my-app --template react-ts …...
DeepSeek-R1-Zero:基于基础模型的强化学习
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…...
python的列表和元组别再傻傻分不清啦
目录 什么是下标: 正数索引:正数索引从左到右,从 0 开始。 负数索引:负数索引从右到左,从 -1 开始。 切片(slice):除了单个元素,Python还支持通过切片访问序列的子集。…...
Fiddler在Windows下抓包Https
文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量(可选)解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下,Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密: 1…...
【超详细】神经网络的可视化解释
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
LVS+Keepalived 高可用集群搭建
一、高可用集群: 1.什么是高可用集群: 高可用集群(High Availability Cluster)是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响…...
使用git管理uniapp项目
1.本地管理 1. 在项目根目录中新建 .gitignore 忽略文件,并配置如下: # 忽略 node_modules 目录 /node_modules /unpackage/dist 2. 打开终端,切换到项目根目录中,运行如下的命令,初始化本地 Git 仓库࿱…...
回调函数的用法
回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数,接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性,下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...
样式垂直居中,谁才是王者
样式垂直居中,谁才是王者 面试官 常问如何让元素垂直居中,这其实是个经典的前端问题。 实现垂直居中的方法多种多样,从传统的表格布局到现代的Flexbox、Grid布局,再到绝对定位配合transform,甚至是line-height技巧&am…...
五、Three.js顶点UV坐标、纹理贴图
一部分来自1. 创建纹理贴图 | Three.js中文网 ,一部分是自己的总结。 一、创建纹理贴图 注意:把一张图片贴在模型上就是纹理贴图 1、纹理加载器TextureLoader 注意:将图片加载到加载器中 通过纹理贴图加载器TextureLoader的load()方法加…...
Linux Kernel Connection Tracking Table
在 Linux 内核中,连接跟踪表(Connection Tracking Table,简称 conntrack)是一个用于跟踪网络连接状态的核心组件。它主要由 Netfilter 框架管理,广泛应用于防火墙、NAT(网络地址转换)和负载均衡…...
NavVis VLX三维扫描:高层建筑数字化的革新力量【沪敖3D】
在三维激光扫描领域,楼梯结构因其复杂的空间形态和连续垂直移动的实际需求,一直是技术难点之一。利用NavVis VLX穿戴式移动扫描系统成功完成一栋34层建筑的高效扫描,其中楼梯部分的数据一遍成形且无任何分层或形变。本文将深入分析该项目的技…...
JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
生产问题定位指南:几款必备的可视化工具 引言 在上一篇文章中,详细的介绍了JDK自带的一系列命令行工具,,如jps、jmap、jstat、jstack以及jcmd等,这些工具为排查和诊断Java虚拟机(JVM)问题提供…...
【深入理解JWT】从认证授权到网关安全
最近的项目学习中,在进行登陆模块的用户信息验证这一部分又用到了JWT的一些概念和相关知识,特在此写了这篇文章、方便各位笔者理解JWT相关概念 目录 先来理解JWT是什么? 区分有状态认证和无状态认证 有状态认证 VS 无状态认证 JWT令牌的…...
esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法
最近上手了正点原子esp32s3板子,环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试,每次都报这个错误无法建造。也不是网上说的ninja error,不是中文路径的问题。 在终端中查看,发现是缺少了git。(我这里没有…...
基于MATLAB红外弱小目标检测MPCM算法复现
摘要:本文详细介绍了一种基于人类视觉系统特性的红外弱小目标检测算法——Multiscale patch-based contrast measure (MPCM)。该算法通过增强目标与背景的对比度,有效检测红外图像中的弱小目标,并在MATLAB环境中进行了复现与实验验证。 关键…...
java基础面试篇
目录 1.概念 1.1说一下Java的特点 1.2Java为什么是跨平台的? 1.3 JVM、JDK、JRE三者关系? 1.4为什么Java解释和编译都有? 1.5 jvm是什么? 1.6 编译型语言和解释型语言的区别? 1.7 Python和Java区别是什么&#…...
Java Map实现类面试题
Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么? HashMap基于哈希表实现,使用数组链表红黑树(Java 8)的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…...
Vue2+Three.js加载并展示一个三维模型(提供Gitee源码)
目录 一、案例截图 二、安装Three.js 三、代码实现 四、Gitee源码 一、案例截图 二、安装Three.js npm install three 三、代码实现 模型资源我是放在public文件夹下面的: 完整代码: <template><div><div ref"container&qu…...
Spark内存并行计算框架
spark核心概念 spark集群架构 spark集群安装部署 spark-shell的使用 通过IDEA开发spark程序 1. Spark是什么 Apache Spark™ is a unified analytics engine for large-scale data processingspark是针对于大规模数据处理的统一分析引擎 spark是在Hadoop基础上的改进&…...
DeepSeek等LLM对网络安全行业的影响
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
【QT】QLinearGradient 线性渐变类简单使用教程
目录 0.简介 1)qtDesigner中 2)实际执行 1.功能详述 3.举一反三的样式 0.简介 QLinearGradient 是 Qt 框架中的一个类,用于定义线性渐变效果(通过样式表设置)。它可以用来填充形状、背景或其他图形元素࿰…...
可狱可囚的爬虫系列课程 15:防盗链反爬虫的处理
一、防盗链了解 防盗链是一种技术手段,主要用于防止其他网站通过直接链接的方式使用本网站的资源(如图片、文件等),从而节省带宽和服务器资源。当其他网站尝试直接链接到受保护的资源时,服务器会根据设置的规则判断请求…...
Vue组件:从使用到原理的深度解析
一、什么是Vue组件? 组件是Vue的核心特性之一,它允许开发者将UI拆分为独立可复用的代码片段。每个组件本质上是一个Vue实例,具有自己的: 模板(Template) 数据(Data) 方法…...
SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试
文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 index.html 三、页面调试3.1 参数提示3.2 开始请求3.3 手动断开 前言 作为一个Java程序员,了解前沿科技技术ÿ…...
Lua的table(表)
Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…...
图片爬取案例
修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…...
【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
idea + Docker + 阿里镜像服务打包部署
一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…...
C#模拟退火算法
模拟退火算法:寻找最优解的神奇 “退火之旅” 在生活中,我们都见过铁匠打铁。铁匠把烧得通红的铁块不断捶打,然后慢慢冷却,这样打造出来的金属制品才更坚固耐用。模拟退火算法就从这个退火过程中获得灵感,在计算机的数…...
网络安全防御模型
目录 6.1 网络防御概述 一、网络防御的意义 二、被动防御技术和主动防御技术 三、网络安全 纵深防御体系 四、主要防御技术 6.2 防火墙基础 一、防火墙的基本概念 二、防火墙的位置 1.防火墙的物理位置 2.防火墙的逻辑位置 3. 防火墙的不足 三、防火墙技术类型 四…...
APP自动化实战
APP自动化能做什么? 请看示例(实现批量的视频,封面功能复用能力(实现效果参考抖音号:71403700901) APP自动化实战-操作剪映APP PO模式 1. PO模式介绍 PO(Page Object)…...
Unity基础——资源导入
一.资源来源 1.Assert Store(Unity资源官方网站) (1)用于制作游戏的优质资源 | Unity Asset Store (2)或则通过Unity项目打开 2.外部资源 (1)淘宝 (2)找外…...
JMeter性能问题
性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…...
形式化数学编程在AI医疗中的探索路径分析
一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...
DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…...
nginx 配置https
参考文档:nginx 文档 -- nginx官网|nginx下载安装|nginx配置|nginx教程 配置 HTTPS 服务器 HTTPS 服务器优化 SSL 证书链 单个 HTTP/HTTPS 服务器 基于名称的 HTTPS 服务器 具有多个名称 的 SSL 证书 服务器名称指示 兼容性 要配置 HTTPS 服务器,ssl…...
GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用
GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用 目录 GhostBottleneck; InvertedResidual;Squeeze and Excite 是什么,怎么用GhostBottleneckInvertedResidualSqueeze and Excite(SE)GhostBottleneck 概念: GhostBottleneck 是在轻量级神经网…...
Docker启动ES容器打包本地镜像
文章目录 1、安装 Docker2、下载镜像3、查看已下载的镜像4、 保存和加载镜像5、.tar 文件与 Docker 镜像的关系6、如何从 .tar 文件加载 Docker 镜像7、为什么需要 .tar 文件?8、ES 8.x版本无法启动8.1 问题原因8.2 解决方案8.3 提交容器为新镜像 1、安装 Docker 如…...
XXE漏洞:原理、危害与修复方法详解
目录 一、XXE漏洞概述二、XXE漏洞原理三、XXE漏洞危害1. 任意文件读取2. 命令执行3. 拒绝服务攻击(DoS)4. SSRF攻击四、XXE漏洞修复方法1. 禁用外部实体JavaPythonPHP2. 输入验证和过滤3. 安全配置服务器4. 升级解析器版本五、总结一、XXE漏洞概述 XXE(XML External Entity…...
android keystore源码分析
架构 Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元,以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库,密钥库服务使用它来提供由硬件支持的加密服…...
状态模式
状态(State)模式属于行为型模式的一种。 状态模式允许对象在其内部状态改变时改变其行为,使其看上去就像改变了自身所属的类一样。 状态模式是为了把一大串if...else...的逻辑给分拆到不同的状态类中,使得将来增加状态比较容易。…...
C++ | 面向对象 | 类
👻类 👾语法格式 class className{Access specifiers: // 访问权限DataType variable; // 变量returnType functions() { } // 方法 };👾访问权限 class className {public:// 公有成员protected:// 受保护成员private:// 私有成员 }…...
鸿蒙-AVPlayer
compileVersion 5.0.2(14) 音频播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…...
Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)
一、下载安装 1.Android Studio3.5.2下载地址:Android Studio3.5.2下载地址 其他版本下载地址:其他版本下载地址 2.安装教程(可以多找几个看看) 安装 | 手把手教你Android studio 3.5.2安装(安装教程)_a…...
从.m3u8到.mp4:使用批处理脚本完成视频处理的完整指南
这里介绍一个Windows批处理脚本(Windows Batch Script),主要用于处理 .m3u8 ts 视频文件的下载和合并功能。 以下是程序的主要功能和逻辑流程: 功能概述 参数检查与路径处理: 检查是否传递了文件或文件夹路径作为参数…...
qt5的中文乱码问题,QString、QStringLiteral 为 UTF-16 编码
qt5的中文乱码问题一直没有很明确的处理方案。 今天处理进程间通信时,也遇到了qt5乱码问题,一边是设置的GBK,一边设置的是UTF8,单向通信约定采用UTF8。 发送端保证发的是UTF8字符串,因为UTF8在网络数据包中没有字节序…...
Gurobi 并行计算的一些问题
最近尝试用 gurobi 进行并行计算,即同时用多个 cpu 核计算 gurobi 的 model,但是发现了不少问题。总体来看,gurobi 对并行计算的支持并不是那么好。 gurobi 官方对于并行计算的使用在这个网址,并有下面的大致代码: i…...