【Linux-云原生-笔记】Haproxy相关

一、概念

HAProxy(High Availability Proxy)是一款开源的高性能 TCP/HTTP 负载均衡器 和 反向代理 软件,被广泛应用于构建高可用、高并发的现代网络架构。

核心功能:

  1. 负载均衡(Load Balancing)

    • 支持四层(TCP)和七层(HTTP/HTTPS)流量分发。

    • 提供多种调度算法:轮询(roundrobin)、最少连接(leastconn)、源IP哈希(source)等。

  2. 反向代理(Reverse Proxy)

    • 隐藏后端服务器细节,对外提供统一入口。

    • 支持 SSL 终端(SSL Termination),卸载后端服务器加密负担。

  3. 高可用(High Availability)

    • 结合 Keepalived 实现双机热备(VRRP 协议)。

  4. 流量治理

    • 请求过滤、速率限制、连接控制等。

多层级负载均衡

层级协议支持典型场景
四层(L4)TCP/UDP数据库集群、Redis、SSH 跳板
七层(L7)HTTP/HTTPS/HTTP2/3Web 应用、API 网关、微服务路由

与 Nginx/LVS 对比

特性HAProxyNginxLVS
协议支持★★★ (TCP/HTTP/SSL)★★★ (HTTP/SSL)★★ (TCP/UDP)
七层能力★★★ (ACL/重写/缓存)★★★✘ (仅四层)
性能★★★ (L4/L7 均优)★★ (HTTP 强)★★★ (L4 极致)
配置灵活性★★★ (DSL 语法)★★ (类 C 配置)★ (ipvsadm 命令行)
健康检查★★★ (多协议支持)★★★ (基础 TCP 检查)

二、实验

1、实验环境的搭建

准备3台主机:

主机1

主机名:haproxy

ip:172.25.254.100

主机2

主机名:hp-RS1

ip:172.25.254.10

主机3

主机名:hp-RS2

ip:172.25.254.20

(1)软件包安装

两台RS都安装nginx:

设置开机自启动(两个都设置)

(2)关闭火墙

两台RS关闭火墙:

(3)两台RS设置nginx的index.html内容

设置这个是方便后续测试

(4)连通测试

haproxy主机curl一下两台RS 

连接成功

实验环境搭建完毕

(5)方便码字的tab键设置

2、haproxy的安装和frontend区

(1)安装haproxy

dnf安装

  

启动服务

(2)进入haproxy配置文件

进入编写

wq

重启服务

3、global配置(多进程与多线程)

(1)global配置参数解释

配置区域在/etc/haproxy/haproxy.conf的global区

参数说明示例必要性
daemon以守护进程(后台)模式运行daemon✅ 生产必选
user
group
指定运行用户/用户组(降权运行)user haproxy
group haproxy
✅ 安全必选
chroot切换根目录(增强安全性)chroot /var/lib/haproxy⚠️ 可选
nbproc工作进程数(CPU 核数绑定)nbproc 4⚠️ 高并发必选
nbthread每进程线程数(需启用线程)nbthread 2⚠️ 现代 CPU 优化
stats socket管理套接字路径(动态调整配置)stats socket /run/haproxy/admin.sock⚠️ 运维必选

(2)多进程与多线程

1)多进程(nbproc)

开启多进程则进入haproxy的配置文件

wq

解释:

  • nbproc 2 —— 启用多进程,2个进程
  • cpu-map 1 0 ——  进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗,1表示指定第一个work绑定第一个核心,0表示第一个核心,核心从0开始算(类似数组下标)
  • cpu-map 2 1 —— 指定第二个work绑定第二个cpu核心

重启服务

查看多进程信息

2)多线程(nbthread)

开启多线程也是进入haproxy的配置文件

wq 

解释:

nbthread —— 启动多线程,线程数为2 

多线程和多进程只能存在一个,另一个要#号引掉

查看多线程

[root@haproxy ~]# cat /proc/1653/status

数字1653是刚刚查看的进程id

未开启前,thread为1

而修改完,重启服务后

重启服务后,要先pstree才有进程id哦

thread变为2 

 

这就是多线程

4、socat工具

socat 是 HAProxy 生态中不可替代的底层诊断工具,它通过直接访问 HAProxy 的 Unix 管理套接字实现高级运维操作。


为什么需要 socat

场景传统方案痛点socat 解决方案
动态服务器状态调整需重载配置(中断连接)实时启用/禁用服务器(零中断)
紧急故障屏蔽修改配置+重载耗时 >30s1秒内下线故障节点
内存泄漏分析依赖外部监控工具直接dump进程内存结构
流诊断抓包分析复杂实时镜像指定流量

(1)安装

dnf安装socat

(2)修改配置文件

进入haproxy配置文件:

进入编辑:

(3)常用示例

1)查看haproxy状态
echo "show info" | socat stdio /var/lib/haproxy/stats

2) 查看集群状态
echo "show servers state" | socat stdio /var/lib/haproxy/stats

3)查看集群权重
echo get weight webcluster/web1 | socat stdioecho get weight webcluster/web2 | socat stdio

4)设置权重
echo "set weight webcluster/web1 1 " | socat stdio /var/lib/haproxy/stats

可以查看一下设置成功没:

成功

5)下线后端服务器
echo "disable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats

6)上线后端服务器
echo "enable server webcluster/web1 " | socat stdio /var/lib/haproxy/stats

5、haproxy算法 

(1)static-rr

  • 原理: 也是轮询算法,但不支持运行时权重动态调整

  • 权重支持: 支持,但权重在启动时确定后,在运行时无法通过运行时 API 动态修改(而 roundrobin 可以)。

  • 特点: 比 roundrobin 稍简单一些,开销略低。如果确定不需要在运行时动态调整权重,可以使用此算法。


static-rr不支持热更新:

 测试

(2)first

  • 原理: 按照服务器在配置文件中声明的顺序进行分配。将请求分配给列表中第一个可用的服务器。仅当第一个服务器达到其最大连接数 (maxconn) 时,才会分配给下一个可用的服务器。 一旦某个服务器连接数降到 maxconn 以下,新请求又会优先分配给它。

  • 权重支持: 不支持

  • 特点: 尽量将流量集中到列表前面的服务器,直到它们满载。可能导致负载分布非常不均衡,前面的服务器压力很大,后面的服务器很空闲。


 

测试

都是RS1,因为要等RS1满了,才会轮到到RS2

(3)roundrobin

  • 原理: 最常用、最经典的轮询算法。按顺序依次将新请求分配给后端服务器列表中的下一个服务器。循环往复。

  • 权重支持: 支持。服务器可以配置权重 (weight)。权重高的服务器在轮询周期内会获得更多比例的请求。

  • 特点: 简单、公平、可预测。在服务器性能相近且请求处理时间相对均匀时效果很好。


测试

标准的轮询

(4)leastconn

  • 原理: 最少连接数算法。 将新请求分配给当前活跃连接数最少的后端服务器。

  • 权重支持: 支持。计算时会考虑权重。实际比较的是 (当前连接数) / (权重)。值最小的服务器胜出。权重高的服务器能承受更多连接。

  • 特点: 非常适合处理时间差异很大的请求(例如数据库连接、长连接应用如 WebSocket、消息队列)。能更公平地根据服务器实际处理能力分配负载。


测试 

和轮询差不多

(5)source

  • 原理: 源 IP 地址哈希。 使用客户端的源 IP 地址计算哈希值,决定分配到哪个后端服务器。

  • 权重支持: 不支持。哈希结果直接映射到服务器,权重不影响哈希分配本身(但影响服务器池的组成)。

  • 特点: 确保来自同一个客户端的请求总是落到同一台服务器(只要服务器池不变)。简单但不够灵活,如果客户端使用代理或 NAT,大量不同用户可能共享同一个源 IP,导致负载不均衡。


测试

(6)uri

  • 原理: 整个 URI 哈希。 使用 HTTP 请求的完整 URI(包括路径和查询参数,例如 /path/page?param=value)计算哈希值。

  • 权重支持: 不支持

  • 特点: 将访问相同 URI 的请求固定到同一服务器。有助于利用服务器本地的缓存(如果缓存是基于 URI 的)。


测试

(7)url-param

  • 原理: URL 参数值哈希。 使用 HTTP 请求 URL 中指定的查询字符串参数的值计算哈希值。需要配置参数名(例如 url_param userid)。

  • 权重支持: 不支持

  • 特点: 非常灵活,可以根据业务关键参数(如用户 ID userid=123、会话 ID sessionid=abc)进行会话保持。


 测试

(8)hdr 

  • 原理: HTTP 头哈希。 使用指定的 HTTP 请求头的值计算哈希值。需要配置头名称(例如 hdr(Cookie)hdr(Host))。

  • 权重支持: 不支持

  • 特点: 极其灵活,可以利用任何 HTTP 头信息做会话保持,最常用的是 Cookie 头。


测试

模拟不同的浏览器访问时:

浏览器browser1访问,RS1接待

浏览器browser2访问,就变成RS2接待了 

6、cookie

(1)概念

HAProxy 中的 cookie 指令是实现 会话保持(Session Persistence)或粘性会话(Sticky Session) 最常用、最强大且推荐的方式之一。它通过在客户端的浏览器中设置或利用一个特定的 Cookie,确保来自同一用户的后续请求能被 HAProxy 正确地路由到最初处理其请求的同一台后端服务器。

  1. 目的: 解决有状态应用(Stateful Application)的问题。例如,用户的购物车数据、登录会话信息等通常存储在特定后端服务器的内存或本地缓存中。如果用户的后续请求被负载均衡到不同的服务器,这些状态信息将丢失,导致应用出错。

  2. 原理:

    • HAProxy 在将第一个响应返回给客户端时(或者在某些模式下处理第一个请求时),会插入(Insert) 或改写(Rewrite) 一个特殊的 HTTP Set-Cookie 响应头。

    • 这个 Cookie 的值通常直接包含间接映射到处理该请求的后端服务器的标识符(通常是 server 块中定义的 cookie 值或内部 ID)。

    • 客户端浏览器收到这个 Cookie 后会存储它,并在后续向同一域名发送请求时,自动在 Cookie 请求头中携带它。

    • HAProxy 接收到后续请求时,会解析该 Cookie 的值,提取出服务器标识符,并直接将请求转发到对应的服务器,绕过负载均衡算法。


(2)实验举例 

测试

-b 指定cookie值

可以看到访问cookie值为servera时,被调度到RS1处理; cookie值为serverb时,被调度到RS2处理

与我们在haproxy配置文件里配置的一致

7、HAProxy状态页

HAProxy 的状态页(Stats Page) 是实时监控负载均衡集群的核心工具,通过 Web 页面展示关键性能指标和后端节点状态。

(1)各种参数解析

基础配置项解析

参数说明示例
stats enable启用状态页(无此选项则不生效)stats enable
stats uri状态页访问路径stats uri /admin?stats
stats auth基础认证(明文用户/密码)stats auth admin:SecurePass123
stats refresh页面自动刷新间隔(秒)stats refresh 5s
stats bind监听地址和端口(默认同 frontend)stats bind :1936

进阶安全控制 

参数说明生产环境示例
stats hide-version隐藏 HAProxy 版本号(防漏洞扫描)stats hide-version
stats admin动态启用管理功能(条件触发)stats admin if { src 10.0.0.0/24 }
stats http-request集成 ACL 复杂控制stats http-request allow if { src -f /etc/haproxy/allowlist }
stats realm认证对话框提示文本stats realm "HAProxy Protected"

(2)实验

解释:

  • listen haproxystatus —— 定义名为 "haproxystatus" 的监听块
  • mode    http —— 使用 HTTP 模式(七层代理)
  • bind    *:9999 —— 绑定所有网络接口的 9999 端口
  • stats   enable —— 启用状态统计页面
  • log     global —— 使用全局日志配置
  • stats   uri /status —— 设置状态页的访问路径为 /status
  • stats   auth lincoln:lincoln —— 设置访问认证的用户名/密码

重启服务时如果报错:

可能是SELinux的原因,把其关闭:

 

再试一次应该就没报错了

测试

浏览器访问刚刚写的端口号9999,后面加/status

http://172.25.254.100:9999/status

出现输入用户名和密码,输入刚刚设定的,这里我设定的是自己的名字: 

登录成功后,访问到页面:

8、IP透传

HAProxy 的 IP 透传 是指将原始客户端的真实 IP 地址传递给后端服务器,而不是让后端服务器只看到 HAProxy 自身的 IP 地址。这对于后端应用至关重要,因为它需要知道真实的客户端信息来进行日志记录、访问控制、地理定位、速率限制、安全审计等操作。

HAProxy 本身作为反向代理或负载均衡器,是客户端与后端服务器之间的中间节点。默认情况下,后端服务器看到的 TCP 连接源 IP 地址就是 HAProxy 的 IP 地址。


(1)7层ip透传

haproxy工作在七层的时候,也可以透传客户端真实IP至后端服务器

进入haproxy配置文件

开启Listen就把frontend和backend关了

(2)4层ip透传

1)未开启时

未开启4层ip透传时的各种配置:

haproxy.cfg

nginx.conf(两台RS)

未开启4层ip透传时的访问测试极其日志:

访问测试

日志查看

在一台RS上查看nginx日志会发现,其真实访问源地址是看不到的(红框为-)


2)开启时 

 开启4层ip透传时的各种配置:

nginx.conf(两台RS)

haproxy.cfg

 开启4层ip透传时的访问测试极其日志:

访问测试

查看日志nginx

这样就看到源ip地址了

9、ACL

HAProxy 的 ACL 是其核心功能之一,用于定义复杂的流量匹配规则,实现基于请求内容(如 URL、Header、IP、路径等)的智能路由、过滤或决策。


(1)Client里做解析

先在Client里做域名解析,不然后续测试访问不了

解析在/etc/hosts做

这样就有解析了

(2)基本配置

开启frontend、backend

其余的Listen引掉

(3)ACL配置选项

1)基本语法

acl <acl_name> <匹配条件类型> <匹配参数> [标志]

解释:

  • acl名称(ACL-Name)               —— 可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大小写
  • 匹配条件类型(ACL-criterion)—— 下面另外列表解释
  • 匹配参数                                     —— 匹配的具体值(如 /apiUser-Agent192.168.1.0/24
  • 标志                                            —— 可选修饰符(如 -i 忽略大小写,-m 匹配模式)
2)常用匹配条件类型(ACL-criterion)详解:

路径匹配 (URL Path)

条件类型说明示例
path精确匹配路径acl exact_path path /login
path_beg路径开头匹配acl is_api path_beg /api
path_end路径结尾匹配acl is_jpg path_end .jpg
path_sub路径包含子串acl has_id path_sub /user/
path_dir包含目录匹配acl in_images path_dir /images/
path_reg正则表达式匹配acl uuid_path path_reg ^/user/[0-9a-f]{8}-
path_len路径长度比较acl long_path path_len gt 100

域名/主机头匹配 (Host)

条件类型说明示例
hdr(host)精确匹配 Host 头acl main_site hdr(host) www.example.com
hdr_reg(host)正则匹配 Hostacl subsite hdr_reg(host) ^app..example.com$
dom同 hdr(host) (旧式写法)acl legacy dom legacy.example.com

IP地址匹配

条件类型说明示例
src源IP匹配acl lan src 192.168.1.0/24
src_port源端口匹配acl high_port src_port gt 1024
dst目标IP匹配acl vip dst 10.0.0.100
dst_port目标端口匹配acl https_port dst_port 443

HTTP头部匹配

语法说明示例
hdr(<name>)检查头部存在/值acl has_token hdr(X-Auth-Token) -m found
hdr_reg(<name>)正则匹配头部值acl is_bot hdr_reg(User-Agent) (bot|crawl)
hdr_sub(<name>)头部包含子串acl is_curl hdr_sub(User-Agent) curl
hdr_beg(<name>)头部开头匹配acl is_moz hdr_beg(User-Agent) Mozilla
hdr_cnt(<name>)头部数量检查acl many_cookies hdr_cnt(Cookie) gt 5

HTTP方法/版本

条件类型说明示例
methodHTTP方法匹配acl is_post method POST
method_len方法长度比较acl long_method method_len gt 5
verHTTP版本acl http2 ver 2

3)标志项详解
标志说明示例
-i忽略大小写hdr(host) -i EXAMPLE.COM
-m匹配模式-m str:字符串匹配
-m beg:开头匹配
-m end:结尾匹配
-m sub:子串匹配
-m reg:正则匹配
-m found:存在即匹配
-f从文件加载src -f /path/to/ip.list
-n数值比较path_len -n gt 100

(4)ACL配置选项的实验(举一个例子)

1)添加基础acl规则和hdr_dom(host)

解释:

  • hdr_dom(host) —— 精确匹配 Host 头
  • -i —— 忽略大小写
  • www.lincoln.org —— hdr_dom(host)所匹配的域名
  • if test —— 条件语句,即匹配test这个acl规则

测试

可以看到,设置了acl规则后,我们访问www.lincoln.org就会到RS1主机,这就是acl规则

(5)实验——域名匹配

进入haproxy的配置文件

测试结果:

[root@Client ~]# curl www.lincoln.org
RS1 - 172.25.254.10
[root@Client ~]# curl www.lincoln.org
RS2 - 172.25.254.20

10、自定义错误页面

(1)概念

在 HAProxy 中,自定义报错页面是一项关键功能,它允许你替换 HAProxy 生成的默认错误响应(通常是简短、技术性的纯文本或 JSON),为用户或客户端提供更友好、更专业、更具品牌特色或包含更多指导信息的 HTML 错误页面。

(2)实验

写了Listen的话frontend和backend就要记得关闭!

建立自定义报错文件

 

测试

关闭两个RS的nginx,模拟服务断开

然后浏览器访问ip,就能看到自定义报错界面了

11、HAProxy 四层负载

HAProxy 是一个高性能、高可用性的负载均衡器和反向代理软件。它的四层负载均衡模式,通常称为 TCP 模式或 Layer 4 (L4) 模式,专注于在传输层(TCP) 工作。这意味着 HAProxy 在此模式下不解析应用层协议(如 HTTP)的内容,它只处理 TCP 连接本身。


(1)实验—— MySQL 服务实现四层负载

 

两台RS安装mariadb-server

Client安装mariadb(注意不是mariadb-server)

测试

12、证书

(1)证书制作

所有主机都关闭SELinux(命令setenforce 0)

解释:

  1. openssl req

    • 这是 OpenSSL 的子命令,用于处理证书签名请求。虽然名字叫 req,但结合 -x509 选项时,它可以直接生成自签名证书,而无需先生成 CSR。

  2. -newkey rsa:2048

    • -newkey:指示 OpenSSL 生成一个新的私钥。

    • rsa:2048:指定新私钥的算法为 RSA,密钥长度为 2048 位。这是目前广泛使用的安全标准。

  3. -nodes

    • 这个选项的意思是 "不要用密码加密私钥"

    • 如果省略 -nodes,OpenSSL 会在生成私钥时提示你设置一个密码。每次 HAProxy(或其他服务)启动使用这个私钥时,都需要输入密码,这对于自动启动的服务非常不便。

    • 重要提示: 使用 -nodes 意味着私钥文件 (lincoln.org.key) 是未加密存储在磁盘上的。必须严格限制该文件的访问权限(通常设置为 600 或 400,仅限 root 或特定服务用户读取),否则存在安全风险。

  4. -sha256

    • 指定生成证书请求(以及最终证书)时使用的哈希算法为 SHA-256

    • 这是当前推荐的安全哈希算法,替代了较弱的 SHA-1 或 MD5。

  5. -keyout /etc/haproxy/certs/lincoln.org.key

    • -keyout:指定新生成的私钥应保存到的文件路径和名称。

    • 这里私钥将被保存到 /etc/haproxy/certs/lincoln.org.key。确保 /etc/haproxy/certs/ 目录存在,或者你有权限创建它。

  6. -x509

    • 这是命令的核心选项,改变了 openssl req 的默认行为。

    • 通常 req 用于生成证书签名请求,需要提交给证书颁发机构 (CA) 签名。

    • -x509 选项告诉 OpenSSL 直接生成一个自签名的 X.509 证书,而不是生成 CSR。该证书将使用刚刚生成的私钥进行签名。

  7. -days 365

    • 指定生成的自签名证书的有效期,单位为天。

    • 这里设置为 365 天(1 年)。你可以根据需要调整这个值(例如 -days 730 表示 2 年)。

  8. -out /etc/haproxy/certs/lincoln.org.crt

    • -out:指定生成的自签名证书应保存到的文件路径和名称。

    • 这里证书将被保存到 /etc/haproxy/certs/lincoln.org.crt

按照提示来输入名字那些

之后将key和crt一起放到.pem里

这样证书就生成完毕了

进haproxy配置文件配置 

(2)测试访问

结束

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧能源合同解决方案

01 能源行业合同管理核心痛点 1&#xff09;长期风险沉淀与动态环境失配&#xff1a;合同稳定性的根本矛盾 超长周期下的风险累积&#xff1a;20~30年的购售电协议&#xff08;PPA&#xff09;、EPC合同需覆盖技术迭代&#xff08;如光伏组件衰减率&#xff09;、政策转向&am…

MeterSphere平台,接口自动化脚本编写常用操作

文章目录1. 前置准备2. 项目环境设置3. 创建接口3.1 创建接口API3.2 测试接口API3.3 设置接口case4. 场景接口自动化4.1 创建自动化场景4.2 场景化操作说明4.2.1 设置脚本场景变量4.2.2 接口列表导入4.2.3 场景导入4.2.4 自定义请求4.2.5 事务控制器4.2.6 等待控制器4.2.7 循环…

C 语言介绍

C语言是由Dennis Ritchie开发的&#xff0c;用于创建与硬件设备&#xff08;例如驱动程序&#xff0c;内核等&#xff09;直接交互的系统应用程序。C编程被认为是其他编程语言的基础&#xff0c;这就是为什么它被称为母语。C是一种功能强大的通用编程语言。它可以用于开发操作系…

AI产品经理面试宝典第48天:产品设计与用户体验优化策略

1. 用户体验分析与产品设计逻辑 1.1 问:如何通过用户反馈优化AI产品体验? 答: 建立反馈闭环机制:通过应用内评分、用户访谈、行为埋点三维度收集数据,例如某语音助手产品通过NLP分析用户纠错语句,发现"误唤醒"问题占比37%; 优先级排序模型:采用Kano模型量化…

基于springboot的在线教育系统(源码+论文)

一、开发环境 本在线教育系统主要采用以下技术栈进行开发&#xff1a; B/S结构&#xff1a;基于浏览器/服务器模式&#xff0c;便于用户通过互联网访问系统&#xff0c;无需安装客户端软件。Spring Boot框架&#xff1a;简化了新Spring应用的初始搭建及开发过程&#xff0c;提…

Ubuntu 系统上部署禅道

在 Ubuntu 系统上部署禅道可以按照以下步骤进行&#xff0c;以下是基于禅道开源版的部署流程&#xff1a; 1. 安装必要依赖 首先安装禅道运行所需的环境&#xff08;以 Ubuntu 20.04/22.04 为例&#xff09;&#xff1a; bash # 更新系统包 sudo apt update && sudo…

【vue-8】Vue3 Options API 生命周期函数全面解析

在 Vue.js 开发中&#xff0c;理解组件的生命周期是构建健壮应用程序的关键。虽然 Vue3 引入了 Composition API&#xff0c;但 Options API 仍然是许多开发者的首选&#xff0c;特别是对于从 Vue2 迁移的项目或更喜欢基于选项的代码组织的团队。本文将深入探讨 Vue3 中 Option…

周志华《机器学习导论》第8章 集成学习 Ensemble Learning

目录 8.1 个体与集成 8.2 Boosting Ada&#xff08;Adaptive&#xff09;Boost 8.3 Bagging 8.4 随机森林 8.5 结合策略 8.5.1 平均法 8.5.2 投票法 8.5.3 学习法 8.6 多样性 8.6.1 误差-分歧分解 error-ambiguity 8.6.2 多样性度量 8.6.3 多样性增强 8.1 个体与集…

Embassy实战:Rust嵌入式异步开发指南

嵌入式异步框架 Embassy 实例 以下是关于嵌入式异步框架 Embassy 的实用示例,涵盖常见外设操作、多任务协作和硬件交互场景。示例基于STM32和Raspberry Pi Pico等平台,使用Rust语言编写。 GPIO 控制 use embassy_stm32::gpio::{Input, Output, Pull, Speed}; use embassy_…

ChatGPT桌面版深度解析

ChatGPT桌面版深度解析&#xff1a;功能、安装与高效使用全攻略 一、核心功能全景解析 &#xff08;一&#xff09;全场景交互体系 全局热键唤醒 支持MacOS&#xff08;Option空格&#xff09;与Windows&#xff08;Alt空格&#xff09;全局快捷键&#xff0c;实现跨应用无缝调…

RLVR的一种扩展方案--RLPR论文阅读

论文链接&#xff1a;RLPR: EXTRAPOLATING RLVR TO GENERAL DOMAINS WITHOUT VERIFIERS 文章目录简介RLPRRLVR概率奖励/Probability Reward奖励设计标准差过滤总结简介 可验证奖励的强化学习(Reinforcement Learning with Verifiable Rewards, RLVR)在提升大语言模型&#xff…

odoo欧度小程序——添加用户

odoo欧度小程序添加登录用户 1. 直接在登录用户页面添加用户点击 添加登录用户输入用户和密码&#xff0c;点击登录验证进入odoo页面2. 在用户切换页面添加用户点击选择切换用户点击域名弹出菜单点击添加新用户输入用户和密码&#xff0c;点击登录验证进入odoo页面

Docker 应用数据备份、迁移方案

一、为什么要做Docker数据备份1、保障数据与配置的安全性防止数据丢失&#xff1a;Docker 容器本身是 “临时性” 的&#xff08;基于镜像创建&#xff0c;删除后数据默认丢失&#xff09;&#xff0c;但容器中运行的应用&#xff08;如数据库、日志服务&#xff09;会产生持久…

【PTA数据结构 | C语言版】强连通分量

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 本题请你编写程序&#xff0c;输出给定有向图中的各个强连通分量&#xff0c;并统计强连通分量的个数。 输入格式&#xff1a; 输入首先在第一行给出 2 个整数&#xff0c;依次为有向图的顶点数 n&…

idea部署新项目时,用自定义的maven出现的问题解决

出现这个问题是因为maven版本和idea版本不兼容&#xff0c;例如图示是maven3.9和idea2021.3的版本不兼容&#xff0c;maven换成3.8.x即可解决

OCR 身份识别:让身份信息录入场景更高效安全

在银行柜台开户、线上平台实名认证等场景中&#xff0c;身份信息录入是基础环节&#xff0c;OCR 身份识别产品正成为提升效率与安全性的关键。​传统人工录入身份证信息&#xff0c;不仅耗时久&#xff0c;还易因手误导致姓名、号码出错&#xff0c;影响业务办理进度。而 OCR 身…

Web 服务器和Web 中间件

一、什么是 Web 中间件 Web 中间件&#xff08;Web Middleware&#xff09;是运行在 Web 服务器与实际业务程序之间的一层“胶水”软件&#xff0c;用来统一处理公共事务&#xff0c;让开发者专注写业务逻辑。常见职责&#xff1a; 请求/响应拦截&#xff08;鉴权、日志、跨域、…

Paimon的部分更新以及DeleteVector实现

背景 本文基于 Paimon 0.9 出于对与Paimon内部的DeleteVctor的实现以及部分更新的实现进行的源码阅读。 关于 DeleteVector的介绍可以看这里 说明 对于Paimon来说无论是Spark中使用还是Flink使用&#xff0c;后面的逻辑都是一样的&#xff0c;所以我们以Spark为例来说。所以…

Redis 的事务机制是怎样的?

Redis 的事务机制 Redis支持事务机制,其主要目的是确保多个命令执行的原子性,即这些命令会作为一个不可分割的操作单元执行。 需要注意的是,Redis事务不支持回滚操作。从Redis 2.6.5版本开始,服务器会在命令累积阶段检测错误。在执行EXEC命令时,若发现错误则会拒绝执行事…

网安学习NO.17

1. VPN 概述定义&#xff1a;在公用网络&#xff08;如 Internet、帧中继、ATM 等&#xff09;中&#xff0c;通过技术手段虚拟出的一条企业内部专线&#xff0c;能像私有网络一样提供安全性、可靠性和可管理性。核心特征&#xff1a;利用公共网络构建&#xff0c;具备 “虚拟性…