最新要闻
- 中国西北地区发现广泛分布的侏罗纪被子植物化石
- 3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
- 环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
- 世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
- 当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
- 天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
- 【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
- 真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
- 当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
- 当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
- 世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
- 世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
- 今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
- 环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移
- 最新消息:史上最强骁龙7系 真我GT Neo5 SE跑分过百万:16+1TB存储确认
- 今日关注:Alphaliner:2月底港口停运船比率达6.4% 增至去年同期3倍
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
作者:明昼
(相关资料图)
前言
Kruise Rollout是 OpenKruise 社区开源提出的一个渐进式交付框架。其设计理念是提供一组能够将流量发布与实例灰度相结合,支持金丝雀、蓝绿、A/B Testing等多样化发布形式,以及支持基于 Prometheus Metrics 等自定义 Metrics 实现发布过程自动化,无感对接、易扩展的旁路式标准 Kubernetes 发布组件。
https://github.com/openkruise/rollouts
在最新发布的 Kruise Rollout 0.3.0 版本中,我们为大家带来了几个非常有趣的新特性:一是针对 Kubernetes 社区应用最为广泛的 Deployment 工作负载的发布能力进行了重磅增强;二是对流量灰度能力进行了进一步扩展;三是支持以插入 Lua 脚本的方式来支持更多网关协议的扩展:
- Deployment 分批发布:Deployment 能够像 StatefulSet 或 CloneSet 一样具有分批发布 Pod 的能力。
- 基于 Header&Cookie 南北向流量灰度:允许用户在发布时对七层流量按照 Header&Cookie 匹配规则进行划分,并将不同流量群体导入不同版本实例,以便对新特性进行 A/B Testing 或进行更细粒度的流量调度。
- 基于 Lua 脚本的 Ingress 流量扩展:允许用户以配置 Lua 脚本的方式,为更多类型的流量组件制定 Kruise Rollout 插件,支持更多类型的 Ingress 扩展协议。
概念说明
在介绍新特性之前,让我们先一起梳理一下目前 Kubernetes 工作负载主流的发布形式:
- 滚动升级:原生 Deployment 自带的主流发布模式,流式滚动升级,无法设置卡点。
- 优势:发布效率高;
- 劣势:爆炸半径大,容易出现大规模发布故障。
- 金丝雀发布:Flagger 和 Kruise Rollout 等组件都支持的一种针对 Deployment 的发布模式,在发布时会创建一个金丝雀版本的 Deployment 进行验证,当验证通过后,再进行全量的工作负载升级,并删除金丝雀版本的 Deployment。
- 优势:回滚无需重建或重新发布 Pod,所以回滚非常快速和方便;
- 劣势:发布时需要额外的资源消耗,并且需要重复发布新版本 Pod,发布时不能完全兼容 HPA。
图 1:金丝雀发布方式
- 标准分批发布:借助类似 StatefulSet 或 CloneSet 提供的 Partition 能力完成的标准形式的分批发布,发布时始终保持原工作负载名称等元属性不变,并且不会裂变出其他工作负载。
- 优势:发布不浪费资源,可控制爆炸半径,可完全兼容 HPA 等需要 Ref 工作负载的其他组件;
- 劣势:Deployment 很难支持此类型发布(目前仅知 Kruise Rollout 支持 Deployment 进行此类型发布)。
图 2:标准分批发布方式
非标准分批发布:由于 Deployment 原生逻辑无法支持分批能力,所以像 KubeVela 等社区提出的 Rollout 方案,使用的是两个 Deployment 滚动的形式进行发布。每次发布时都会创建新的 Deployment,并且对 Deployment 扩容的同时,缩容旧的 Deployment,相当于每次发布完成后 Deployment 都会被替换。
- 优势:发布时不需要额外资源,可控制爆炸半径;
- 劣势:发布时会裂变多个工作负载导致缺少统一控制平面,容易造成发布和扩缩动作相冲突,难以兼容 HPA 等场景,容易造成发布卡单。
图 3:非标准分批发布方式
- A/B Testing:按照一定的规则将用户流量切分成 A、B 两个不相交通路,并将导入不同版本的 Pod 实例进行处理,以此来更好地观察、对比或者灰度新版本能力。一般来说,A/B Testing 需要结合金丝雀发布或分批发布进行。
图 4:A/B Testing
方案对比
对于上述发布形式,除了 Deployment 自带的滚动升级“一把梭”的方式不需要依靠其他三方组件之外,其余发布方式或多或少都需要依靠其他组件或上层 PaaS 平台的能力支持。那么 Kruise Rollout 作为其中的一种解决方案,与其他方案相比,又有何优缺点?下面我们比较了开源社区目前相对较为流行的两种解决方案:Flux 社区提出的**Flagger [1]**,以及 Argo 社区提出的Argo-Rollout[2]:
总的来说,Kruise-Rollout 的优势可以总结为以下几点:
- 灵活性:具备旁路式可插拔能力,即,当用户下发 Kruise Rollout 配置后,对应的 Deployment 会立刻具有标准分批发布的能力;当用户不在需要该能力时,可随时删除 Kruise Rollout 配置(甚至在发布过程中也可以删除),Deployment 立刻会恢复至原生滚动发布行为。
- 兼容性:完美兼容 HPA 或其他需要 Ref Workload 的三方组件;
- 接入简便:由于 Kruise Rollout 极具灵活性,用户只需要下发配置即可生效,用户无需做任何 Pod 或 Workload 的迁移工作,对存量运行时容器无影响,不影响扩缩容链路,故接入相对十分简便。
特性介绍
在介绍新特性之前,再啰嗦一下为什么 OpenKruise 社区要执着于做 Rollout 这件事情。
- 我们知道在 Kubernetes 中,容器生命周期与流量生命周期异步管理的设计使得 Deployment 本身无法感知流量的挂载与卸载,我们曾遇到某客户在一次 Deployment 流式滚动升级过程中,流量组件出现异常,导致流量全部挂空的事故,虽然只有短短十几分钟,但却也造成了非常大的损失。
- 业务逻辑导致的 Bug 在 Deployment 流式滚动更新的发布阶段无法感知,一旦全量上线后,可能会造成严重故障,很难控制故障的爆炸半径(因为 Deployment 滚动升级只要 Pod 可用就会全量发布)。
- 我们也经常遇到在测试环境中跑的好好的,为什么到了生产却不行了之类的问题。其实只靠环境隔离解决不了所有问题,生产发布环境最好还是不要升级“一把梭哈”,循序渐进才能“一步一个脚印”。
上述场景如果使用分批的发布形式,其实是可以尽可能地将问题的爆炸半径控制在灰度范围之内,并且可以留下充足的灰度和观察的时间。然而,Deployment 原生逻辑并不支持分批操作,但如果使用 Argo-Rollout,还需要把所有工作负载和 Pod 进行迁移,风险太高,而且适配也太麻烦;如果使用 Flagger,仍然要迁移 Pod,并且发布时候还需要双倍资源,代价也太高。
这时候,你需要的可能是 Kruise-Rollout !仅需两步,就可以让你的存量 Deployment 立刻具备标准分批发布能力!
新特性一:教你玩转 Deployment 标准分批发布
前置步骤
存量或新建 Kubernetes 集群并要求:
- Kubernetes version >= 1.19
注:该版本要求主要是 Ingress API 在 1.19 有较大变动所引起,如果你不需要复杂的流量灰度的能力(即不需要配置 TrafficRouting 字段),可以自行拉取和修改 charts,来规避该版本要求。
步骤一:一键安装 Kruise-Rollout
$ helm install kruise-rollout openkruise/kruise-rollout --version 0.3.0
步骤二:为你的 Deployment 绑定并下发分批发布规则
cat <
步骤三:玩转 Deployment 的分批发布
如此一来,当你后续进行发布时,Deployment 的流式滚动升级将会直接变为分批发布。下面我们以一个名为 echoserver 的 Deployment 为例,描述一次分批发布过程。
1. 发布前
检查一下 Deployment 副本数为 5,当前版本为 789b88f977:
2. 开始发布第一批
此时,我们修改容器的某个环境变量来触发发布,可以看到第一批只发布了一个 Pod,版本号为 d8db56c5b:
3. 继续发布第二批
第一批 Pod 发布完毕后,此时假设我们已经完成第一批的验证,想要继续发第二批 Pod,我们可以借助 kubectl-kruise 这个命令行工具来进行批次完成的确认操作。该工具是基于 kubectl 的拓展,目前也是由 OpenKruise 社区维护。
注:确认发下一批的命令为 kubectl-kruise rollout approve rollout/rollouts-demo
从上述过程可以看出,在该批次发布过程中且未完成时,Rollout 会进入 StepUpgrade 状态,而当该批次发布完成,会转变成 StepPaused 状态。
4. 发布最后一批
当第二批发布确认完成后,发最后一批后,Rollout 会进入 Completed 状态,表示发布完成:
特别要说明的是,在分批发布的单个发布批次内,我们仍然会遵循流式滚动发布的规则,也就是说你仍然可以通过调整 Deployment 的MaxUnavailable和MaxSurge来兼顾你发布时的稳定性和效率,例如在以下场景,你依然可以遵循 Deployment 的如下配置:
- 单个批次内必须先扩后缩,最大程度保证发布稳定:
kind: Deploymentspec: strategy: rollingUpdate: maxUnavailble: 0 maxSurge: 20%
- 单个批次内必须先缩后扩,最大程度节省资源占用:
kind: Deploymentspec: strategy: rollingUpdate: maxUnavailble: 20% maxSurge: 0
- 单个批次内边扩遍缩,最大程度提高发布效率:
kind: Deploymentspec: strategy: rollingUpdate: maxUnavailble: 25% maxSurge: 25%
此外,该方案还充分考虑了各种发布场景,最大程度地提高方案的灵活性:
- 连续发布场景:v1 到 v2 的发布过程中(v2 未发布完成),又发布了 v3,此时 v3 仍然会从第一批开始走标准分批发布流程;
- 快速回滚场景:v1 到 v2 发布到中途,回滚回 v1,则会进行快速回滚,默认不再进行分批发布。
- 发布策略删除:无论是在发布完成后,甚至是在发布过程中,正常删除 Rollout 资源后,相应的 Deployment 都会无缝回退至流式滚动发布场景,方便某些特殊情况下快速进行变更。
新特性二:基于 Header&Cookie 的流量灰度
在 Kruise-Rollout 0.3.0 之前的版本中,我们提供了基于调整流量权重 (Weight) 的流量灰度方案,但是考虑到在实际大多数场景中,各类 Ingress 等本身已经具备的载均衡能力就能满足日常流量灰度的需求,例如 10% 的 canary 副本本身就会默认打入 10% 的流量,如果不是特殊的精细化流量调整场景( 例如 10% 的 canary 副本只导入 1% 流量),一般不需要单独配置该能力。
但是,对于一些发布敏感性业务,是可能需要 A/B Test 等这类特殊的发布形式:即在发布时,需先将特定的一批带有标记的流量,定向导入新版本 Pod,将新旧版本的流量进行隔离,比如如下场景:
- 业务新特性只对白名单用户开放,可以很大程度减少业务新特性的不确定性带来的风险;
- 将新旧两个版本进行流量隔离,方便进行对照实验,更好地观察新版本特性的有效性;
对于 Kruise-Rollout 的用户来说,可以通过以下配置来开启该能力:
apiVersion: rollouts.kruise.io/v1alpha1kind: Rolloutmetadata: name: rollouts-demo namespace: default annotations: rollouts.kruise.io/rolling-style: partitionspec: objectRef: workloadRef: apiVersion: apps/v1 kind: Deployment name: echoserver strategy: canary: steps: - matches: #设置 header&cookie 匹配规则 - headers: - name: UserAgent type: Exact value: iOS pause: {} replicas: 1 - replicas: 50% - replicas: 100% trafficRoutings: - ingress: classType: nginx name: echoserver service: echoserver
上述相较于单纯的分批发布配置,多了 Header & Cookie 匹配规则的描述,以及 TrafficRouting 的引用,这里是以 Ingress-Nginx 为例进行的配置,也就是说,想要使用该能力,相应的 Ingress 控制器必须要具备该基础能力(可以理解为 Nginx 提供数据面的能力,Kruise-Rollout 提供管控面的能力)。
在该配置下,假设有副本数量为 10 的 Deployment,则其将被划分为三批进行发布,具体行为如下:
- 第一批共计有 1 个新版本 Pod,9 个旧版本Pod, 并且指定满足 UserAgent=iOS 这一匹配规则的用户流量才会打入新版本 Pod,其余流量会均匀打入剩余 9 个旧版本 Pod;
- 第二批共计有 5 个新版本 Pod,5 个旧版本Pod,并且取消流量匹配规则,流量直接全部走负载均衡策略;
- 第三批共计有 10个新版本 Pod,0 个旧版本Pod,并且取消流量匹配规则,流量直接全部走负载均衡策略;
新特性三:基于Lua脚本的Ingress流量扩展方案
云原生技术发展到今天,云原生网关也呈现出百花齐放的状态,除了 Kubernetes 原生提供的 Nginx Ingress 以及 Gateway API之外,也存在着非常多的 Network Provider 方案,比如阿里云 ALB、MSE、ASM;社区的 Istio、Kong、Apisix ,甚至是许多公司是自研网关方案和协议等等。Kruise Rollout 设计之初就考虑过百花齐放的云原生网关应该如何支持,常规的硬编码的方式既费时费力,也不方便不同公司的同学对接使用和维护。
最终,Kruise Rollout 选择基于Lua脚本的方式,让用户以插件化的形式支持更多类型的网关协议(此版本只支持基于 Ingress 的扩展协议,其它自定义资源协议将在下个版本支持),Kruise Rollout 完成一些通用部分的能力,而不同 NetWork Provider 的具体实现则由 Lua 脚本来解决,这样针对不同的实现,只需要编写对应的 Lua 脚本即可,可参考:**Nginx与Alb Lua脚本示例 [3]**。为了方便大家根据自己的需求编写自己的Lua脚本,下面针对 Nginx Ingress 解读一下lua脚本(对应的 Rollout 配置可以参考 新特性二),该脚本可以放置于特定目录或特定ConfigMap:
-- 因为 Ingress 灰度发布协议都是基于 Annotations 来实现的,所以此脚本的所有操作-- 都是修改 Annotations 到目标状态,kruise rollout会将此 annotations patch 到-- ingress canary 资源当中annotations = {}-- obj.annotations 是Ingress.Annotations 此句不需要变化,固定即可if ( obj.annotations )then annotations = obj.annotationsend-- 这是 nginx 灰度发布协议的标准,其它的实现也可以根据自己的实际情况调整annotations["nginx.ingress.kubernetes.io/canary"] = "true"-- nginx 的灰度发布协议变化主要是下面这些变化,为了简化多个批次间来回切换的复杂度,每次-- 都先将这些 annotations 置空annotations["nginx.ingress.kubernetes.io/canary-by-cookie"] = nilannotations["nginx.ingress.kubernetes.io/canary-by-header"] = nilannotations["nginx.ingress.kubernetes.io/canary-by-header-pattern"] = nilannotations["nginx.ingress.kubernetes.io/canary-by-header-value"] = nilannotations["nginx.ingress.kubernetes.io/canary-weight"] = nil-- obj.weight 是 rollout.spec.strategy.canary.steps[x].weight-- 代表当前批次的灰度百分比,当不设置时为 ‘-1’(lua脚本不支持nil,所以用‘-1’表示),-- 所以如果不是 ‘-1’,需要将 obj.weight 设置到 annotations 中if ( obj.weight ~= "-1" )then annotations["nginx.ingress.kubernetes.io/canary-weight"] = obj.weightend-- obj.matches 是 rollout.spec.strategy.canary.steps[x].matches(数据结构一样),-- 当没有设置时表明此step不需要进行 A/B Testing 发布,直接返回即可if ( not obj.matches )then return annotationsend-- A/B Testing发布,遍历 matches ,将 matches 设置到 annotations 中-- 注意:nginx 并不支持多个header,所以这里并不需要真正的遍历,默认只取第一个数组for _,match in ipairs(obj.matches) do -- 注意 lua 脚本当中数组是从下标 ‘1’ 开始 local header = match.headers[1] -- cookie if ( header.name == "canary-by-cookie" ) then annotations["nginx.ingress.kubernetes.io/canary-by-cookie"] = header.value -- header else annotations["nginx.ingress.kubernetes.io/canary-by-header"] = header.name -- 是否是“正则” if ( header.type == "RegularExpression" ) then annotations["nginx.ingress.kubernetes.io/canary-by-header-pattern"] = header.value else annotations["nginx.ingress.kubernetes.io/canary-by-header-value"] = header.value end endend-- must be return annotationsreturn annotations
注:此版本只针对 Ingress 资源来实现的,面对 Apisix、Kong 等其它自定义资源(CRD)将在下一个版本支持。**相关 PR [4]**已经提交 Github,欢迎大家一起讨论。
未来规划
- 更多网关协议支持:Kruise Rollout 目前是以 Lua 脚本插件化的方式支持多类型的网关协议,我们后续会重点加大这方面的投入,但面对百花齐放的协议类型,单靠社区 Maintainer 的单薄力量还远远不够,希望更多的社区小伙伴加入我们,一起来不断完善这方面的内容。
- 更完善的发布体系:为支撑包括灰度、告警、可观测、自动回滚、无人值守等在内的较为完整的发布体系,需要继续建设一些发布发布时的 Hook 调用与 Prometheus Metrics Analysis 等相关能力,这块我们目前正在与 KubeVela 社区紧密合作,通过 KubeVela 现有的 Workflow 体系集成来弥补目前这些能力的缺失,至于后续是否需要将这些能力做到 Kruise Rollout 之中,我们也希望聆听更多的社区意见,欢迎大家一块讨论沟通。
社区参与
非常欢迎你通过 Github/Slack/钉钉/微信 等方式加入我们来参与 OpenKruise 开源社区。你是否已经有一些希望与我们社区交流的内容呢?
可以在我们的**社区双周会 [5]**上分享你的声音,或通过以下渠道参与讨论:
- 加入社区**Slack channel [6]**(English)
- 加入社区钉钉群:搜索群号 23330762 (Chinese)
- 加入社区微信群(新):添加用户 openkruise 并让机器人拉你入群 (Chinese)
相关链接
[1]flagger
https://github.com/fluxcd/flagger
[2]Argo-Rollout
https://github.com/argoproj/argo-rollouts
[3] Nginx与Alb Lua脚本示例https://github.com/openkruise/rollouts/tree/master/lua_configuration/trafficrouting_ingress
[4] 相关 PR
https://github.com/openkruise/rollouts/pull/111
[5] 社区双周会
https://shimo.im/docs/gXqmeQOYBehZ4vqo
[6] Slack channel
https://kubernetes.slack.com/?redir=%2Farchives%2Fopenkruise
戳这里,查看 OpenKruise 项目官方主页与文档
关键词:
-
天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
在最新发布的KruiseRollout0 3 0版本中,我们为大家带来了几个非常有趣的新特性:一是针对Kubernetes...
来源: 天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
ThreadPool实现机制
焦点热议:nodejs处理嵌套对象的npm包:dot-prop
中国西北地区发现广泛分布的侏罗纪被子植物化石
3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
Geyser - Minecraft Server 基岩版与Java版互通教程
世界速讯:Rust 知识积累(5)
全球热文:CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点
环球今日讯!webrtc QOS笔记三 RTT计算,SRS增加XR
你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师
全球新资讯:国家药监局:2022年抽检11类化妆品20368批次产品 合格率97.60%
每日速看!【财经分析】投资收益拖累2022年券商业绩 投行业务景气度仍处于高位
【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
新资讯:火山引擎 VeDI 零售行业解决方案 聚焦精准营销场景提升品牌转化
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
JavaSE笔记之注解和反射(含案例代码)
当前速递!Android BLE 广播定制
环球报道:关于asp.net core filters生命周期的探究
今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移
最新消息:史上最强骁龙7系 真我GT Neo5 SE跑分过百万:16+1TB存储确认
世界今热点:孤立森林(IForest)代码实现及与PyOD对比
最资讯丨three.js加载环境贴图
天天热讯:java中同步和异步的区别
今日关注:Alphaliner:2月底港口停运船比率达6.4% 增至去年同期3倍
4月上映!《长空之王》新预告出炉:王一博驾驶歼20一飞冲天
世界今头条!自嗨锅自热煲仔饭4桶到手价32.8元:15分钟速烹美食
今年以来最强沙尘来袭!你的城市在下雨 他的城市在下泥
邓紫棋你把我灌醉高音最高是多少?邓紫棋你把我灌醉歌词
苏菲日记是什么?苏菲日记的读后感怎么写?
strict怎么读?strict的反义词是什么?
主题班会的开场白有什么要求?主题班会的开场白怎么写?
河南洛阳旅游景点排名前十名有哪些?河南洛阳美食排行榜前十名
当前简讯:一种基于实时大数据的图指标解决方案
【天天报资讯】智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)
来了解下GNOME 2 的 Linux 文件管理器 Caja
【状压DP】蒙德里安的梦想
【环球新要闻】害怕开车也不愁 小米汽车新专利:根据驾驶员匹配自动驾驶等级
前沿资讯!漫威《美国队长4:新世界秩序》开拍 片场首曝:“猎鹰”美队来了
每日热门:一语成谶!网传鬼火少年“三部曲”:片头壮行、片尾撞车
俄罗斯伏尔加汽车厂:中国汽车是新款拉达Vesta的主要对手
省钱神器!淘宝内测同款比价功能:最快本周上线
全球速看:记一次 rr 和硬件断点解决内存踩踏问题
天天新资讯:生核桃怎么变熟核桃_生核桃怎么弄熟
魅族20 PRO三款配色公布:绝美朝阳金吸睛
天天快消息!25日继续公测 暴雪承诺《暗黑4》会解决排队问题:服务器顶得住
环球精选!沙尘天气席卷!北京再现火星同款“蓝太阳” 专家揭秘
世界即时:开特斯拉回村被乡亲群嘲“大冤种” 30万买BBA不好吗?
今日热门!微信聊天记录不用头疼了:vivo宣布跨品牌换机数据迁移
基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)
MAC 最新中文版 FCPX 10.6.5 及相关插件下载安装教程 亲测有效
大数据计算引擎 EasyMR:拥抱开源,引领技术创新
当前聚焦:Java面试问题
解放生产力:30+实用AI工具汇总
全球今日讯!谷歌版ChatGPT开放测试:不会编程、不支持中文
全球聚焦:微软研究员质疑Bard数据集包括Gmail邮件:谷歌迅速澄清
2999元 小米米家对开门540L冰箱今晚开售:风冷无霜保鲜
120mg原生高钙 特仑苏纯牛奶3元/盒大促
天天最新:破解大难题!苹果新专利:佩戴太阳镜也可看清iPhone屏幕内容
【报资讯】vue3
世界视点!设计模式-index
精彩看点:商铺上月买卖91宗 涉21亿创半年高
热点评!平板电脑屏幕冷知识:高刷比高分辨率重要
焦点热讯:比尔·盖茨:GPT是1980年以来最革命性的技术进步
今日热讯:极氪009平均订单金额达52.7万元 一台订单收入相当于吉利卖5台
谷歌版ChatGPT Bard开启公测!CEO:肯定会出错、欢迎反馈
世界焦点!漫威《美队4》正式开拍 首曝片场路透:猎鹰美队就位
世界热议:Android性能优化-ListView自适应性能问题
读C#代码整洁之道笔记03_切面关注点、异常处理和线程与并发
当前时讯:放假一天不调休!2023清明节假期火车票今日开售
快资讯丨《霍格沃茨》在线人数锐减 “反恐同”人士冷嘲热讽
环球今日讯!《战争机器》电影确定编剧
世界聚焦:刚买1个月的特斯拉掉漆车主质疑非新车 售后:交付时没问题
热消息:公交司机急刹车致乘客死亡获刑 官方判定当时不需刹车:交通肇事罪
全球最资讯丨新车品鉴:2020广州车展探馆:广汽传祺EMPOWER
每日热闻!【看新股】10家拟上市银行“换道”注册制:利润普遍增长、资产质量分化、资本充足率承压
精选!iOS 17将支持第三方应用商店:看齐安卓
读Java性能权威指南(第2版)笔记24_ Java飞行记录器JFR
洗衣机6个月不清洗比马桶还脏?我麻了
时代的眼泪 25年历史的数码相机权威网站Dpreview关停
当前快报:Go 并发编程(二):锁、Select、Context、定时器
焦点报道:智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)
当前通讯!Servlet的基本使用
每日资讯:中国移动:命苦
天天速看:鹿客发布掌心锁V5:掌静脉+3D结构光刷脸解锁 3399元起
尼泊尔空难20天就查明原因?为什么东航事故还没有结果?
世界微资讯!腾讯四年磨一剑!结果 让大家看笑话了
OPPO Find X6 Pro:表演一场简单的光影魔术
亨迪药业(301211):3月21日北向资金减持66.63万股
世界最资讯丨uni-app云开发入门
当前资讯!WPF学习-布局