当前位置: 首页 > news >正文

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

金丝雀部署简介:

1、基本概念

金丝雀部署是一种软件开发中的渐进式发布策略,其核心思想是通过将新版本应用逐步发布给一小部分用户(即 “金丝雀” 用户),在真实环境中验证功能稳定性和性能表现,再逐步扩大发布范围,最终完成全量更新。
名称来源:源于煤矿工人用金丝雀检测瓦斯泄漏的做法 —— 通过观察少量样本的反应,提前发现潜在风险。

2、核心流程与特点
(一)核心流程
  1. 准备阶段
    • 同时运行 ** 旧版本(稳定版本)新版本(待发布版本)** 的应用服务。
    • 配置路由规则,将少量用户流量(如 5%)导向新版本,其余流量仍指向旧版本。
  2. 监控与验证
    • 实时监控新版本的性能指标(如响应时间、错误率、资源利用率)和用户反馈(如功能异常、界面问题)。
    • 若发现严重问题,立即将流量切回旧版本(回滚);若验证通过,逐步增加新版本流量(如 10%、20%……)。
  3. 全量发布
    • 当新版本通过所有验证且流量占比达到 100% 时,完成部署,下线旧版本服务。
(二)关键特点
优点缺点
1. 风险隔离:仅少量用户受潜在问题影响,降低故障波及范围。
2. 精准验证:在真实环境中验证功能,提前发现兼容性、性能等问题。
3. 灵活回滚:支持快速切换回旧版本,减少停机时间。
1. 复杂度高:需维护新旧版本并存的环境,增加部署和监控成本。
2. 流量分配难度大:需精确控制流量比例,避免因流量不均导致验证偏差。
3. 适用场景有限:不适合需要用户状态强一致的场景(如交易系统)。
3、适用场景
  1. 功能迭代验证:如前端界面优化、新功能试点,通过小范围用户反馈迭代改进。
  2. 性能测试:在生产环境中测试新版本对服务器、数据库的负载影响。
  3. 灰度发布:与 A/B 测试结合,向不同用户群体展示不同版本,对比效果后再全量发布。
  4. 微服务架构:在分布式系统中,对单个服务进行金丝雀部署,降低整体变更风险。

部署思路:

在生产上先进行少量更新如有10个v1.0的Pod正在稳定运行,此时设置一个滚动更新为v2.0, 更新之后立马停止更新,此时有11个Pod正在运行,此时如果用户访问正常那么就全量开启滚动更新,否则就进行回退。

一、金丝雀部署-打补丁升级步骤

在 Kubernetes 中,rollout resumerollout pause是用于控制 Deployment、StatefulSet 或 DaemonSet 滚动更新过程的两个重要命令。它们允许你暂停正在进行的更新,进行检查或修改,然后恢复更新过程,提供了对滚动更新的精细控制。

1、滚动更新概念:

(一)、rollout pause:暂停滚动更新

1. 基本功能
  • 暂停当前进行中的滚动更新,使 Deployment 停止创建或更新 Pod。
  • 保留已更新的 Pod,但不会继续更新剩余的 Pod。
  • 允许修改更新参数(如镜像版本、环境变量),而不会触发新的滚动更新。
2. 适用场景
  • 在更新过程中进行中间检查(如验证部分 Pod 的运行状态)。
  • 需要临时调整更新策略(如减慢更新速度)。
  • 在更新关键应用前,预留时间进行人工确认。
3. 示例命令

bash

kubectl rollout pause deployment/my-app
4. 注意事项
  • 暂停后,Deployment 的状态会显示为ProgressingPaused: true
  • 只有 Deployment 支持暂停 / 恢复操作, ReplicaSet 和 ReplicationController 不支持。

(二)、rollout resume:恢复滚动更新

1. 基本功能
  • 继续被暂停的滚动更新,按照最新的配置继续创建或更新 Pod。
  • 应用暂停期间的配置修改,但不会触发新的滚动更新版本。
2. 适用场景
  • 在中间检查完成后,继续更新过程。
  • 在调整更新参数(如maxSurgemaxUnavailable)后,恢复更新。
3. 示例命令

bash

kubectl rollout resume deployment/my-app
4. 注意事项
  • 恢复后,Deployment 会继续使用暂停时的滚动更新策略(如spec.strategy)。
  • 如果在暂停期间修改了不允许的字段(如selector),可能导致更新失败。

(三)、典型工作流程示例

场景:更新应用并验证中间状态
  1. 启动滚动更新

    bash

    kubectl set image deployment/my-app app=my-app:v2
    
  2. 暂停更新(例如,当 50% 的 Pod 更新完成时):

    bash

    kubectl rollout pause deployment/my-app
    
  3. 验证中间状态

    bash

    kubectl get pods  # 检查已更新Pod的运行状态
    kubectl describe deployment/my-app  # 查看Deployment状态
    
  4. 调整参数(可选):

    bash

    kubectl patch deployment/my-app -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1}}}}'
    
  5. 恢复更新

    bash

    kubectl rollout resume deployment/my-app
    

(四)、常见问题与注意事项

1. 暂停后资源占用
  • 暂停期间,旧版本和新版本的 Pod 可能同时存在,需确保集群有足够资源。
2. 状态查看
  • 使用以下命令查看暂停状态:

    bash

    kubectl get deployments.apps my-app -o jsonpath='{.status.conditions[?(@.type=="Progressing")].message}'
    

    输出示例:

    plaintext

    Deployment is paused and will not progress further until resumed
    
3. 版本控制
  • 暂停 / 恢复操作不会创建新的 Rollout 版本(revision),所有修改会应用到当前进行中的更新。
4. 超时处理
  • 如果更新长时间暂停,可能触发ProgressDeadlineExceeded条件,需通过kubectl rollout restart重启更新。

(五)、与其他 Rollout 命令的对比

命令功能描述
rollout pause暂停滚动更新,允许修改配置而不触发新的更新。
rollout resume恢复被暂停的滚动更新。
rollout status查看滚动更新的状态(是否完成、进度百分比)。
rollout history查看滚动更新的历史版本。
rollout undo回滚到上一个稳定版本或指定版本。
rollout restart重启 Deployment,触发新一轮滚动更新(常用于配置刷新)。

(六)、总结

rollout pauserollout resume为 Kubernetes 滚动更新提供了灵活的控制机制,特别适合需要精细验证或调整的生产环境。通过暂停更新,你可以在关键阶段进行人工干预,确保变更安全;通过恢复更新,你可以继续完成变更流程,实现平滑过渡。合理使用这两个命令,有助于提升集群稳定性和发布效率。

2、滚动更新实现步骤

步骤一:运行v1.0版本的pod

v1.0版本的yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-denamespace: delabels:app: nginx-de
spec:replicas: 3selector:matchExpressions:- key: appoperator: Invalues: [nginx-de]template:metadata:name: nginx-denamespace: delabels:app: nginx-despec:containers:- name: nginx-deimagePullPolicy: IfNotPresentimage: registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0ports:- containerPort: 80startupProbe:httpGet:path: /port: 80successThreshold: 1initialDelaySeconds: 15

步骤二:打补丁修改系统默认的更新策略

可用和不可用都是25%

修改更新策略:

#触发更新就停止滚动更新kubectl patch deploy nginx-de -n de  -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

 修改之后:变成了允许超出预期的Pod数量最大值为1个。

  1. maxSurge: 1
    此参数表明在滚动更新期间,允许超出预期 Pod 数量的最大值为 1 个。打个比方,要是预期的 Pod 数量设定为 3 个,那么在更新过程中,最多会有 4 个 Pod 同时运行。

  2. maxUnavailable: 0
    该参数意味着在滚动更新时,处于不可用状态的 Pod 数量上限为 0。也就是说,在更新期间,所有预期的 Pod 都必须保持可用状态。

步骤三 :执行v2.0版本镜像的更新

kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' && kubectl rollout pause deploy nginx-de  -n de

  • 在打补丁时出现异常处理情况:
情况一: 直接回退到上一个版本

此时想回退到上一个版本:

操作步骤一:执行回滚命令会出现报错

 kubectl rollout undo  deploy nginx-de -n de

此时执行报错rollout undo命令会报错,因为是暂停了滚动更新需要回退之前得开启被暂停掉的更新!!!

操作步骤二:按照提示操作

解决方法:

执行:


#步骤一:先执行被暂停的滚动更新,再执行回滚的动作
kubectl rollout resume deploy nginx-de -n de && kubectl rollout undo deploy nginx-de -n de#步骤二:查看回滚状态是否正常kubectl rollout status deploy nginx-de -n de

情况二:出现报错修改配置参数

上述出现拉取镜像错误的信息,那么我们现在要将正确的镜像信息配置

操作步骤一:先删除之前报错的pod

步骤二:先执行继续回滚的动作再执行修改镜像配置的动作再执行暂停滚动更新动作

#步骤一:删除失败的镜像信息kubectl delete pod  nginx-de-bbd87f74d-2s6d5 -n de#步骤二:执行更新镜像信息
kubectl rollout resume deploy nginx-de -n de && \
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' && \
kubectl rollout pause deploy nginx-de -n de#步骤三:验证
while true;do curl 10.96.62.230;done

步骤四:配置一个svc用于检测测试结果

apiVersion: v1
kind: Service
metadata:name: nginx-denamespace: de
spec:type: ClusterIPports:- port: 80targetPort: 80selector:app: nginx-de

金丝雀部署打补丁结果:

出现了4个Pod,其中1个为最新的v2.0版本,其他的为v1.0版本

测试:

[root@master deployment]# kubectl get svc -n de
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx-de   ClusterIP   10.96.62.230   <none>        80/TCP    3m49s
[root@master deployment]#
[root@master deployment]#
[root@master deployment]# while true;do curl 10.96.62.230;done

步骤五:操作异常回滚

情况一:灰度更新正常(继续开启滚动更新)

停止滚动更新目的是要看生产上有没有出现异常,如果没有异常再继续更新

继续滚动更新:

kubectl rollout resume deploy nginx-de -n de

测试更新结果:

情况二:灰度更新异常(回滚)

停止滚动更新目的是要看生产上有没有出现异常,如果有异常直接进行回滚操作

#回滚到上个版本
kubectl rollout undo deployment/nginx-de -n de

二、历史版本控制与规范

(一)、使用--record参数进行版本记录

1、--record参数使用方法
#执行yaml
kubectl apply -f  deployment.yaml --record#打补丁
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' --record#查看历史版本
kubectl rollout history deploy nginx-de -n de

2、使用--record参数记录版本号的弊端

注意:如果有一个在版本升级少加了--record,那么记录中会沿用上一个版本的的记录 这样容易在版本回退的时候造成误解。

如:

执行新的更新命令不带--record

#执行命令不带--record
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v1.0"}]}}}}'

(二)、自定义版本更新规范(适用于生产环境的版本控制)

1、操作步骤

 将要更新的yaml格式设置为:xx.yaml-年-月-日-姓名-版本,再对这个新的xx.yaml-年-月-日-姓名-版本进行yaml文件进行操作

如下:

cp deployment.yaml deployment.yaml-2025-05-13-yb-nginx:v2.0

 

kubectl apply -f  deployment.yaml-2025-05-13-yb-nginx\:v2.0 --record

 

(三)、配置deploy.spec.revisionHistoryLimit(保留多少版本的历史记录)

如果使用这种当时可用将etcd中的rs记录给去掉,这个就不会造成资源消耗了。

revisionHistoryLimit 参数配置保留多少版本的历史记录:

kubectl explain deploy.spec.revisionHistoryLimit

三、回滚到指定的版本信息

 1、查看版本的历史记录加--record参数

kubectl rollout history deployment/nginx-de -n de

2、添加--to-revision=0参数回退到指定版本

2.1、查看kubectl rollout undo参数
#查看回滚的参数
kubectl rollout undo --help

2.2、--to-revision回退到指定版本
命令格式:

kubectl rollout  undo --to-revision=版本编号

目前版本是v2.0,回退到v1.0

步骤一:查看v1.0对应的版本编号 
kubectl rollout history deploy nginx-de -n de

步骤二:根据查出来的版本编号回退到指定的版本
#查出来的v1.0对应的历史版本号为3
kubectl rollout undo deploy nginx-de -n de --to-revision=3

相关文章:

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

金丝雀部署简介&#xff1a; 1、基本概念 金丝雀部署是一种软件开发中的渐进式发布策略&#xff0c;其核心思想是通过将新版本应用逐步发布给一小部分用户&#xff08;即 “金丝雀” 用户&#xff09;&#xff0c;在真实环境中验证功能稳定性和性能表现&#xff0c;再逐步扩大发…...

基于matlab实现AUTOSAR软件开发---答疑6

最近有少朋友在咨询我关于模型生成A2L文件,之后在把elf文件的地址提取进去,生成最终的A2L的操作,这个其实可以看下mathwork的帮助文档,地址如下: https://www.mathworks.com/help/ecoder/ug/asap2-cdf-calibration.htmlhttps://www.mathworks.com/help/ecoder/ug/asap2-c…...

铜墙铁壁 - 服务网格的安全之道 (Istio 实例)

铜墙铁壁 - 服务网格的安全之道 (Istio 实例) 在微服务架构中,服务间的通信是频繁且复杂的。传统的安全模型常常假设内部网络是可信的,这在现代分布式系统和云原生(尤其是零信任)环境中是远远不够的。我们需要解决几个核心安全问题: 通信加密 (Encryption):如何确保服务 …...

计量——检验与代理变量

1.非嵌套模型的检验 1Davidson-Mackinnon test 判断哪个模型好 log&#xff08;y&#xff09;β0β1x1β2x2β3x3u log&#xff08;y&#xff09;β0β1log&#xff08;x1&#xff09;β2log&#xff08;x2&#xff09;β3log&#xff08;x3&#xff09;u 1.对log&#xff…...

【C++】解析C++面向对象三要素:封装、继承与多态实现机制

解析C面向对象三要素&#xff1a;封装、继承与多态实现机制 1. 面向对象设计基石2. 封装&#xff1a;数据守卫者2.1 访问控制实现2.2 封装优势 3. 继承&#xff1a;代码复用艺术3.1 继承的核心作用3.2 继承类型对比3.3 典型应用场景3.4 构造函数与析构函数处理3.4.1 构造顺序控…...

c语言 写一个五子棋

c语言 IsWin判赢 display 画棋盘 判断落子的坐标是否已有棋子 判断落子坐标范围是否超出范围 // 五子棋 #include <stdio.h> #include <stdlib.h>// 画棋盘 void display(char map[][10]) {system("clear");printf(" 0 1 2 3 4 5 6 7 8 9\n&…...

深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南

一、插件核心功能与应用场景 Continue 是一款专为 JetBrains IDE 设计的 AI 编程助手插件&#xff0c;基于大语言模型实现以下核心功能&#xff1a; 智能代码生成&#xff1a;支持根据自然语言描述生成完整方法、单元测试或设计模式&#xff08;如线程安全单例模式&#xff0…...

Node.js

本文来源 &#xff1a; 腾讯元宝 Node.js 是一个基于 ​​Chrome V8 引擎​​ 的 JavaScript 运行时环境&#xff0c;采用 ​​事件驱动​​ 和 ​​非阻塞 I/O​​ 模型&#xff0c;专为构建高性能、可扩展的网络应用而设计。以下是其核心特性和应用场景的总结&#xff1a; 1…...

idea经常卡顿解决办法

一&#xff1a;前言 &#xff08;1&#xff09;使用idea工具开发过久&#xff0c;出现卡顿&#xff0c;等待响应 二&#xff1a;原因 &#xff08;1&#xff09;给idea设置的运行内存过小&#xff0c;需要使用的内存超过设置的内存 &#xff08;2&#xff09;插件过多&…...

【python】字典:: a list of dictionaries

No, actions is not a dictionary. It’s a list of dictionaries. Each item in the list is a dictionary with three key-value pairs: “measure” (number), “resource” (string), and “reason” (string). Here’s the structure: actions is a list []Each element…...

高效电脑隐私信息清理实用工具

软件介绍 本文介绍的这款Privacy Eraser&#xff0c;它是一款电脑系统隐私清理工具。 功能介绍 这款工具能够清理电脑里的多种信息&#xff0c;比如最近文件、临时文件、注册表信息&#xff0c;还有浏览器插件以及日志文件等等。 引导提示 注重隐私保护的小伙伴一定要将这款…...

在ubuntu系统中将vue3的打包文件dist 部署nginx 并且配置ssl证书 以https方式访问

在ubuntu系统中将vue3的打包文件dist 部署nginx 并且配置ssl证书 以https方式访问 确保 Nginx 已安装准备 Vue 3 打包文件配置 Nginx编辑 Nginx 配置文件启用配置文件测试 Nginx 配置重新加载 Nginx配置 SSL 证书获取 SSL 证书验证证书自动续期验证部署注意事项 确保 Nginx 已安…...

MH22D3开发高级UI应用,适配arm2d驱动

在资源有限的嵌入系统上&#xff0c;要开发出具有现代风格&#xff08;圆弧&#xff0c;表盘&#xff0c;滚动&#xff0c;滑动&#xff0c;透明&#xff0c;图层叠加等&#xff09;的UI应用&#xff0c;需要极高的cpu算力和ram&#xff0c;flash资源的支持。 但是往往鱼和熊掌…...

MongoDB数据库深度解析:架构、特性与应用场景

在现代应用程序开发中&#xff0c;数据存储技术的选择至关重要。在众多的数据库管理系统中&#xff0c;MongoDB以其灵活性和强大的功能迅速崛起&#xff0c;成为NoSQL数据库中的佼佼者。本文将深入解析MongoDB的架构、核心特性、性能优化及其在实际应用中的最佳实践&#xff0c…...

LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点

LeetCode 235. 二叉搜索树的最近公共祖先 思路&#xff1a; 根据二叉搜索树的特性&#xff0c;对 “基于二叉树的最近公共祖先 ” 进行优化&#xff0c;在二叉树寻找最近公共祖先时&#xff0c;需要分别对根节点的两个子树进行遍历来判断两个节点是异侧还是同侧。但是在二叉搜…...

GPU异步执行漏洞攻防实战:从CUDA Stream竞争到安全编程规范

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 引言 在高校实验室的GPU加速计算研究中&#xff0c;多卡并行编程已成为提升深度学习训练效…...

[c语言日寄]数据结构:栈

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

day21:零基础学嵌入式之数据结构

一、双向链表&#xff08;doulinklist&#xff09; 1. 2.创建 struct DouLinkList *CreateDouLinkList() {struct DouLinkList *dl malloc(sizeof(struct DouLinkList));if(NULL dl){fprintf(stderr, "CreateDouLinkLis malloc");return NULL;}dl->head NUL…...

数据结构之图的应用场景及其代码

一&#xff0c;最小生成树 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;是图论中的经典问题&#xff0c;旨在通过选择无向连通图中的边&#xff0c;使得所有节点连通且总边权最小。 1.1 普里姆&#xff08;Prim&#xff09;算法 普里姆算法是一种用于求解…...

python克洛伊婚纱摄影预约管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

GCC 使用说明

参数 -fPIC ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段&#xff0c;告诉编译器产生与位置无关代码(Position-Independent Code)&#xff0c; 则产生的代码中&#xff0c;没有绝对地址&#xff0c;全部使用相对地址&#xff0c;故而代码可以被加…...

配置别名路径 @

CRA本身把webpack配置包装到了黑盒里无法直接修改&#xff0c;需要借助一个插件 - craco 1. 路径解析配置&#xff08;Webpack&#xff09;-- craco 插件 把 / 解析为 src/ 配置步骤&#xff1a; 1.安装 craco npm i -D craco/craco 2. 项目根目录下创建配置文件 craco.co…...

MYSQL基本命令

目录 1.登录命令2.操作数据库命令2.1查询数据库(show)2.2 创建数据库(create)2.3使用数据库(use) 3.操作表命令3.1增加表3.2查询表3.3修改表(alert)3.4 删除(delete/drop) 1.登录命令 mysql -uroot -p2.操作数据库命令 2.1查询数据库(show) show databases;2.2 创建数据库(c…...

C#语法基础

一、什么是.NET平台 .NET 是由 Microsoft 支持的免费开放源代码应用程序平台。 .NET .NET 是一个安全、可靠且高性能的应用程序平台。C# 是 .NET 的编程语言。它是强类型且类型安全的&#xff0c;并集成了并发和自动内存管理。 C# C# 是一种新式、安全且面向对象的编程语言&…...

深度学习框架对比---Pytorch和TensorFlow

一、计算图与执行模式 1. 图的本质&#xff1a;动态图 vs 静态图 PyTorch&#xff08;动态图&#xff0c;Eager Execution&#xff09; 运行机制&#xff1a;代码逐行执行&#xff0c;张量操作立即生效&#xff0c;计算图在运行时动态构建。x torch.tensor(1.0, requires_gra…...

antdv3 Tabs.TabPane 右上角增加一个角标Badge

1、Tabs官方说明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角标官方效果图 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要实现的效果 4、代码 <Tabs v-m…...

Python-88:英雄升级奖励

问题描述 在一个游戏中&#xff0c;小W拥有 n 个英雄&#xff0c;每个英雄的初始能力值均为 1。她可以通过升级操作来提升英雄的能力值&#xff0c;最多可以进行 k 次升级。 每次升级操作包含以下步骤&#xff1a; 选择一个英雄选择一个正整数 x将该英雄的能力值 aiai​ 更新…...

使用uv创建python项目

uv创建项目 uv init -p 3.12 qwen3env # -p 指定python版本 # qwen3env是项目名称 # 可以使用下面的步骤 mkdir qwen3env cd qwen3env uv venv -p3.12 .venv # 基于 Python 3.12 创建名为 .venv 的虚拟环境 uv init第一种方式 第二种方式 内容如下 执行python脚本 uv ru…...

window 显示驱动开发-命令和 DMA 缓冲区简介

命令和 DMA 缓冲区非常相似。 但是&#xff0c;命令缓冲区由用户模式显示驱动程序使用&#xff0c;DMA 缓冲区由显示微型端口驱动程序使用。 命令缓冲区具有以下特征&#xff1a; 它永远不会由 GPU 直接访问。 硬件供应商控制格式。 它从呈现应用程序的专用地址空间中的常规…...

深光-谷歌TV TADA/奈飞Netflix/亚马逊Prime Video/YouTube等测试外包服务

一、谷歌TV TADA测试服务 1.CTS CTS测试是一系列旨在确保设备与Android操作系统兼容性的自动化测试&#xff0c;CTS是所有测试项中测试量最大的一项测试。 2.GTS GTS测试是确保Android设备能够正确集成和运行Google Mobile Services&#xff08;GMS&#xff09;的关键步骤&am…...

《教育退费那些事儿:从困境到破局》

《教育退费那些事儿&#xff1a;从困境到破局》 教育退费&#xff1a;不容忽视的热点问题 在当今社会&#xff0c;教育消费已成为家庭支出的重要组成部分。无论是 K12 阶段的学科辅导、艺术特长培训&#xff0c;还是成人的职业技能提升、学历继续教育&#xff0c;家长和学生们…...

AtCoder 第405场初级竞赛 A~E题解

A Is it rated? 【题目链接】 原题链接:A - Is it rated? 【考点】 嵌套判断 【题目大意】 有两个分区,有不同的评分区间,给一个评分 r 和分区 x,判断是否在评分区间中。 【解析】 先判断在属于哪个分区,再判断是否在该分区评分区间中。 【难度】 GESP一级 【…...

登录接口中图片验证码Tesseract-OCR识别Java脚本

项目上移植了研发部的产品&#xff0c;文档不全&#xff0c;项目上验证码功能无法关闭&#xff0c;又要做接口/性能测试&#xff0c;开发不配合&#xff08;作为测试多么无奈&#xff09;&#xff0c;此方法识别命中率不高&#xff0c;仅作借鉴。 版本JDK11 import io.restass…...

专项智能练习(定义判断)_DA_02

2. 单选题 虚假同感偏差也叫虚假一致性偏差&#xff0c;是指人们常常会高估或夸大自己的信念、判断及行为的普遍性。在认知他人时总喜欢把自己的特性赋予他人身上&#xff0c;假定他人与自己是相同的&#xff0c;而当遇到与此相冲突的信息时&#xff0c;会坚信自己信念和判断的…...

安卓A15系统实现修改锁屏界面默认壁纸功能

最近遇到一个A15系统项目&#xff0c;客户要求修改锁屏界面的默认壁纸&#xff0c;客户提供了一张壁纸图片&#xff0c;但是从A15系统的源代码查看时才知道谷歌已经去掉了相关的代码&#xff0c;已经不支持了&#xff0c;A13和A14系统好像是支持的&#xff0c;A15系统的Wallpap…...

Linux之Yum源与Nginx服务篇

1.Yum源知识理论总结概括 Yum源概述 Yum 源 即软件仓库的标识&#xff0c;里面承载着软件包集合 Yum源组成 包含模块 【OS】、【everything】、【EPOL】、【debuginfo】、【source】、【update-source】 【os】:简称operator system 它内部包含操作系统的核心组件&#x…...

帧差法识别

定义&#xff1a; 视频通过闪过x帧画面来实现&#xff0c;帧差法就是利用两帧之间的差异找出。也就是移动目标识别 帧差法识别步骤&#xff1a; 1、灰度处理&#xff1a;将多通道变成双通道压缩图像数据。 cvtColor(before_frame,before_gray,CV_RGB2GRAY);cvtColor(after_f…...

游戏引擎学习第282天:Z轴移动与摄像机运动

运行游戏&#xff0c;展示目前进展 我们目前正在进行一个游戏开发项目。昨天&#xff0c;我们实现了基于房间的角色移动系统&#xff0c;并且加入了摄像机的跟随滚动功能。这是我们首次进入“游戏逻辑设计”阶段&#xff0c;也就是说&#xff0c;我们开始构建游戏本身的行为和…...

解决:npm install报错,reason: certificate has expired

目录 1. 问题分析2. 问题解决2.1 查看配置的镜像2.2 修改镜像源 种一棵树最好的时间是10年前&#xff0c;其次就是现在&#xff0c;加油&#xff01; --by蜡笔小柯南 1. 问题分析 启动前…...

C++ 基础知识点

1、指针和引用的区别 指针&#xff1a;是一个变量&#xff0c;存储的是另一个变量的内存地址&#xff0c;可以被重新赋值指向不同的对象&#xff0c;允许为 nullptr。 指针的特性&#xff1a; 独立变量&#xff0c;存储内存地址 可重新赋值指向其他对象 支持空值&#xff08;n…...

线代第二章矩阵第九、十节:初等变换、矩阵的标准形、阶梯形与行最简阶梯形、初等矩阵

文章目录 初等变换初等行变换初等列变换 矩阵的标准型阶梯形与行最简阶梯形阶梯型矩阵行简化阶梯形 初等矩阵定义性质初等矩阵和初等变换的联系 本节非常重要 初等变换 初等变换使用"→"&#xff0c;而不是"" 初等行变换 ① 交换两行 ② 非0数乘以某一…...

新能源汽车制动系统建模全解析——从理论到工程应用

《纯电动轻卡制动系统建模全解析&#xff1a;车速-阻力拟合、刹车力模型与旋转质量转换系数优化》 摘要 本文以纯电动轻卡为研究对象&#xff0c;系统解析制动系统建模核心参数优化方法&#xff0c;涵盖&#xff1a; 车速-阻力曲线拟合&#xff08;MATLAB实现与模型验证&…...

初始化一个Springboot项目

初始化一个Springboot项目 文章目录 初始化一个Springboot项目1、新建项目2、配置yml3、自定义异常4、通用相应类5、全局跨域配置6、总结 1、新建项目 首先&#xff0c;我们需要创建一个新的 Spring Boot 项目。这里我们使用 IntelliJ IDEA 作为开发工具&#xff0c;它提供了方…...

Springboot考研信息平台

Springboot考研信息平台 文章目录 Springboot考研信息平台1、技术栈2、项目说明3、项目截图4、核心代码4.1、前端核心代码4.2、后端核心代码 1、技术栈 前端 Vue 是一套用于构建用户界面的渐进式 JavaScript 框架。 Vue 作为前端核心框架&#xff0c;提供了响应式的数据绑定和高…...

Spring 框架 JDBC 模板技术详解

一、JDBC 模板技术概述 在传统 JDBC 开发中&#xff0c;开发人员需要手动处理数据库连接&#xff08;Connection&#xff09;、事务管理、语句执行&#xff08;Statement&#xff09;和结果集&#xff08;ResultSet&#xff09;等繁琐操作&#xff0c;不仅代码冗余度高&#x…...

Console Importer浏览器插件的编译 及 制作成.crx浏览器插件的步骤

近日由于下载Console Importer浏览器插件(一个前端调试窗口方便引下第三方库便于学习测试的插件)找不到资源&#xff0c;于是找到该插件的源码&#xff0c;地址&#xff1a;https://github.com/pd4d10/console-importer&#xff09;&#xff0c;发现该插件基于一款名为“Plasmo…...

ArcGIS切片方案记录bundle文件

文章目录 前言一、导入底图二、生成切片方案三、导出切片方案总结 前言 切片的作用是让前端可以访问地图的Mapsever来加载底图。arcgis切片是测绘人员或者WebGIs人员需要认识到的操作。 一、导入底图 首先10.8的ArcGis&#xff0c;这里没有Pro&#xff0c;Pro其实也是一样的操…...

山东大学计算机图形学期末复习6——CG10下

##CG10下 将世界坐标中的任意点 P P P 变换到以相机为中心的“观察坐标系”下&#xff08;右手坐标系&#xff09; n \mathbf{n} n&#xff1a;从相机眼睛朝向观察点的反方向&#xff0c;代表“前方”&#xff1b; u \mathbf{u} u&#xff1a;观察坐标系的 x 轴&#xff0c;向…...

【Spring Cloud Gateway】Nacos整合遇坑记:503 Service Unavailable

一、场景重现 最近在公司进行微服务架构升级&#xff0c;将原有的 Spring Cloud Hoxton 版本升级到最新的 2021.x 版本&#xff0c;同时使用 Nacos 作为服务注册中心和配置中心。在完成基础框架搭建后&#xff0c;我使用 Spring Cloud Gateway 作为API 网关&#xff0c;通过 N…...

[Linux]从零开始的STM32MP157 Busybox根文件系统测试及打包

一、前言 在上一篇教程中&#xff0c;我们成功编译了Busybox根文件系统并且能够正常使用&#xff0c;但是大家应该也发现了我们构建的根文件系统存在许多问题&#xff0c;比如一些找不到文件的报错。并且在实际的产品中一般都是将根文件系统烧录到EMMC中&#xff0c;并不是像我…...