k8s 中的金丝雀发布(灰度发布)

目录

1 什么是金丝雀发布

2 Canary 发布方式

3 Canary 两种发布方式实操

3.1 准备工作

3.1.1 将 nginx 命名两个版本 v1 与 v2

3.1.2 暴露端口并指定微服务类型

3.1.3 进入 pod 修改默认发布文件

3.1.4 测试 service 是否正常

 3.2 基于权重的灰度发布

3.2.1 创建 Igress 资源类型文件

3.2.2 解释关于配置文件的意思

3.2.3 声明 Igress 文件

3.2.4 客户端测试

3.3 基于客户端请求的灰度发布

3.3.1 如何实现客户端请求的灰度发布介绍

3.3.2 创建 Igress 资源类型文件

3.3.3 关于配置文件的解释:

3.3.4 声明 Igress 文件

3.3.5 客户端进行测试


1 什么是金丝雀发布

金丝雀发布(Canary Release)也称为灰度发布,是一种软件发布策略。

主要目的是在将新版本的软件全面推广到生产环境之前,先在一小部分用户或服务器上进行测试和验证,以降低因新版本引入重大问题而对整个系统造成的影响。

是一种Pod的发布方式。金丝雀发布采取先添加、再删除的方式,保证Pod的总量不低于期望值。并且在更新部分Pod后,暂停更新,当确认新Pod版本运行正常后再进行其他版本的Pod的更新。

2 Canary 发布方式

其中header和weight中的最多

3 Canary 两种发布方式实操

3.1 准备工作

3.1.1 将 nginx 命名两个版本 v1 与 v2

# 创建版本v1的deployment资源类型的nginx
[root@k8s-master ingress]# kubectl create deployment nginx-v1 \
--image nginx:latest \
--dry-run=client \
--port 80 \
--replicas 1  \
-o yaml > nginx-v1.yml

[root@k8s-master ingress]# cat nginx-v1.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-v1    # 此标签一定要与微服务的标签对得上,不然微服务无法找到deployment
  name: nginx-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-v1
  template:
    metadata:
      labels:
        app: nginx-v1
    spec:
      containers:
      - image: nginx:latest
        name: nginx-v1
        ports:
        - containerPort: 80

# 创建版本 v2 的 deployment 资源类型的 nginx
[root@k8s-master ingress]# kubectl create deployment nginx-v2 \
--image nginx:latest \
--dry-run=client \
--port 80 \
--replicas 1  \
-o yaml > nginx-v2.yml

[root@k8s-master ingress]# cat nginx-v2.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-v2
  name: nginx-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-v2
  template:
    metadata:
      labels:
        app: nginx-v2
    spec:
      containers:
      - image: nginx:latest
        name: nginx-v2
        ports:
        - containerPort: 80


# 声明这两个版本的清单文件
[root@k8s-master ingress]# kubectl apply -f nginx-v1.yml 
deployment.apps/nginx-v1 created

[root@k8s-master ingress]# kubectl apply -f nginx-v2.yml 
deployment.apps/nginx-v2 created

# 查看deployment是否正常运行
[root@k8s-master ingress]# kubectl get deployments.apps 
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
nginx-v1   1/1     1            1           12s
nginx-v2   1/1     1            1           6s

3.1.2 暴露端口并指定微服务类型

创建微服务清单文件并将其加入到deployment的清单文件中

# 创建清单文件追加到deployment清单文件中
[root@k8s-master ingress]# kubectl expose deployment nginx-v1 \
--name=svc-nginx-v1 \
--port 80 --target-port 80 \
--dry-run=client \
--type=ClusterIP -o yaml >> nginx-v1.yml 

[root@k8s-master ingress]# kubectl expose deployment nginx-v2 \
--name=svc-nginx-v2 --port 80 --target-port 80 \
--dry-run=client \
--type=ClusterIP -o yaml >> nginx-v2.yml 

[root@k8s-master ingress]# cat nginx-v1.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-v1
  name: nginx-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-v1
  template:
    metadata:
      labels:
        app: nginx-v1
    spec:
      containers:
      - image: nginx:latest
        name: nginx-v1
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-v1
  name: svc-nginx-v1
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-v1
  type: ClusterIP



[root@k8s-master ingress]# cat nginx-v2.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-v2
  name: nginx-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-v2
  template:
    metadata:
      labels:
        app: nginx-v2
    spec:
      containers:
      - image: nginx:latest
        name: nginx-v2
        ports:
        - containerPort: 80
---        
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-v2
  name: svc-nginx-v2
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-v2
  type: ClusterIP


# 重新声明更新配置

[root@k8s-master ingress]# kubectl apply -f nginx-v1.yml 

[root@k8s-master ingress]# kubectl apply -f nginx-v2.yml 

# 服务创建成功
[root@k8s-master ingress]# kubectl get service
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes     ClusterIP   10.96.0.1        <none>        443/TCP   3d22h
svc-nginx-v1   ClusterIP   10.107.76.175    <none>        80/TCP    15s
svc-nginx-v2   ClusterIP   10.100.188.171   <none>        80/TCP    9s

3.1.3 进入 pod 修改默认发布文件

[root@k8s-master ingress]# kubectl get pods 
NAME                       READY   STATUS    RESTARTS   AGE
nginx-v1-dbd4bc45b-49hhw   1/1     Running   0          5m35s
nginx-v2-bd85b8bc4-nqpv2   1/1     Running   0          5m29s

[root@k8s-master ingress]# kubectl exec -it pods/nginx-v1-dbd4bc45b-49hhw -- bash

root@nginx-v1-dbd4bc45b-49hhw:/# echo this is nginx-v1 `hostname -I` > /usr/share/nginx/html/index.html 

[root@k8s-master ingress]# kubectl exec -it pods/nginx-v2-bd85b8bc4-nqpv2 -- bash

root@nginx-v2-bd85b8bc4-nqpv2:/# echo this is nginx-v2 `hostname -I` > /usr/share/nginx/html/index.html 

3.1.4 测试 service 是否正常

[root@k8s-master ingress]# kubectl get service
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes     ClusterIP   10.96.0.1        <none>        443/TCP   3d22h
svc-nginx-v1   ClusterIP   10.107.76.175    <none>        80/TCP    15s
svc-nginx-v2   ClusterIP   10.100.188.171   <none>        80/TCP    9s

[root@k8s-master ingress]# curl 10.107.76.175
this is nginx-v1 10.244.2.54

[root@k8s-master ingress]# curl 10.100.188.171
this is nginx-v2 10.244.1.35

 3.2 基于权重的灰度发布

3.2.1 创建 Igress 资源类型文件

[root@k8s-master Cannary]# kubectl create ingress canary --class nginx \
--rule "nginx.shuyan.com/=svc-nginx-v1:80" \
--dry-run=client -o yaml > canary.yml

[root@k8s-master Cannary]# kubectl create ingress canary --class nginx \
--rule "nginx.shuyan.com/=svc-nginx-v2:80" \
--dry-run=client -o yaml >> canary.yml

# 以下是修改过后的资源类型
[root@k8s-master Cannary]# cat canary.yml 
# 第一个Ingress定义,用于常规服务
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-v1  # 定义Ingress的名称
spec:
  ingressClassName: nginx  # 指定使用的Ingress控制器类型
  rules:
  - host: nginx.shuyan.com  # 设置主机名,所有的请求都会被转发到这个域名下的服务
    http:
      paths:
      - backend:
          service:
            name: svc-nginx-v1  # 指定后端服务的名字
            port:
              number: 80  # 指定后端服务监听的端口
        path: /  # 所有访问根路径的请求都会被转发到此服务
        pathType: Prefix  # 路径类型为前缀,表示所有以"/"开头的请求都将被转发到此服务

---

# 第二个Ingress定义,用于灰度发布服务
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:  # 添加注解来控制灰度发布
    nginx.ingress.kubernetes.io/canary: "true"  # 开启灰度发布模式
    nginx.ingress.kubernetes.io/canary-weight: "10"  # 设置灰度发布的权重为10%,即10%的流量会被路由至此服务
    nginx.ingress.kubernetes.io/canary-weight-total: "100"  # 这个注解并不是标准NGINX Ingress Controller支持的,可以忽略
  name: canary-v2  # 定义Ingress的名称
spec:
  ingressClassName: nginx  # 指定使用的Ingress控制器类型
  rules:
  - host: nginx.shuyan.com  # 设置主机名,所有的请求都会被转发到这个域名下的服务
    http:
      paths:
      - backend:
          service:
            name: svc-nginx-v2  # 指定后端服务的名字
            port:
              number: 80  # 指定后端服务监听的端口
        path: /  # 所有访问根路径的请求都会被转发到此服务
        pathType: Prefix  # 路径类型为前缀,表示所有以"/"开头的请求都将被转发到此服务

3.2.2 解释关于配置文件的意思

第一个Ingress (canary-v1):

  • 这个Ingress没有使用任何灰度发布的注解。
  • 它将处理所有发往 nginx.shuyan.com 的请求,并将这些请求路由到名为 svc-nginx-v1 的服务上。

第二个Ingress (canary-v2):

  • 使用了灰度发布的注解 nginx.ingress.kubernetes.io/canary: "true" 和nginx.ingress.kubernetes.io/canary-weight: "10"。
  • 这些注解表明该Ingress将处理一部分流量(本例中为10%),并将这部分流量路由到名为 svc-nginx-v2 的服务上。

3.2.3 声明 Igress 文件

[root@k8s-master Cannary]# kubectl apply -f canary.yml 
ingress.networking.k8s.io/canary-v1 created
ingress.networking.k8s.io/canary-v2 created

3.2.4 客户端测试

# 客户端添加解析
[root@harbor ~]# vim /etc/hosts
192.168.239.241  nginx.shuyan.com

# 测试
[root@harbor ~]# curl nginx.shuyan.com
this is nginx-v2 10.244.1.35
[root@harbor ~]# curl nginx.shuyan.com
this is nginx-v1 10.244.2.54
[root@harbor ~]# curl nginx.shuyan.com
this is nginx-v1 10.244.2.54
[root@harbor ~]# curl nginx.shuyan.com
this is nginx-v1 10.244.2.54
[root@harbor ~]# curl nginx.shuyan.com
this is nginx-v1 10.244.2.54
[root@harbor ~]# curl nginx.shuyan.com
this is nginx-v1 10.244.2.54

# 编写脚本循环测试

[root@harbor ~]# vim canary.sh
#!/bin/bash

# 初始化计数器
v1=0
v2=0

# 循环发送请求并统计结果
for (( i=0; i<100; i++ )); do
    # 发送请求并检查响应中是否包含 "v1"
    response=`curl -s nginx.shuyan.com | grep -c "v1"`

    # 根据响应结果更新计数器
    if [ "$response" -eq 1 ]; then
        ((v1++))
    else
        ((v2++))
    fi
done

# 输出统计结果
echo "v1: $v1, v2: $v2"

# 运行脚本进行测试
[root@harbor ~]# bash canary.sh 
v1: 88, v2: 12
[root@harbor ~]# bash canary.sh 
v1: 88, v2: 12
[root@harbor ~]# bash canary.sh 
v1: 90, v2: 10
[root@harbor ~]# bash canary.sh 
v1: 90, v2: 10
[root@harbor ~]# bash canary.sh 
v1: 87, v2: 13

 

3.3 基于客户端请求的灰度发布

3.3.1 如何实现客户端请求的灰度发布介绍

基于客户端请求的流量切分要求客户端在 HTTP 请求头中包含指定键值对或在 Cookie 中包含指定键值对。当 HTTP 请求头包含“canary=always”时,流量会被路由到新版本(Canary 版本),一旦新版本验证通过,流量就会被逐步切分到新版本。这种策略比较适合将特定的客户端请求路由到新版本,以便进行更具体的测试和验证。

3.3.2 创建 Igress 资源类型文件

# 回收以上实验的资源
[root@k8s-master Cannary]# kubectl delete -f canary.yml 

# 创建 ingress 清单文件

[root@k8s-master Cannary]# kubectl create ingress canary-cookie-old \
--class nginx \
--rule "nginx.shuyan.com/=svc-nginx-v1:80" \
--dry-run=client -o yaml > canary-cookie.yml 

[root@k8s-master Cannary]# kubectl create ingress canary-cookie-new \
--class nginx \
--rule "nginx.shuyan.com/=svc-nginx-v2:80" \
--dry-run=client -o yaml >> canary-cookie.yml 


# 修改部分参数

[root@k8s-master Cannary]# cat canary-cookie.yml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-cookie-old  # 定义第一个Ingress资源的名称
spec:
  ingressClassName: nginx  # 指定使用的Ingress控制器类型
  rules:
  - host: nginx.shuyan.com  # 设置主机名,所有请求都会被转发到这个域名下的服务
    http:
      paths:
      - backend:
          service:
            name: svc-nginx-v1  # 指定后端服务的名字
            port:
              number: 80  # 指定后端服务监听的端口
        path: /  # 所有访问根路径的请求都会被转发到此服务
        pathType: Prefix  # 路径类型为前缀,表示所有以"/"开头的请求都将被转发到此服务

---
# 分割线,表示这是一个新的Ingress资源定义

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: canary-cookie-new  # 定义第二个Ingress资源的名称
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"  # 开启灰度发布模式
    nginx.ingress.kubernetes.io/canary-by-header: "canary"  # 指定使用HTTP头部来区分流量
    nginx.ingress.kubernetes.io/canary-by-header-value: "new"  # 指定HTTP头部的值为"new"时,请求会被路由到新版本服务
spec:
  ingressClassName: nginx  # 指定使用的Ingress控制器类型
  rules:
  - host: nginx.shuyan.com  # 设置主机名,所有请求都会被转发到这个域名下的服务
    http:
      paths:
      - backend:
          service:
            name: svc-nginx-v2  # 指定后端服务的名字
            port:
              number: 80  # 指定后端服务监听的端口
        path: /  # 所有访问根路径的请求都会被转发到此服务
        pathType: Prefix  # 路径类型为前缀,表示所有以"/"开头的请求都将被转发到此服务

3.3.3 关于配置文件的解释:


第一个Ingress (canary-cookie-old):

  • 这个Ingress没有使用任何灰度发布的注解。
  • 它将处理所有发往 nginx.shuyan.com 的请求,并将这些请求路由到名为 svc-nginx-v1 的服务上。

第二个Ingress (canary-cookie-new):

  • 使用了灰度发布的注解 nginx.ingress.kubernetes.io/canary: "true" 来开启灰度发布模式。
  • 使用 nginx.ingress.kubernetes.io/canary-by-header: "canary" 来指定使用HTTP头部来区分流量。
  • 使用 nginx.ingress.kubernetes.io/canary-by-header-value: "new" 来指定HTTP头部的值为 "new" 时,请求会被路由到新版本服务 svc-nginx-v2。

工作原理:

  • 当客户端请求包含头部 canary: new 时,请求将会被路由到 svc-nginx-v2。
  • 如果客户端请求不包含头部 canary: new,请求将会被路由到 svc-nginx-v1。

3.3.4 声明 Igress 文件

[root@k8s-master Cannary]# kubectl apply -f canary-cookie.yml 
ingress.networking.k8s.io/canary-cookie-old created
ingress.networking.k8s.io/canary-cookie-new created

# 查看是否正常创建
[root@k8s-master Cannary]# kubectl get ingress
NAME                CLASS   HOSTS              ADDRESS           PORTS   AGE
canary-cookie-new   nginx   nginx.shuyan.com   192.168.239.241   80      53s
canary-cookie-old   nginx   nginx.shuyan.com   192.168.239.241   80      53s


[root@k8s-master Cannary]# kubectl describe ingress 
Name:             canary-cookie-new
Labels:           <none>
Namespace:        default
Address:          192.168.239.241
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host              Path  Backends
  ----              ----  --------
  nginx.shuyan.com  
                    /   svc-nginx-v2:80 (10.244.1.35:80)
Annotations:        nginx.ingress.kubernetes.io/canary: true
                    nginx.ingress.kubernetes.io/canary-header: canary
                    nginx.ingress.kubernetes.io/canary-header-value: new
Events:
  Type    Reason  Age                    From                      Message
  ----    ------  ----                   ----                      -------
  Normal  Sync    7m37s (x2 over 8m18s)  nginx-ingress-controller  Scheduled for sync


Name:             canary-cookie-old
Labels:           <none>
Namespace:        default
Address:          192.168.239.241
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host              Path  Backends
  ----              ----  --------
  nginx.shuyan.com  
                    /   svc-nginx-v1:80 (10.244.2.54:80)
Annotations:        <none>
Events:
  Type    Reason  Age                    From                      Message
  ----    ------  ----                   ----                      -------
  Normal  Sync    7m37s (x2 over 8m19s)  nginx-ingress-controller  Scheduled for sync

3.3.5 客户端进行测试

# 客户端添加解析
[root@harbor ~]# vim /etc/hosts
192.168.239.241  nginx.shuyan.com

# 没带 cookie 值的就会被访问到 v1 去
[root@harbor ~]# curl -s  nginx.shuyan.com
this is nginx-v1 10.244.2.54

# 带 cookie 值的就会访问到 v2 去
[root@harbor ~]# curl -s  -H "canary: new" nginx.shuyan.com
this is nginx-v2 10.244.1.35

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/888807.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享我“Excel 表格”关键字的博客笔记(python脚本全程自动)

Python脚本全程自动&#xff0c;全部Python内建工具脚本纯净。 (笔记模板由python脚本于2024年10月05日 19:51:06创建&#xff0c;本篇笔记适合喜欢Excel和Python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大…

ubuntu双系统分区划分

EFI系统分区&#xff08;Windows&#xff09;&#xff1a;自Windows 8起&#xff0c;UEFI模式下的BIOS使用该分区。简单来说&#xff0c;它用于存储已安装系统的EFI引导程序。此分区在资源管理器中无法查看&#xff0c;因为它没有驱动器号&#xff0c;但它必须存在&#xff0c;…

前端登录页面验证码

首先&#xff0c;在el-form-item里有两个div&#xff0c;各占一半&#xff0c;左边填验证码&#xff0c;右边生成验证码 <el-form-item prop"code"><div style"display: flex " prop"code"><el-input placeholder"请输入验证…

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…

数据校验的总结

业务层进行复杂检查 简单校验交给Controller校验&#xff0c;能流到业务的层的数据就是基本合法 引入依赖&#xff1a;spring-boot-starter-validation 能标注的所有注解在这两个地方看 jakarta.validation.constraints、 org.hibernate.validator.constraints 使用步骤…

Web APIs——Dom获取属性操作

1.变量声明 1.1以后声明变量我们优先使用哪个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 1.2 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#x…

2024 ciscn WP

一、MISC 1.火锅链观光打卡 打开后连接自己的钱包&#xff0c;然后点击开始游戏&#xff0c;答题八次后点击获取NFT&#xff0c;得到有flag的图片 没什么多说的&#xff0c;知识问答题 兑换 NFT Flag{y0u_ar3_hotpot_K1ng} 2.Power Trajectory Diagram 方法1&#xff1a; 使用p…

《Programming from the Ground Up》阅读笔记:p147-p180

《Programming from the Ground Up》学习第9天&#xff0c;p147-p180总结&#xff0c;总计34页。 一、技术总结 1.Physical memeory p152, Physical memory refers to the actual RAM chips inside your computer and what they contain. 物理地址指的RAM&#xff0c;即我们…

库函数相关(上一篇补充)

一、创建自己的头文件 在当前目录下创建一个my_head.h将这个文件移动到/usr/include目录 #ifndef __MY_HEAD_H__ #define __MY_HEAD_H__#include <stdio.h> #include <errno.h> #include <string.h>#define PRINT_ERR(s) do{\printf("%s %s %d\n&quo…

minio简单使用

文章目录 简介官方地址Linux下载安装安装服务启动关闭帮助命令 java开发minio依赖包新建项目pom配置文件配置类Service测试类运行测试 Api使用前言针对桶的操作查看某个桶是否存在创建一个桶返回桶列表删除一个桶 针对文件的操作上传文件到桶中(本地文件上传)上传文件到桶中(基…

猴子吃桃-C语言

1.问题&#xff1a; 猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c;见只剩下一个…

【学习笔记】一种使用多项式快速计算 sin 和 cos 近似值的方法

一种使用多项式快速计算 sin 和 cos 近似值的方法 在嵌入式开发、游戏开发或其他需要快速数学计算的领域&#xff0c;sin 和 cos 函数的计算时间可能会影响程序的整体性能。特别是在对时间敏感、精度要求不高的场景中&#xff0c;传统的 sin 和 cos 函数由于依赖复杂的数值方法…

【UE】简单介绍“Extra Win Function”插件的功能

“Extra Win Function”插件包含32个C类封住成的蓝图节点供用户使用&#xff0c;下面简单介绍19个可能常用的节点的功能。 1. “Is Internet Available” 检查是否可接入互联网 2. “Get Device Platform” 获取设备平台名称 3. “Get Android Device RAMSize” 获取RAM 大小 …

【Java SE基础回顾】看这篇就够了!

JavaSE复习 参考视频&#xff1a;【狂神说Java】JavaSE阶段回顾总结 简单的就不讲了&#xff0c;比如什么break和continue区别&#xff0c;甚至一些什么什么继承封装多态的概念等等。 主要写一些Java特有的&#xff0c;重点的基础知识。主要还是例子和代码更多&#xff0c;更有…

Android Preference的使用以及解析

简单使用 values.arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><string-array name"list_entries"><item>Option 1</item><item>Option 2</item><item>Option 3</item&…

衡石分析平台系统管理手册-智能运维之系统设置

系统设置​ HENGSHI 系统设置中展示了系统运行时的一些参数&#xff0c;包括主程序相关信息&#xff0c;Base URL、HTTP 代理、图表数据缓存周期、数据集缓存大小、租户引擎等相关信息。 主程序​ 系统设置中展示了主程序相关信息&#xff0c;这些信息是系统自动生成的&#…

Linux 之 Linux应用编程概念、文件IO、标准IO

Linux应用编程概念、文件IO、标准IO 学习任务&#xff1a; 1、 学习Linux 应用开发概念&#xff0c;什么是系统调用&#xff0c;什么是库函数 2、 学习文件IO&#xff1a;包括 read、write、open、close、lseek 3、 深入文件IO&#xff1a;错误处理、exit 等 4、 学习标准IO&a…

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清&#xff1a; 1.首先&#xff0c;tcp四次挥手只有主动和被动方之分&#xff0c;没有客户端和服务端的概念 2.其次&#xff0c;发送报文段是tcp协议栈的行为&#xff0c;用户态调用close会陷入到内核态 3.再者&#xff0c;图中的情况前提是双…

什么是PLM系统?PLM系统对制造业起到哪些作用?三品PLM系统对汽车制造业意义

在当今竞争激烈的制造业环境中&#xff0c;企业面临着来自市场、技术、客户需求等多方面的挑战。为了应对这些挑战&#xff0c;许多制造企业纷纷引入产品生命周期管理PLM系统&#xff0c;以实现更高效、更灵活的产品全生命周期管理。PLM系统以其独特的优势&#xff0c;在优化产…

【RAG论文精读3】RAG论文综述1(2312.10997)-第1部分

更多AI知识点总结见我的专栏&#xff1a;【AI知识点】 AI论文精读、项目和一些个人思考见我另一专栏&#xff1a;【AI修炼之路】 有什么问题、批评和建议都非常欢迎交流&#xff0c;三人行必有我师焉&#x1f601; 简介 论文中英文名 Retrieval-Augmented Generation for Lar…