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

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析

一、金丝雀发布概述

1.1 什么是金丝雀发布?

金丝雀发布(Canary Release)是一种渐进式部署策略,通过逐步将生产流量从旧版本迁移至新版本,结合实时指标验证,在最小化风险的前提下完成版本迭代。其核心逻辑如下:

  • 流量分层:初始阶段仅将小比例流量(如 5%)路由至新版本,剩余流量仍由旧版本处理。

  • 指标验证:监控新版本的关键指标(成功率、延迟、错误率),确认符合预期后逐步扩大流量比例。

  • 自动化决策:基于预设阈值自动推进或回滚,降低人工干预成本。

技术价值:

  • 风险可控:异常仅影响部分用户,快速隔离问题。

  • 精准验证:结合业务指标(如交易成功率)而非单纯基础设施健康状态。

  • 资源高效:无需双版本全量部署,节省计算资源。

1.2 金丝雀发布与蓝绿发布的差异
在这里插入图片描述
金丝雀发布适合高风险迭代、核心业务认证。蓝绿发布适合简单应用快速全量发布。

二、Argo Rollouts 能力解析

接下来我们聚焦 Argo Rollouts,是如何落地金丝雀发布策略并提供增强能力的。
2.1 核心能力

1.精细化流量控制

  • 百分比权重控制:支持渐进式流量分配(如 5% → 50% → 100%),确保发布过程平滑过渡。

  • 基于请求头的精准路由:可按特定 Header(如 X-User: beta)实现灰度测试,满足特定用户群验证需求。

2.多维监控与自动化决策

  • 内置监控集成:支持与 Prometheus、Datadog 等主流监控系统无缝集成。

  • 指标阈值配置:可定义关键业务指标,(如错误率 < 1%、响应时间 < 500ms)

  • 自动回滚机制:当指标超出阈值时,自动触发回滚。

3.分阶段发布策略

可配置多步骤验证流程(示例):

steps:- setWeight: 20     # 第一阶段:20%流量- pause: {}         # 手动确认后继续- setWeight: 50     # 第二阶段:50%流量- pause: {duration: 30s}  # 自动暂停监控- setWeight: 100    # 全量发布

2.2 与原生 Deployment 的差异
在这里插入图片描述

三、金丝雀发布实战

使用 Argo Rollouts 搭配 Ingress-NGINX 实现金丝雀发布,实现流量按比例逐步迁移、暂停验证、自动推进的渐进式发布策略。

多维度验证目标

  • 流量按照预设比例,逐步分流至新旧版本

  • 支持通过请求 Header 实现精准流量控制

  • 通过可视化 Dashboard 实时跟踪发布状态

环境准备 可以看其他K8S基础介绍的相关文章

3.1 项目结构

canary-deploy/
├── canary-rollout.yaml # 定义金丝雀策略
├── service-stable.yaml # 稳定版 Service(全流量入口)
├── service-canary.yaml # 金丝雀版 Service(灰度流量入口)
└── ingress-nginx.yaml  # Ingress 权重路由配置

文件说明:

canary-rollout.yaml

使用 Argo Rollouts 定义金丝雀发布流程,包括流量权重控制、阶段发布和暂停机制。

service-stable.yaml

稳定版服务,默认承载全流量。

service-canary.yaml

金丝雀版服务,按权重接收灰度流量。

ingress-nginx.yaml

定义入口规则,配合 Argo Rollouts 实现流量路由与控制。

3.2 配置文件
1.Rollout 配置

canary-rollout.yaml 
核心作用:定义金丝雀发布的阶段策略、流量权重等,及与 Ingress 的联动配置。是实现渐进式流量控制的核心资源对象。
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:name: canary-demolabels:app: canary-demo
spec:replicas: 1  # 启动一个副本用于测试selector:matchLabels:app: canary-demotemplate:metadata:labels:app: canary-demospec:containers:- name: canary-demoimage: argoproj/rollouts-demo:blue  # 示例镜像,可替换为业务镜像imagePullPolicy: Alwaysports:- name: httpcontainerPort: 8080protocol: TCPresources:requests:memory: 32Micpu: 5mstrategy:canary:                              # 金丝雀发布策略canaryService: service-canary      # 金丝雀服务stableService: service-stable      # 稳定服务canaryMetadata:labels:deployment: canary             # 金丝雀版本的标签stableMetadata:labels:deployment: stable             # 稳定版本的标签trafficRouting:nginx:stableIngress: canary-demo     # 关联 ingress-nginx.yaml 中的 IngressadditionalIngressAnnotations:canary-by-header: X-Canary   # 支持按 Header 精准控制流量steps:                             # 金丝雀发布阶段控制- setWeight: 20                  # 第一阶段:20% 流量进入金丝雀- pause: {}                      # 暂停,需要手动操作继续- setWeight: 50                  # 第二阶段:50% 流量- pause:duration: 30s                # 暂停 30 秒进行监控验证- setWeight: 100                  # 第三阶段:100% 流量- pause:duration: 30s                # 最后验证后全量切换

说明:

通过 Argo Rollouts 定义了金丝雀发布流程,包括:

每个阶段的流量比例,如 20%、50%。

阶段性暂停(手动或定时)用于人工确认或指标验证。

配置 canaryService 和 stable-Service,结合 Ingress 控制流量分流。

启用 Header(如 X-Canary)进行精细化流量控制。

2.Service 配置

设计逻辑:通过独立 Service 隔离新旧版本流量,结合 Ingress 权重控制实现渐进式迁移。

稳定版 Service
service-stable.yaml
apiVersion: v1
kind: Service
metadata:name: service-stablelabels:app: canary-demo
spec:selector:app: canary-demoports:- port: 80targetPort: httpprotocol: TCPname: http
金丝雀版 Service
service-canary.yaml
apiVersion: v1
kind: Service
metadata:name: service-canarylabels:app: canary-demo
spec:selector:app: canary-demoports:- port: 80targetPort: httpprotocol: TCPname: http

3.Ingress 配置

ingress-nginx.yaml

核心作用:负责入口流量的转发配置,并配合 Argo Rollouts 实现动态流量切分。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: canary-demolabels:app: canary-demoannotations:kubernetes.io/ingress.class: nginx   # 指定使用 nginx ingress
spec:rules:- host: canary.auto   # 访问域名http:paths:- path: /pathType: Prefixbackend:service:name: service-stable   # 默认指向稳定版 Serviceport:name: http

3.3 部署与验证
步骤1:初始版本部署
1.创建命名空间并进入目录

# 创建独立命名空间
kubectl create ns canary-test
cd canary-deploy/  # 进入项目目录

2.应用资源配置

# 批量应用所有配置文件(Service/Ingress/Rollout)
kubectl apply -f . -n canary-test

步骤2:验证初始部署状态

# 检查资源创建状态(确保所有资源 READY)
kubectl get rollout,svc,ingress,pods -n canary-test
输出: 资源已被正确创建NAME                                      STATUS    AVAILABLE   AGE
rollout.argoproj.io/canary-demo          ✔ Healthy   1/1         2mNAME                    TYPE        CLUSTER-IP      PORT(S)   AGE
service/service-canary  ClusterIP   10.96.132.45   80/TCP    2m
service/service-stable  ClusterIP   10.96.131.207  80/TCP    2mNAME                          CLASS   HOSTS          ADDRESS        PORTS   AGE
ingress.networking.k8s.io/canary-demo   nginx   canary.auto   192.168.49.2   80      2mNAME                              READY   STATUS    RESTARTS   AGE
pod/canary-demo-7d5f8c6c9d-abcde   1/1     Running   0          2m

步骤3:浏览器验证初始版本

获取访问入口信息
# 获取 Ingress 对外 IP 和端口(如果是云环境,使用 EXTERNAL-IP;本地集群如 minikube 使用 IP)
INGRESS_IP=$(kubectl get ingress canary-demo -n canary-test -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "访问地址: http://$INGRESS_IP"
访问网页配置本地 hosts 文件:
127.0.0.1 canary.auto
浏览器访问:http://canary.auto
初始页面为蓝色版本。类似如下

在这里插入图片描述

步骤4:触发金丝雀发布

模拟版本更新
# 通过镜像更新触发发布流程(从 blue 切换到 green 版本)
kubectl argo rollouts set image canary-demo \canary-demo=argoproj/rollouts-demo:green -n canary-test
也可直接修改 canary-rollout.yaml 中镜像版本从blue 到 green,之后通过apply命令应用到集群。

步骤5:验证金丝雀发布(第一阶段 )

1.使用 Argo Rollouts CLI 观察部署过程

# 实时观察发布状态(新开终端执行)
kubectl argo rollouts get rollout canary-demo -n canary-test --watch
输出(第一阶段暂停时):Name:            canary-demo
Namespace:       canary-test
Status:Paused
Message:         CanaryPauseStep
Strategy:        CanaryStep:          1/6SetWeight:     20ActualWeight:  20
Images:          argoproj/rollouts-demo:green (canary)argoproj/rollouts-demo:blue (stable)

2.浏览器流量验证(第一阶段 20% 流量)

操作 1:批量请求测试分流比例

# 发送 20 次请求统计版本分布(Linux/MacOS 环境)
for i in {1..20}; docurl -s "http://$INGRESS_IP" -H "Host: canary.auto" | grep "Pod Image"
done | sort | uniq -c
输出: 16 Pod Image: argoproj/rollouts-demo:blue (stable)4 Pod Image: argoproj/rollouts-demo:green (canary)  # 约 20% 流量

操作2:浏览器访问 http://canary.auto

页面呈现 80% blue 方格 ,20% green 方块(新版本),类似下图:
在这里插入图片描述

操作 3:Dashboard 观测

# 启动 Argo Rollouts Dashboard(新终端执行)
kubectl argo rollouts dashboard -n canary-test
浏览器访问:http://localhost:3100,查看以下关键信息:金丝雀发布的完整步骤以及 当前所在阶段
版本健康状态指示等

类似下图:
在这里插入图片描述

操作 4:Header 强制路由验证

# 通过 X-Canary 头强制路由到金丝雀版本
curl -s "http://$INGRESS_IP" -H "Host: canary.auto" -H "X-Canary: always" | grep "Pod Image"
输出:Pod Image: argoproj/rollouts-demo:green (canary)

操作5:浏览器访问 http://canary.auto

页面 100% green 方块(新版本)

步骤 5:手动推进发布流程

方法1:命令
# 继续执行下一阶段(从 20% 提升至 50%)
kubectl argo rollouts promote canary-demo -n canary-test# 观察自动执行后续步骤(30秒后进入100%阶段)
方法2Dashboard 上操作按下 Promote 按钮,Argo Rollouts 会根据策略自动执行后续步骤,即开始进入 50%70% 流量切换等。注:仅当 Rollout 处于 Paused 状态时,Promote 按钮才激活。

步骤 6:全量发布完成验证

流程执行到最终阶段:

# 检查最终版本状态
kubectl argo rollouts get rollout canary-demo -n canary-test
输出:全部切换到新版本 greenName:            canary-demo
Namespace:       canary-test
Status:Healthy
Strategy:        CanaryStep:          6/6SetWeight:     100ActualWeight:  100
Images:          argoproj/rollouts-demo:green (stable)

最终流量验证

# 发送 10 次请求确认全量切换
for i in {1..10}; docurl -s "http://$INGRESS_IP" -H "Host: canary.auto" | grep "Pod Image"
done
输出:Pod Image: argoproj/rollouts-demo:green (stable)  # 全部请求

关键流程示意图

graph TDA[创建初始资源] --> B[触发金丝雀发布]B --> C{阶段1:20%流量}C -->|手动验证| D[人工确认后推进]D --> E{阶段2:50%流量}E -->|自动暂停30| F[监控指标检查]F --> G{阶段3:100%流量}G -->|自动暂停30| H[最终验证]H --> I[全量发布完成]

部署验证清单
在这里插入图片描述

步骤7:手动回滚操作

在 Dashboard 中找到目标 Rollout 资源。

点击 Actions 下拉菜单,选择 Abort and Rollback。

效果:当前的发布进程终止,并将流量切回旧版本。

四、金丝雀发布底层原理

4.1 核心机制:组件协作与流量控制
金丝雀发布的本质是由 Argo Rollouts 控制器动态协调 Ingress、Service 和 ReplicaSet 等 Kubernetes 原生资源,实现从旧版本到新版本的渐进式流量切换与灰度控制。整个过程无需手动干预,所有操作均由控制器按策略自动执行。
1.组件角色与交互
在这里插入图片描述

2.分阶段解析原理

下文以第三章 实例 为例 进行解析。

如下操作均由Argo Rollouts 控制器按策略文件自动执行,无需人为干预。

阶段1:初始状态(全流量稳定版)

  A[用户请求] --> B[Ingress]B --> C[service-stable]C --> D[旧版本Pod]

原理解析:

service-stable通过标签(如 rollouts-pod-templatehash=6f8b8d584)选择旧版本 Pod。

Ingress 默认路由规则指向 service-stable,承载 100% 流量。

阶段2:金丝雀阶段(流量渐进切换)
首先环境准备:

创建新版本 ReplicaSet(如 canary-demo-67fc7c4899)。

生成 service-canary,标签选择器指向新版本 Pod。

Ingress 动态分流 ( 如下是分流示意图)

  A[用户请求] --> B[Ingress]B -->|80%流量| C[service-stable]B -->|20%流量| D[service-canary]C --> E[旧版本Pod]D --> F[新版本Pod]

分阶段推进:

权重控制:通过调整新版本 Pod 的副本比例(如 1:4 → 20%流量)。

暂停机制:每个阶段可配置人工确认或自动等待(如 pause:{duration: 30m})。

阶段3:最终切换(全量发布)
原子化操作:

更新 service-stable的标签选择器,指向新版本 Pod。

缩容旧版本 ReplicaSet 至 0 副本。

最终状态:

  A[用户请求] --> B[Ingress]B --> C[service-stable]C --> D[新版本Pod]

4.2 流量控制的两种模式

模式 1:按权重分配(副本比例控制)

实现原理:Argo Rollouts 动态调整新版本 Pod 的副本数,Ingress 根据副本比例自动分配流量。

示例:旧版本 4 副本 + 新版本 1 副本 → 新版本接收约 20% 流量。

优势:无需侵入式修改 Ingress 配置,适配 Kubernetes 原生负载均衡逻辑。

模式 2:按请求特征匹配(精准路由)

实现方式:在 Ingress 中配置 Header 匹配规则,实现定向灰度测试:

annotations:nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"nginx.ingress.kubernetes.io/canary-by-header-value: "beta"

典型场景:

定向邀请内测用户(如 X-Canary: beta)

A/B 测试新功能(如 X-Experiment: new-ui)

4.3 Argo Rollouts 协调逻辑流图

participant 用户participant ArgoRolloutsparticipant K8sAPIparticipant Ingress用户->>ArgoRollouts: 触发发布(修改镜像)ArgoRollouts->>K8sAPI: 创建新ReplicaSetK8sAPI-->>ArgoRollouts:Pod就绪ArgoRollouts->>K8sAPI: 调整副本比例(如20%Ingress->>K8sAPI: 监听Endpoint变化Ingress->>Ingress: 按副本比例分配流量loop 分阶段推进ArgoRollouts->>ArgoRollouts: 等待人工确认/定时器ArgoRollouts->>K8sAPI: 提升副本比例(如50%)endArgoRollouts->>K8sAPI: 缩容旧ReplicaSet

4.4 资源生命周期管理

1.Service 管理

稳定版 Service:全程存在,发布后切换至新版本 Pod,保持服务入口稳定性。

金丝雀 Service:发布完成后闲置,需手动清理或标记为临时资源(如 env: canary-temp)。

2.ReplicaSet 管理

旧版本:缩容至 0 副本,保留配置以支持秒级回滚。

新版本:长期保留,直至下次更新。

3.最佳实践

自动化清理:

# 清理7天前的临时资源
kubectl delete rs,svc -l env=canary-temp --field-selector="metadata.creationTimestamp<$(date -d '7 days ago' +%s)"
快速回滚:kubectl argo rollouts undo <ROLLOUT_NAME>

4.5 金丝雀原理总结

1.核心原理

动态副本控制:通过调整 Pod 副本比例实现流量权重分配。

原子化切换:最终通过更新 Service 选择器和缩容旧版本完成全量发布。

2.技术优势

精准可控:支持流量比例与用户特征双重策略。

无缝切换:旧版本保留至最终阶段,确保回滚能力。

五、总结

5.1 核心总结

本文聚焦基于 Argo Rollouts 的金丝雀发布实战,通过精细化流量控制、阶段性发布策略和 Ingress 权重路由,构建了一个可操作、可观测的渐进式发布流程。

我们深入解析了 Argo Rollouts 的底层原理,包括:

流量权重分配与阶段推进;

Header 精准路由的灰度测试;

与 Ingress-NGINX 联动,实现流量控制与流量转发的分离。

在实战中,我们构建了从配置到上线的自动化金丝雀发布全过程。

相关文章:

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析

一、金丝雀发布概述 1.1 什么是金丝雀发布&#xff1f; 金丝雀发布&#xff08;Canary Release&#xff09;是一种渐进式部署策略&#xff0c;通过逐步将生产流量从旧版本迁移至新版本&#xff0c;结合实时指标验证&#xff0c;在最小化风险的前提下完成版本迭代。其核心逻辑…...

手持小风扇方案解说---【其利天下技术】

春去夏来&#xff0c;酷暑时节&#xff0c;小风扇成为外出必备的解暑工具&#xff0c;近年来&#xff0c;随着无刷电机的成本急剧下降&#xff0c;小风扇也逐步从有刷变无刷化了。 数量最大的如一箱无刷马达&#xff0c;其次三相低压无刷电机也大量被一些中高端风扇大量采用。…...

Qt开发:枚举的介绍和使用

文章目录 一、概述二、Qt 中定义和使用枚举2.1 普通枚举的定义方式2.2 使用枚举 三、配合 Qt 元对象系统使用枚举3.1 使用 Q_ENUM&#xff08;Qt 5.5 及以上&#xff09;3.2 示例&#xff1a;枚举值转字符串3.4 示例&#xff1a;字符串转枚举值 四、枚举与字符串相互转换五、枚…...

HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录

前言 在开发运动类应用时&#xff0c;集成地图功能以及实时记录运动轨迹和公里数是核心需求之一。本文将详细介绍如何在 HarmonyOS 应用中集成百度地图 SDK&#xff0c;实现运动跟随以及运动公里数的记录。 一、集成百度地图 SDK 1.引入依赖 首先&#xff0c;需要在项目的文…...

“胖都来”商标申请可以通过注册不!

近日“胖都来”被网友认为是蹭“胖东来”品牌流量在互联网上引起争议&#xff0c;看到许多自媒体说浙江这家公司已拿到“胖都来”的注册商标&#xff0c;普推知产商标老杨经检索后发现是没有的&#xff0c;只是申请受理。 对于商城类主要类别是在35类广告销售&#xff0c;核心是…...

【Django】中间件

Django 中间件是 Django 框架里一个轻量级、可插拔的组件&#xff0c;它能在全局范围内对 Django 的请求和响应进行处理。中间件处于 Django 的请求处理流程之中&#xff0c;在请求抵达视图函数之前以及视图函数返回响应之后执行特定操作。以下是关于 Django 中间件的详细介绍&…...

电子电器架构 --- 48V架构的一丢丢事情

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

什么是Blender?怎么获取下载Blender格式文件模型

glbxz.com glbxz.com 官方可以下载Blender格式文件模型 BlenderBlender 是一个免费的开源程序&#xff0c;用于建模和动画&#xff0c;最初由一家名为 Neo Geo 的动画工作室作为内部应用程序开发&#xff0c;后来作为自己的程序发布。这是一个称职的程序&#xff0c;近年来由于…...

Ubuntu安装pgsql

​​一、通过 APT 安装&#xff08;推荐&#xff09;​​ 更新软件包列表 sudo apt update 安装 PostgreSQL 核心包及工具 sudo apt install postgresql postgresql-client postgresql-contrib • postgresql&#xff1a;数据库服务端 • postgresql-client&#xff1a;命令行…...

Qwen2-VL详解

一、引言 在人工智能领域,多模态大模型的发展备受关注。Qwen2-VL 作为一款先进的多模态模型,致力于克服现有方法在处理图像和视频数据时存在的不足,显著提升多模态信息的理解与交互能力。本文将全面且深入地阐述 Qwen2-VL 的创新理念、精妙的模型架构、严谨的训练流程、卓越…...

定长滑动窗口---初阶篇

目录 滑动窗口核心思想 定长滑动窗口套路 定长滑动窗口习题剖析 1456. 定长子串中元音的最大数目 643. 子数组最大平均数 I 1343. 大小为 K 且平均值大于等于阈值的子数组数目 2090. 半径为 k 的子数组平均值 2379. 得到 K 个黑块的最少涂色次数 2841. 几乎唯一子数组…...

以pytest_addoption 为例,讲解pytest框架中钩子函数的应用

钩子函数&#xff08;Hook Function&#xff09;的概念 钩子函数&#xff08;Hook Function&#xff09;是软件框架中预定义的回调接口&#xff0c;允许开发者在程序执行的特定阶段插入自定义逻辑&#xff0c;以扩展或修改框架的默认行为。在 pytest 中&#xff0c;钩子函数覆…...

数据智能重塑工业控制:神经网络在 MPC 中的四大落地范式与避坑指南

一、引言&#xff1a;工业控制的范式革命 在工业 4.0 的浪潮中&#xff0c;传统基于物理模型的控制方法&#xff08;如 PID、线性二次型调节器 LQR&#xff09;正面临前所未有的挑战。以石化行业为例&#xff0c;某炼油厂的催化裂化装置&#xff08;FCCU&#xff09;因反应机理…...

AB测试面试题

AB测试面试题 常考AB测试问答题(1)AB测试的优缺点是什么?(2)AB测试的一般流程/介绍一下日常工作中你是如何做A/B实验的?(3)第一类错误 vs 第二类错误 vs 你怎么理解AB测试中的第一、二类错误?(4)统计显著=实际显著?(5)AB测试效果统计上不显著?(6)实验组优于对…...

phpstudy升级新版apache

1.首先下载要升级到的apache版本&#xff0c;这里apache版本为Apache 2.4.63-250207 Win64下载地址&#xff1a;Apache VS17 binaries and modules download 2.将phpstudy中原始apache复制备份Apache2.4.39_origin 3.将1中下载apache解压&#xff0c; 将Apache24复制一份到ph…...

民宿管理系统6

普通管理员管理&#xff1a; 新增普通管理员&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-f…...

【iOS】源码阅读(三)——内存对齐原理

文章目录 前言获取内存大小的三种常用方式sizeofclass_getInstanceSizemalloc_size 总结 前言 之前学习alloc相关源码&#xff0c;涉及到内存对齐的相关内容&#xff0c;今天笔者详细学习了一下相关内容并写了此篇博客。 获取内存大小的三种常用方式 获取内存大小的方式有很多…...

在 Ubuntu 中配置 Samba 实现「特定用户可写,其他用户只读」的共享目录

需求目标 所有认证用户可访问 Samba 共享目录 /path/to/home&#xff1b;**仅特定用户&#xff08;如 developer&#xff09;**拥有写权限&#xff1b;其他用户仅允许读取&#xff1b;禁止匿名访问。 配置步骤 1. 设置文件系统权限 将目录 /home3/guest 的所有权设为 develo…...

配置指定地址的conda虚拟Python环境

创建指定路径的 Conda 环境 在创建环境时&#xff0c;使用 --prefix 参数指定自定义路径&#xff1a; conda create --prefix/your/custom/path/my_env python3.8 说明&#xff1a; /your/custom/path/my_env&#xff1a;替换为你希望存放环境的路径&#xff08;如 D:\projec…...

从彼得·蒂尔四象限看 Crypto「情绪变迁」:从密码朋克转向「标准化追求者」

作者&#xff1a;Techub 精选编译 撰文&#xff1a;Matti&#xff0c;Zee Prime Capital 编译&#xff1a;Yangz&#xff0c;Techub News 我又带着一篇受彼得蒂尔&#xff08;Peter Thiel&#xff09;启发的思想杂烩回来了。作为自封的「蒂尔学派」信徒&#xff0c;我常透过他…...

VS Code 常用插件

React Auto Import - ES6, TS, JSX, TSX Auto Rename Tag ES7 React/Redux/React-Native snippets Markdown Markdown All in One Markdown Preview Enhanced Other Prettier - Code formatter 格式化代码 Live Server 本地服务器实时预览与自动刷新...

深入探讨 UDP 协议与多线程 HTTP 服务器

深入探讨 UDP 协议与多线程 HTTP 服务器 一、UDP 协议&#xff1a;高效但“不羁”的传输使者 UDP 协议以其独特的特性在网络传输中占据一席之地&#xff0c;适用于对实时性要求高、能容忍少量数据丢失的场景。 1. UDP 的特点解析 无连接&#xff1a;无需提前建立连接&…...

Node.js入门指南:开启JavaScript全栈开发之旅

Hi&#xff0c;我是布兰妮甜 &#xff01;Node.js让JavaScript突破了浏览器的限制&#xff0c;成为全栈开发的利器。作为基于V8引擎的高性能运行时&#xff0c;它彻底改变了JavaScript只能做前端开发的局面。本文将带你快速掌握Node.js的核心用法&#xff1a;环境搭建与模块系统…...

【STM32F1标准库】理论——通信协议:串口

目录 一、简介 二、连接方式 三、串口参数与时序 1.参数 2.时序 四、STM32实现串口通信的方法 1.使用软件模拟 2.使用硬件外设 杂谈 1.通信的目的 2.常见可以使用串口通信的模块 3.串口常用电平标准 4.串口从波形反推数据 5.奇偶校验 一、简介 命名&#xff1a;USART&#…...

轻松管理房间预约——启辰智慧预约小程序端使用教程

欢迎您使用《启辰智慧预约》场所预约小程序&#xff0c;您可以通过本小程序预约会议室/活动室等&#xff0c;并在预约审批通过后&#xff0c;获取临时开锁密码&#xff0c;开锁密码会在预约时间前30分钟生效。以下是本程序的使用流程。 一、创建单位&#xff08;新用户注册&am…...

如何在自己的服务器上部署静态网页并通过IP地址进行访问

文件放置 cd /var目录 新建www目录 进入www目录 新建html目录用于放置文件以及相关资源 修改配置文件 sudo nano /etc/nginx/sites-available/default修改index部分的html文件名 修改端口映射避免80冲突 重启Nginx sudo systemctl restart nginx打开浏览器访问即可 h…...

802.11s Mesh 组网框架流程

协议标准 使用 802.11s (标准 Mesh 协议) 基础流程框架 连接流程本质&#xff1a;Beacon → Peer Link → HWMP 路径发现 → 数据传输。mesh与easymesh的区别 阶段详解 阶段1:Beacon广播 作用&#xff1a;周期性宣告Mesh网络存在&#xff0c;同步参数&#xff08;如Mesh …...

gitcode 上传文件报错文件太大has exceeded the limited size (10 MiB) in commit

登陆gitcoe&#xff0c;在项目设置->提交设置 ,勾选提交文件限制&#xff0c;修改限制的大小。 修改完后&#xff0c;重新提交代码。...

C++代码随想录刷题知识分享-----判断两个字符串是否为字母异位词(Anagram)【LeetCode 242】

✨ 题目描述 给定两个字符串 s 和 t&#xff0c;请判断 t 是否是 s 的字母异位词。 &#x1f4cc; 示例 1&#xff1a; 输入&#xff1a;s "anagram", t "nagaram" 输出&#xff1a;true&#x1f4cc; 示例 2&#xff1a; 输入&#xff1a;s "…...

Canal mysql to mysql 增加 online 库同步配置指南

Canal 增加新库 online 的配置指南 1. 停止 Canal Adapter 服务 ./bin/stop.sh2. 数据库备份与导入 备份源数据库 mysqldump -h 127.0.0.1 -P 3307 --single-transaction -uroot -p -B online > online.sql导入到目标数据库 mysql -h 127.0.0.1 -P 3308 -uroot -p <…...

Spring MVC中Controller是如何把数据传递给View的?

在 Spring MVC 中&#xff0c;Controller 负责请求的处理&#xff0c;准备需要展示的数据&#xff0c;并将这些数据传递给 View&#xff0c;由 View 负责最终的页面渲染。数据从 Controller 传递到 View 主要通过模型 (Model) 实现。 Spring MVC 提供了以下几种方式让 Control…...

FAST-LIO笔记

1.FAST-LIO FAST-LIO 是一个计算效率高、鲁棒性强的激光-惯性里程计系统。该系统通过紧耦合的迭代扩展卡尔曼滤波器&#xff08;IEKF&#xff09;将激光雷达特征点与IMU数据进行融合&#xff0c;使其在快速运动、噪声较大或环境复杂、存在退化的情况下仍能实现稳定的导航。 1…...

挑战用豆包教我学Java01天

今天是豆包教我学Java的第一天&#xff0c;废话不多说直接开始。 1.每日题目&#xff1a; 基础语法与数据类型 题目&#xff1a;编写一个 Java 程序&#xff0c;从控制台读取两个整数&#xff0c;然后计算它们的和、差、积、商&#xff0c;并输出结果。题目&#xff1a;编写…...

基于RT-Thread的STM32G4开发第二讲第二篇——ADC

文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 本文使用的是RT-Thread最新的驱动5.1.0&#xff0c;兼容下面的所有驱动。使用的开发板是蓝桥杯嵌入式国信长安的开发板&#xff0c;MCU是STM32G431…...

居民健康监测小程序|基于微信小程序的居民健康监测小程序设计与实现(源码+数据库+文档)

居民健康监测小程序 目录 基于微信小程序的居民健康监测小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、健康科普管理 5.3公告类型管理 3、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...

电商双11美妆数据分析

图中展示的是在Jupyter Notebook环境下的Python代码及运行结果。代码利用 seaborn 和 matplotlib 库&#xff0c;以 datal 数据集为基础&#xff0c;绘制上下两个子图。上方子图呈现各店铺中各大类的销售量&#xff0c;下方子图展示各店铺中各大类的销售额&#xff0c;通过条形…...

Spark-Core(双Value类型)

一、RDD转换算子&#xff08;双Value类型&#xff09; 1、intersection 函数签名&#xff1a; def intersection(other: RDD[T]): RDD[T] 函数说明&#xff1a;对源 RDD 和参数 RDD 求交集后返回一个新的 RDD 举栗&#xff1a; val dataRDD1 sparkContext.makeRDD(List(…...

【数据库原理及安全实验】实验六 角色访问控制

指导书原文 安全性管理二 【实验目的】 1) 通过语句设置登录用户的权限&#xff0c;实现对不同用户的操作权限的限定。 【实验原理】 1) 定义数据库角色&#xff0c;授予该角色特定权限&#xff0c;建立不同的用户将其置入不同的角色之下&#xff0c;即等于分配了该用户不…...

windows安装micromamba

windows安装 winget install Mamba.Micromamba Set-ExecutionPolicy RemoteSigned micromamba activate 第一次运行会报错&#xff0c;把报错中间那一句init代码跑一下 创建环境什么的和conda一样 把conda换成micromamba就行 绑定快捷键&#xff0c;winget安装&#x…...

vue-quill-editor的失焦事件

vue-quill-editor的用法再此就不再赘述了&#xff0c;只记录我在使用过程中踩的坑。 版本&#xff1a;Vue2 vue-quill-editor3.0.6 封装组件&#xff1a; <vue-quill-editorclass"editor":class"dynamicClasses"ref"myTextEditor"v-model&quo…...

【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)

参考《经济研究》中方先明&#xff08;2023&#xff09;的做法&#xff0c;将华证ESG评级进行赋值&#xff0c;指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级&#xff0c;将上市公司ESG等级从低到高分别赋值为1至9。将华证ESG评级得分数据更新至2024年12月31日&#xf…...

【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录

这里写目录标题 HugoGithub博客部署及主题&#xff08;stack&#xff09;美化等界面优化写在前面hugo博客搭建教程第一种方案第二种方案 添加浏览量和统计字数添加评论功能添加访客地图 HugoGithub博客部署及主题&#xff08;stack&#xff09;美化等界面优化 效果图如下 如果…...

题解:CF2107E Ain and Apple Tree

首先考虑无解的情况。 当这棵树为一条链时&#xff0c;答案取到最大值。证明很简单&#xff0c;假设存在一个节点 u u u 至少有 2 2 2 个孩子节点&#xff0c;任取两个 v 1 , v 2 v_1,v_2 v1​,v2​&#xff0c;则 dep ( LCA ⁡ ( v 1 , v 2 ) ) dep ( u ) \text{dep}(\o…...

STM32的看门狗

独立看门狗&#xff08;IWDG&#xff09; IWDG简介 独立看门狗&#xff08;Independent Watchdog&#xff0c;通常缩写为IWDG&#xff09;主要作用是主要用于检测外界电磁干扰&#xff0c;或硬件异常导致的程序跑飞问题。 WDG本质上是一个12位的递减计数器&#xff08;滴答定…...

小王包子铺的融资过程以及IPO上市过程

用包子铺来打个通俗易懂的比喻&#xff0c;一步步讲清楚从创业到融资上市的全过程。 &#x1f95f; 故事背景&#xff1a;老王的包子铺 老王做的包子特别好吃&#xff0c;于是他决定不再只是摆摊&#xff0c;而是创办一家叫 “老王包子铺” 的连锁店。我们就以老王创业为线索&…...

WPF 触发器 Trigger

触发器 Trigger 触发器&#xff08;Trigger&#xff09;是 WPF 中的一种机制&#xff1a; 当某个条件满足时&#xff0c;自动改变控件的某些属性&#xff0c;比如颜色、大小、透明度等。 换句话说&#xff0c;就是"如果……那么就……" 的一种规则。 常见触发器类…...

CentOS算法部署

CentOS服务部署 第一章 启动两个算法服务第一步&#xff1a;上传算法文件第二步&#xff1a;安装 tmux第三步&#xff1a;启动服务&#xff08;1&#xff09; 启动第一个算法服务&#xff08;2&#xff09; 启动第二个算法服务 第四步&#xff1a;关闭防火墙 第一章 启动两个算…...

极狐GitLab 命名空间的类型有哪些?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的&#xff0c;您可以在多个命名空间中使用相同的项…...

使用 Apache POI 生成包含文本和图片的 Word 文档

一、概述 在实际开发场景中&#xff0c;我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库&#xff0c;实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片&#xff0c;并且对图片进行等比缩放处理&#xff0c;以保证图片…...

Eclipse通过Tomcat启动web项目报错

错误内容&#xff1a;Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext。 本来运行的好好的&#xff0c;执行了Maven->Update Porject后就报上面的错。 通过检查发现&#xff0c;执行上面的命令后会将下面截图中的maven depen…...