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

企业级调度器LVS

访问效果
涉及内容:浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等

集群

1.1 集群类型简介

对于⼀个业务项⽬集群来说,根据业务中的特性和特点,它主要有三种分类:
高扩展 (LB) :单个主机负载不足的时候,采取增加主机的方式来满足负载需求的解决方案。
高可用(HA):集群中的某主机失效时,避免业务中断,我们将其任务转交给其他主机的解决方案。
高性能 (HPA) :通过某些技术,实现同样资源来承受更多用户请求负载的解决方案。

1.2 扩展集群

扩展集群 (Load Balancing Cluster), 也称 " 负载均衡集群 "
它是指在当前业务环境集群中,所有的主机节点都处于正常的工作活动状态,它们共同承担起用户的请求带来的工作负载压力,保证用户的正常访问。

1.3 可用集群

可⽤集群 (High Availability Cluster) ,也称 " 主机冗余 " 集群。
它是指将 核心业务使用多台 ( 一般是 2 ) 主机共同工作,支撑并保障核心业务的正常运行,尤其是业务的对外不间断的对外提供服务。核心特点就是 " 冗余 " .
它存在的目的就是为了解决单点故障 (Single Point of Failure) 问题的。
A = MTBF / (MTBF + MTTR)
MTBF(Mean Time Between Failure), 即平均故障间隔时间,表示产品多长时间出现一次问题。
MTTR(Mean Time To Restoration) ,即平均恢复时间 产品,从故障到稳定状态的维修花费时间。
1 = 365 = 8760 小时。
90 % 的可用性 = ( 1 - 90 % ) * 365 = 36.5 , 又称 1 9

1.4 ⾼性能集群(HPA)

⾼性能集群 (High Perfermance Computing Cluster) ,也称科学计算集群。
它是基于前两种技术实现的集群基础上,将多个计算机通过高速网络连接起来,协同工作以完成复杂的计算任务或处理大量数据的系统。高效利用这些主机资源,结合某些特有的技术方案,提供的强大的计算能力,从而实现特定用户 | 大型任务的高复杂度数据处理功能,比如生物计算、大场景模拟计算、预测计算等。

1.5 集群实现细节

前置知识:OSI 七层模型
物理层 ( 网线、 MAC)
数据链路层 (ARP PPTP)
网络层 (IP ICMP)
传输层 (Port)
会话层 (Session ssl tsl rpc)
表示层 ( 各种文件格式, JPEG ASCll)
应用层 (HTTP / HTTPS 、各种应用服务 )
LVS 可以实现二~四层的负载均衡效果
Nginx 可以实现四~七等的负载均衡效果
Haproxy 可以实现四~七层的负载均衡效果
阿里云  可以实现四~七层的负载均衡效果阿里云ALB(七层负载均衡),阿里云NLB(四层负载均衡),阿里云 CLB(传统型负载均衡)https://help.aliyun.com/zh/slb/
AWS 可以实现四~七层的负载均衡效果ALB(七层负载均衡),AWS NLB(四层负载均衡),AWS CLB(传统型负载均衡)https://aws.amazon.com/cn/elasticloadbalancing/

1.6 ⼯作的协议层次分类[M]

⼯作在传输层(四层)的负载均衡:
传输层负载均衡基于四层通用协议( TCP / UDP )进行调度
LVS
nginx (基于 stream 划模块)
haproxy (基于 tcp 模式)
阿里云 NLB CLB
AWS NLB CLB
⼯作在应⽤层(七层)的负载均衡:
应用层负载均衡通常基于应用层特定协议进行调度,又被称为 proxy server
基于 http 协议的负载均衡: nginx httpd haproxy mode http , ......
基于 fastcgi 协议的负载均衡: nginx httpd ......
基于 mysql 协议的负载均衡: mysql-proxy mycat ......

2 LVS基础

防⽕墙的五表五链

security : 对数据包的 mac 信息进行过滤
filter :对主机接收的数据包实现过滤功能,它是 iptables 的默认规则。
nat : 对主机接收的数据包实现转换功能,端口映射,地址映射等 , 使用场景比较多表。
mangle : 用于对特定数据包的修改,报文拆开,修改,封装表
raw : 特殊场景下实现的自定义规则
PREROUTING : 数据包进入路由表之前             INPUT : 通过路由表后目的地为本机
FORWARD : 通过路由表后,目的地不为本机    OUTPUT : 由本机产生,向外转发
POSTROUTIONG : 发送到网卡接口之前
效果图
数据包转发场景:
nat prerouting forwardfilter forwardnat postrouting 离开主机
数据包处理场景:
nat prerouting forwardfilter input local processroutingnat output filter output nat
postrouting 】离开主机
SNAT DNAT
⽹络数据包,我们主要是根据请求报⽂中的数据地址转换划分为 SNAT DNAT ,⽽不是响应数据包。

1.1 LVS简介

  LVS ,全称 Linux Virtual Server ,即 Linux 虚拟服务器。它是 1998 5 月由章文嵩博士发起的一个中国的开源软件项目,官方网站是 http :// www.linuxvirtualserver.org
   LVS 基于 IP 负载均衡 | 内容请求分发等技术,整合了一些特有的理念和思想后的一套解决方案。普通的 linux 主机可以基于 lvs 提供的负载均衡技术,实现一个高扩展的 linux 的服务器集群。
官方网站: http :// www.linuxvirtualserver.org /
完整资料: http :// www.austintek.com / LVS / LVS-HOWTO / HOWTO / index.html

1.2 项目结构

⼀般来说,LVS集群有三部分组成

负载调度器 (load balancer) ,负责将客户的请求调度到后端主机上。
服务器池 (server pool) ,真正响应用户请求的后端主机。
共享存储 (shared storage) ,存储配置、元数据等相关信息
LVS 集群提供了四种主要的资源调度功能:
NAT(NAT)  修改请求数据包的目标 ip 地址,实现请求转发功能
Tunneling(TUN)  给请求数据包外部增加新的 ip 首部,实现请求转发功能
DirectRouting(DR)  修改请求数据包的 mac 地址,实现请求转发功能
FULLNAT 结合 SYNPROXY 技术,修改数据包的源 ip 地址和目标 ip 地址,实现请求转发功能
1.3  常见术语
物理术语 - ⽤于描述主机的常见术语
DSDirector Server   
指的是 LVS 集群中的负责调度 (Dispatcher) 或者负载均衡 (Load Balancer) 的主机,即部署 LVS 的主机。 也称 VS(Virtual Server)
RSReal Server  
指的是这正相应用户主机的后端服务器主机。 也称 BS(Backend Server)
逻辑术语 - 用于描述逻辑关系的常见术语
VIPVirtual Server IP
LVS 主机上用于向外部用户提供服务的 ip 地址,作为用户请求的目标的 IP 地址。
它是一个在物理主机上没有物理网卡的 ip 地址,一般用于 LVS 主机的外网 ip
DIPDirector Server IP
LVS 主机上和后端提供真正服务的主机通信的 IP 地址。  
它是一个独立的物理网卡上的地址,一般用于 LVS 主机的内网 ip
RIPReal Server IP
LVS 调度主机后端,真正响应用户请求的主机 IP 地址。
CIPClient IP    
发起请求的用户客户端 IP 地址。 一般都是外网 ip 地址。
这四者之间的访问关系: CIP <--> VIP == DIP <--> RIP
实践的时候往往在 LVS 上配置两个网卡,⼀个对外,⼀个对内
为了达到不同网段的 ip 地址能够达到正常的通信,我们需要开启 linux 服务的 ip 转发功能
方法一:在 / etc / sysctl.conf 中开启功能    net.ipv4.ip_forward = 1    
方法二:直接修改 ip_forward 文件   echo 1 > / proc / sys / net / ipv4 / ip_forward
注意: 0 代表禁用, 1 代表开启。
1.4 工作流程
LVS 集群环境中,用户请求的处理流程如下:
1 用户在客户端发起访问服务的请求
2 经过层层的 dns 解析原理,获取服务的提供 ip 地址 -- VIP
3 客户端向 VIP 所在的 LVS 主机 (VS) 发起服务请求
4 LVS 主机 (VS) 接收到用户请求,根据自身的配置,将用户请求转交到后端的某主机 (RS)
5 用户请求经 LVS DIP 网卡,进入到公司内网环境
6 根据数据包的结构,找到真正提供服务的后端主机 (RS)
7 公司内部的后端主机,处理用户请求后,采用某种方式返回给客户端

1.3 软件环境

LVS 软件 由 2 部分程序组成: ipvs ipvsadm
ipvs(ip virtual server):一个 支持多种 IP 负载均衡技术的 IP 虚拟服务器的软件。
ipvsadm 是工作在用户空间的命令行工具,负责为 ipvs 的资源调度编写转交规则。
查看内核模块关于 ipvs 的信息
grep -i -C 2 ipvs /boot/config-6.8.0-51-generic  注:颜色的是uname -r 系统的版本号 
注:里面字符的表示含义如下
m 表现为模块方式,按需加载。
y 表现为直接内签到内核中,开机就加载。
modinfo ip_vs    # 查看模块信息

1.4 软件部署

ubuntu系统为例
apt info ipvsadm #查看版本信息
apt install ipvsadm #安装软件
dpkg -L ipvsadm #查看软件
ipvsadm --version  #查看版本信息

1.5 集群状态查看

命令格式: ipvsadm - Ln
格式详解:
- L 显示当前的服务或者目标主机信息    
- n 地址和端口的数字输出
有规则⽂件 /proc/net/ip_vs 专⻔记录这些规则信息

1.6 工作模式解读

LVS 官方支持三种工作模式,分别是 NAT 模式, DR 模式, TUN 模式
1. NAT 模式
NAT Network address translation (网络地址转换)
LVS 本质上使用的类似于 iptables 里面的 DNAT 策略
- LVS 工作于内核上,而不是 iptables 的五表五链上
整个网络环境需要涉及到两个网段:公网网段、私网网段
请求报文和响应报文都必须经由 LVS 转发, LVS 易成为系统瓶颈
- 数据包进入到私网的时候,转换的是目标 ip 地址,因为提供服务的是 RIP 主机
- 数据包进入到外网的时候,转换的是源 ip 地址,因为数据包来的时候,找的就是 VIP
RIP DIP 应在同一个 IP 网络,且应使用私网地址;
- 由于数据包在流转的时候,尤其是 RS 响应的数据包要走到 lvs 主机,所以必须 配置网关地址DIP
- 支持端口映射,可修改请求报文的目标 PORT
其他内容
- VS 必须是 Linux 系统, RS 可以是任意 OS 系统
- LVS 主机需要开启 ip_forward 转发
小结
NAT 双网段  来去数据包流经LVS主机    LVS主机开启数据包转发
2. DR 模式
DR Direct Routing(直接路由)
LVS 默认模式 ,应用广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC DIP 所在的接口的 MAC ,目标 MAC 是某挑选出的 RS RIP 所在接口的 MAC 地址;源 IP/ PORT ,以及目标 IP / PORT 均保持不变,但源 MAC 和目标 MAC 会发生改变, DR 模式下,数据链路层之上的内容不会发生变化。
DR模式的特点
LVS 服务器 和 RS 服务器 上都配置有 VIP 地址
RS RIP 可以使用私网地址,也可以是公网地址
LVS 服务器只处理请求报文,不处理响应报文
RS 服务器可以使用大多数 OS 系统(支持相关网络设置即可)
3 TUN 模式
TUN IP tunneling IP 隧道)
 TUN 模式不修改请求报文的 IP 首部(源 IP CIP ,目标 IP VIP ),而是在原 IP 报文之外再封装一个 IP 首部 (源 IP DIP ,目标 IP RIP ),再将报文发往后端 RS RS 直接响应客户端(源 IP VIP ,目标 IP CIP ), TUN   模式与 DR 模式的区别是 TUN 模式下 LVS 服务器和后端 RS 可以不在同一个物理网络,可以跨公网。
相较于 DR 模型来说,它修改的是 更深层的 ip 报文,所以性能有些差。但是好处是可以跨网络。

3 调度分类

lvs 的调度算法,站在 " 是否考虑到后端主机负载 " 的⻆度可以划分为以下三类
静态方法:仅仅从调度策略本身实现的功能角度进行工作  RR WRR DH SH
RR Round Robin ,轮询算法
WRR Weight RR ,加权轮询算法
SH Source Hash ,源 IP 地址 hash
DH Destinatio Hash ,目标 IP 地址 hash
动态方法:在满足调度策略本身实现功的前提下,还要考虑后端主机的动态负载效果
LC WLC LBLC LBLCR SED NQ
LC Least Connections ,最少连接算法
WLC Weighted Least Connections ,加权最少连接算法,此算法是 LVS 默认调度算法
SED Shortest Expected Delay ,最短延迟调度算法,此算法是 WLC 算法的改进版
LBLC Locality-Based Least Connections ,基于局部性的最少链接调度算法
LBLCR Locality-Based Least Connections with Replication ,带复制的基于局部性的最少链接调度算法
高版本内核中新增的调度算法 : 4.15 版本的内核中新增的方法     FO OVF MH TNDR
FO Weighted Fail Over ,权重过载算法
OVF Overflow-connection ,溢出连接算法
MH Masquerading Hashing ,源 IP 地址 hash
TNDR Two Node Direct Routing ,直接路由调度,而不使用 NAT 网络转换

4 LVS实践

1.增加集群
命令格式: ipvsadm - A - t | u | f service_address : port [ - s scheduler] [ - p [timeout]]
格式详解:    
- A 增加 lvs 集群   
- t 指定 lvs 主机地址信息       
        - t 指定 lvs 集群服务主机的 tcp 端口     
        - u 指定 lvs 集群服务主机的 udp 端口        
         -f 指定 lvs 集群服务主机采用的防火墙自定义规则的标记,默认是数字       
- s 指定 lvs 集群的调度策略,默认是 wlc
例:
ipvsadm - A - t 192.168.8.14 : 80
ipvsadm - A - t 192.168.8.15 : 80
2.编辑集群
命令格式: ipvsadm - E - t service_address : port [ - s scheduler]
格式详解:
- E 编辑 lvs 集群的信息
注意: 更改集群信息的时候,只能更改已存在的 lvs 集群的细节属性,不能直接将 lvs 的地址更改
例:
ipvsadm - E - t 192.168.8.15 : 80 - s lc
ipvsadm - E - t 192.168.8.14 : 80 - p 30
3.删除集群
命令格式: ipvsadm - D - t service_address : port
格式详解:
- D 删除指定 lvs 集群的信息
- C 删除所有 lvs 集群的信息
注意: 删除集群信息的时候,必须指定已存在的 lvs 集群地址,协议也必须正确
例:
方法 1
ipvsadm - D - t 192.168.8.14 : 80
ipvsadm - D - t 192.168.8.15 : 80
方法 2
ipvsadm - C
4.主机命令
增加主机
命令格式: ipvsadm - a - t service_address : port - r server-address : port - g | m | i [options]
格式详解:
- a lvs 集群增加一个真实主机 RS    
- r 指定真实主机的地址信息,格式是 IP : [Port],Port 可以省略    
- g | m | i 设定后端主机的转发模式        
    - g 采用默认的 direct routing 模式       
    - m 采用 masquerading nat 模式        
     - i 采用 ipip tunneling 模式
      三者只能选择其一    
- w 指定真实主机的权重信息
例:
ipvsadm - A - t 192.168.8.14 : 80
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.16
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.16
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168
添加主机的时候,增加扩展属性
- r 指定 RS 主机端口的效果,只有采用 - m 参数的时候会生效,否则都使用默认的 80 端口
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.15 : 88
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.15 : 88 - m
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.15 : 89 - m - w 3
注意:
在向 lvs 集群中增加真实主机的话,一定要保证指定的 lvs 集群地址存在而且正确。
lvs 本质上是一种网络扩展方案,即使网络不通,也可以随意增加真实主机的地址,只是不能用。
- r 指定 RS 主机端口的效果,只有采用 - m 参数的时候会生效,否则都使用默认的 80 端口。
编辑主机
命令格式: ipvsadm - e - t service_address : port - r server-address : port [options]
格式详解:    
- e 修改真实主机的属性信息    
- m 设定真实主机的转发模型信息为 nat 模型
注意:
修改真实主机信息的时候,必须指定已存在的 lvs 集群地址,协议也必须正确
- m - i 不能同时使用
ipvsadm - e - t 192.168.8.14 : 80 - r 192.168.8.16 : 80 - m # 转换成 NAT 模式
注意:  Tun 转发模式的标志是 Tunnel Nat 转发模式的标志是 Masq
对非默认端口的 RS 主机使用 - i ,它只会对同 ip 的默认 80 端口生效
如果想让 Rs 主机的模式从 nat 模式转换为其他模式的话,⽆法直接修改,只能先删后增。
删除主机
命令格式: ipvsadm - d - t service_address : port - r server-address : port
格式详解:    
- d 删除真实主机的属性信息
注意:
       lvs 服务主机和 rs 真实主机的地址必须指定正确        
单个删除 RS 主机有些繁琐,我们可以直接采用删除 lvs 主机的效果清空所有目标主机
单个清理主机
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168.8.15 : 89
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168.8.16
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168.16
ipvsadm - d - t 192.168.8.14 : 80 - r 192.168
规则命令
对于 ipvsadm 来说,我们可以通过 ipvsadm-save 的命令来查看和保存 lvs 的相关规则。
命令格式: ipvsadm-save [ - n]
格式详解:    
- n 以精确的数字格式打印出 lvs 规则,如果不加 - n 的话,他会基于域名解析,将相应的 ip 转换成主机名展示 使用 ipvsadm - Sn 可以实现同样的效果
保存规则
通过 ipvsadm-save + > 的方式实现 规则的保存
ipvsadm-save - n > n-ipvsadm
ipvsadm-save > non-ipvsadm
清空规则
命令格式: ipvsadm - C
格式详解:
- C 清空 lvs 服务集群规则
导⼊规则
命令格式: ipvsadm-restore < 规则文件
注意:    
我们在导入的规则的时候,如果备份是基于主机名的 lvs 规则,主机名解析记录的正确与否很关键。 我们使用 ipvsadm - R 也可是实现同样的效果
导⼊ 携带 -n 的备份规则⽂件
ipvsadm-restore < n-ipvsadm
规则保存
对于 ipvsadm 设置的规则来说,它是我们操作 lvs 规则的常⻅⽅法,⽽且是以命令⾏的⽅式来运⾏的,但是这种命令⾏编写的规则,好处就是灵活⽣效快,但是缺点就是重启主机后规则⾃动清空。
准备规则
ipvsadm -A -t 192.168.8.14:80
ipvsadm -A -t 192.168.8.15:80
ipvsadm -a -t 192.168.8.15:80 -r 192.168.8.17
ipvsadm -a -t 192.168.8.14:80 -r 192.168.8.18cat /etc/ipvsadm.rules  #查看默认的规则保存⽂件
service ipvsadm save   #保存规则增加⼀条规则
ipvsadm -a -t 192.168.8.14:80 -r 10.0.0.130 -m -w 30
ipvsadm -Ln保存新规则到规则⽂件
ipvsadm-save -n > /etc/ipvsadm.rules
cat /etc/ipvsadm.rules但是这种⽅式保存服务后,重启主机后,默认不会⾃动加载
reboot
ipvsadm -Ln

代码实现效果如下

但是这种⽅式保存服务后,重启主机后,默认不会⾃动加载
开机自动加载方式1
修改 ipvsadm 的配置⽂件
root @ubuntu24-13: ~ # vim /etc/default/ipvsadm
# if you want to start ipvsadm on boot set this to true
AUTO = "true" # false 改为 true
重启主机后,可以看到会⾃动加载规则⽂件
开机自动加载方式2
root @ubuntu24-13: ~ # cat /etc/rc.local
#!/bin/bash
ipvsadm-restore < / etc / ipvsadm.rules
为该文件增加执行权限
root @ubuntu24-13: ~ # chmod +x /etc/rc.local
Rocky系统规则保存策略
ipvsadm - A - t 192.168.8.14 : 80
ipvsadm - A - t 192.168.8.15 : 80
ipvsadm - a - t 192.168.8.15 : 80 - r 192.168.8.17
ipvsadm - a - t 192.168.8.14 : 80 - r 192.168.8.18
ipvsadm-save - n > / etc / sysconfig / ipvsadm   #保存规则
systemctl enable ipvsadm.service    #设置为开启⾃启

5 防⽕墙标识

FWM:FireWall Mark  

LVS Linux Virtual Server )的防火墙标记 FWM Firewall Mark )是一种用于在 LVS 负载均衡环境中对报文进行分类和管理的技术。
功能定制
1 使⽤ iptables 定义防⽕墙标记
Director 主机上执行命令
iptables - t mangle - A PREROUTING - d $vip - p $proto m multiport -- dports $port1 , $port2 ,
- j MARK -- set-mark NUMBER
命令解析
- t mangle 指定操作的是 mangle 表;
- A PREROUTING 将规则追加到 PREROUTING 链;
- d $vip 指定目标地址为 LVS VIP 地址;
- p $proto 指定协议;
- m multiport -- dports $port1 , $port2 , 指定目标端口;
- j MARK -- set-mark NUMBER 表示执行 MARK 动作并设置标记值为 NUMBER
2 基于标记定义集群服务
Director 主机上执行命令
ipvsadm - A -f NUMBER (options)
命令解析
- A 表示添加一个新的集群服务,
-f NUMBER 指定基于标记 NUMBER 来定义集群,
(options) 可设置调度算法等其他选项。
3 iptables 命令实践
对于 ubuntu 服务器版本的话,默认没有 iptables 命令
apt install iptables
iptables - t mangle - A PREROUTING - d 192.168.8.13 - p tcp - m multiport -- dports 80 , 443 - j MARK
-- set-mark 10     # 定制防⽕墙标记
定制转发规则
ipvsadm - C
ipvsadm - A -f 10 - s rr
ipvsadm - a -f 10 - r 192.168.8.7 - g
ipvsadm - a -f 10 - r 192.168.8.17 - g
解释上面的命令
效果如下: FWM 10 rr就是上面要求的结果。FWM 11 wlc 是不加-s 调度策略,直接使⽤默认的调度策略结果。

6 NAT实践[M]

前提操作条件
注意:    
为了避免网络效果出错,我们应该讲宿主机上的 vmnet1 网卡信息给清空掉或者直接将网卡禁用    
后端主机在没有网的情况下部署 web ,采用系统镜像的方式来安装。
最终达到的效果
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
配置主机⽹络环境
各个主机的⽹卡设备基本配置
定制lvs-client主机ip   (略 不用更改)
定制lvs-server主机ip
定制⽹卡配置, ens33 NAT 模式, ens37 是仅主机模式,仅主机模式不⽤配置⽹关
root@ubuntu24-13:~# cat /etc/netplan/50-cloud-init.yaml
network:version: 2ethernets:ens33:addresses:- 10.0.0.13/24nameservers:addresses:- 10.0.0.2routes:-   to: defaultvia: 10.0.0.2ens37:addresses:- 192.168.8.13/24
netplan apply  重启生效
定制lvs-RS1主机ip
定制网卡服务
[root@openeuler-14 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.8.14
PREFIX=24[root@openeuler-14 ~]# nmcli connection down ens33       关闭网卡的连接
[root@openeuler-14 ~]# systemctl restart NetworkManager  重启网卡服务
定制lvs-RS2主机ip
定制⽹卡服务
[root@rocky9-15 ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
autoconnect-priority=-999
interface-name=ens160
[ipv4]
address1=192.168.8.15/24
method=manual[root@rocky9-15 ~]# nmcli connection down ens160       关闭网卡的连接
[root@rocky9-15 ~]# systemctl restart NetworkManager   重启网卡服务
lvs-server主机定制数据包转发
定制内核参数
root@ubuntu24-13:~# cat /etc/sysctl.d/forward.conf
net.ipv4.ip_forward = 1
root@ubuntu24-13:~# sysctl -p /etc/sysctl.d/forward.conf
net.ipv4.ip_forward = 1测试效果
root@ubuntu24-13:~# sysctl -a | grep ip_forw
net.ipv4.ip_forward = 1
RS1和RS2 主机定制⽹关
注意:如果⽹关不指向 lvs 主机的 ip 地址,那么数据包交给其他主机,导致数据包⽆法原路通过 lvs 返回出去。但是因为他们属于同⼀个⽹段,数据包还是可以抓取到的,只不过没有意义⽽已。
[root @openeuler-14 ~ ] # ip route add default via 192.168.8.13
[root @openeuler-14 ~ ] # ip route list
default via 192.168.8.13 dev ens33
[root @rocky9-15 ~ ] # ip route add default via 192.168.8.13
[root @rocky9-15 ~ ] # ip route list
default via 192.168.8.13 dev ens160
RS1和RS2主机 定制本地镜像服务
挂载磁盘
[root @openeuler-14 ~ ] # mkdir /image
[root @openeuler-14 ~ ] # mount /dev/cdrom /image/
mount : / image : WARNING : source write-protected, mounted read-only.
定制软件源
[root @openeuler-14 ~ ] # mv /etc/yum.repos.d/openEuler.repo{,.bak}
[root @openeuler-14 ~ ] # cat > /etc/yum.repos.d/openEuler.repo <<-eof
[local_openeuler]
name = Local OpenEuler Repository
baseurl = file :/// image
enabled = 1
gpgcheck = 0
eof
更新软件源
[root @openeuler-14 ~ ] # yum makecache
关闭防⽕墙服务和selinux
[root @openeuler-14 ~ ] # systemctl disable --now firewalld.service
[root @openeuler-14 ~ ] # setenforce 0
部署httpd服务
[root @openeuler-14 ~ ] # yum install -y httpd vim
[root @openeuler-14 ~ ] # echo '<h1>hello RS1</h1>' > /var/www/html/index.html
[root @openeuler-14 ~ ] # systemctl start httpd
挂载磁盘
[root @rocky9-15 ~ ] # mkdir /image
[root @rocky9-15 ~ ] # mount /dev/cdrom /image
mount : / image : WARNING : source write-protected, mounted read-only.
定制软件源
[root @rocky9-15 ~ ] # mkdir /etc/yum.repos.d/bak
[root @rocky9-15 ~ ] # mv /etc/yum.repos.d/rocky* /etc/yum.repos.d/bak/
[root @rocky9-15 ~ ] # cat > /etc/yum.repos.d/rocky.repo <<-eof
[local-rocky-baseos]
name = Local Rocky 9.4 BaseOS Repository
baseurl = file :/// image / BaseOS
enabled = 1
gpgcheck = 0
[local-rocky-appstream]
name = Local Rocky 9.4 AppStream Repository
baseurl = file :/// image / AppStream
enabled = 1
gpgcheck = 0
eof
更新软件源
[root @rocky9-15 ~ ] # yum makecache
(下面的操作跟RS1上的操作一样 略)
lvs-server主机定制集群
root @ubuntu24-13: ~ # apt install ipvsadm  安装ipvsadm
定制lvs集群服务
root @ubuntu24-13: ~ # ipvsadm -A -t 10.0.0.13:80 -s rr
增加RS主机列表
root @ubuntu24-13: ~ # ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.14 -m
root @ubuntu24-13: ~ # ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.15 -m
注意: 我们这里用的是 nat 模式,所以再添加 RS 主机的时候,需要使用 - m 选项
客⼾端访问 lvs 的对外 ip 地址
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS2 </ h1 >
[root @rocky9-12 ~ ] # curl 10.0.0.13
< h1 > hello RS1 </ h1 >
结果显示:可以看到实现了流量的正常转发效果
按照我们刚才的实验情况:这四类 IP 的具体情况如下:
CIP 10.0.0.12 VIP 10.0.0.13 DIP 192.168.8.13
RIP1 192.168.8.14 RIP2 192.168.8.15
1 用户向具有公网 ip 地址的 LVS 主机地址 (VIP) 发起请求, (Src = CIP Dst = VIP)
2 LVS 主机接收到数据包后,修改数据包的目标地址为后端 RS1 主机并转发出去, (Src = CIP Dst = RIP1)
3 后端 RS1 主机处理完请求后,返回数据包给 LVS 主机, (Src = RIP1 Dst = CIP)
4 LVS 主机接收到数据包后,修改数据包的源地址为 LVS 的公网地址 (VIP) 并转发出去, (Src = VIP Dst = RIP1)
抓取数据包
yum install tcpdump -y   安装    在除了客户机上的所有主机进行安装
tcpdump -nn -i ens160   抓包    网卡 不是唯一的 根据网卡的实际名字进行修改 两个网卡选NAT的
curl 10.0.0.13 【在客户机上进行测试】
得到如下结果
7 多业务NAT实践
⼀个 lvs 调度器,实现多种不同业务集群的负载均衡
主机资源

相关文章:

企业级调度器LVS

访问效果 涉及内容&#xff1a;浏览拆分、 DNS 解析、反向代理、负载均衡、数据库等 1 集群 1.1 集群类型简介 对于⼀个业务项⽬集群来说&#xff0c;根据业务中的特性和特点&#xff0c;它主要有三种分类&#xff1a; 高扩展 (LB) &#xff1a;单个主机负载不足的时候&#xf…...

MySQL中的重要常见知识点(入门到入土!)

基础篇 基础语法 添加数据 -- 完整语法 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);-- 示例 insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,10,123456789012345678,2000-01-01) 修改数据 -- 完整语法 UPDA…...

29.第二阶段x64游戏实战-技能冷却

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;28.第二阶段x64游戏实战-代码实现遍历技能 找技能冷却要通过一个技能cd长点的&…...

第19天-Python自动化生成PPT图文教程(基于python-pptx)

环境准备 pip install python-pptx Pillow 基础示例:批量插入图片 from pptx import Presentation from pptx.util import Inches import os from PIL import Image def create_image_slides(): # 初始化演示文稿 prs = Presentation() # 获取当前目录所…...

基于STM32的骑行语音播报系统

目录 一、前言 二、项目功能说明 三、主要元器件 四、原理图与PCB 五、手机APP 六、完整资料 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; 咸鱼商品链接&#xff1a; 基于STM32的骑行语音播报系统 二、项目功能说明 基础功能&#xff1a; 1&…...

springboot链接nacos测试

代码资料链接&#xff1a;https://download.csdn.net/download/ly1h1/90881498 场景说明&#xff1a;本次测试是springboot项目&#xff0c;可以链接上ncaos&#xff0c;将对应命名空间下的配置信息读取出俩&#xff0c;然后可以在接口进行返回显示。 0.环境配置 1.代码结构 …...

【初识】内网渗透——基础概念,基本工具使用

目录 一、域&#xff0c;工作组&#xff0c;域控制器&#xff0c;活动目录相关概念&#xff1a; 域环境&#xff1a; 工作组&#xff1a; 域控制器DC&#xff1a; 活动目录AD&#xff1a; 二、内网的基本场景&#xff1a; 三、内网渗透基本测试方案&#xff1a; #案例1一基本信…...

AI练习:混合圆

方法一&#xff1a;在圆内 1.画圆 选择椭圆工具&#xff0c;按住Shift键绘制正圆&#xff1b; CtrlC复制&#xff0c;CtrlF原地粘贴&#xff0c;按住Shift键缩小圆&#xff0c;移动位置&#xff1b; 再CtrlC&#xff0c;CtrlF&#xff0c;再按住Shift键缩小圆&#xff0c;移…...

心知天气 API 获取天气预报 2025/5/21

心知天气 API 获取天气预报 2025/5/21 URL格式: https://api.seniverse.com/v3/weather/now.json?key填你的秘钥&locationbeijing(这里填城市 可以用拼音)&languagezh-Hans&unitc 返回格式如下:...

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…...

java上机测试错题回顾(1)

平时不能摸鱼太多&#xff0c;这样导致到最后不能摸鱼...... 看了看日历原来是6.12就结课了&#xff0c;啊哈哈&#xff0c;真没几天准备了&#xff0c;期末月你要来了吗&#xff1f; 1 参数传递&#xff0c;值传递~&#xff01; 题目 以下代码的输出结果为&#xff08; &a…...

HTTP相关内容

应用层 自定义应用层协议,协议:约定 1.约定好通信传输的信息 2.约定好数据的组织格式(xml, json(重点), protobuf) 也可以基于现成的应用层协议,来进行开发 协议的种类非常多(HTTP 协议属于翘楚,1.手机,2 网站) 跟正确的说,咱们现在使用的是 HTTPS 这个协议,HTTP和HTTPS …...

【笔记】排查并解决Error in LLM call after 3 attempts: (status code: 502)

#工作记录 一、问题描述 在部署运行部署对冲基金分析工具 ai-hedge-fund 时&#xff0c;不断出现以下报错&#xff0c;导致项目运行异常&#xff1a; Error in LLM call after 3 attempts: (status code: 502) Error in LLM call after 3 attempts: [WinError 10054] 远程主…...

基于python的机器学习(七)—— 数据特征选择

目录 一、特征选择概念 二、特征选择的方法 2.1 过滤式特征选择 2.1.1 方差分析 2.1.2 相关系数 2.1.3 卡方检验 2.2 包裹式特征选择 2.2.1 递归特征消除 2.3 嵌入式特征选择 2.3.1 决策树特征重要性 一、特征选择概念 特征选择是机器学习非常重要的一个步骤&#x…...

从电商角度设计大模型的 Prompt

从电商角度设计大模型的 Prompt&#xff0c;有一个关键核心思路&#xff1a;围绕具体业务场景明确任务目标输出格式&#xff0c;帮助模型为运营、客服、营销、数据分析等工作提效。以下是电商场景下 Prompt 设计的完整指南&#xff0c;包含通用思路、模块范例、实战案例等内容。…...

从零基础到最佳实践:Vue.js 系列(5/10):《状态管理》

引言 你是不是正在用 Vue.js 开发一个很酷的应用&#xff0c;然后发现组件之间的数据传递变得越来越混乱&#xff1f;比如&#xff0c;一个按钮的状态要传到好几层组件&#xff0c;或者多个页面需要共享同一个用户信息。这时候&#xff0c;状态管理就登场了&#xff01;在 Vue…...

git checkout HEAD

git checkout HEAD 主要用于将工作目录和暂存区的内容重置为当前 HEAD 指向的提交状态&#xff0c;常用于撤销未提交的修改15。具体行为如下&#xff1a; 一、核心作用 ‌恢复工作区文件‌ 将指定文件或全部文件恢复到 HEAD 指向的提交状态&#xff0c;丢弃工作区中未暂存的修改…...

git工具使用

安装Git 在开始使用Git之前&#xff0c;需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包&#xff0c;并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…...

极大似然估计与机器学习

复习概统的时候突然发现好像极大似然估计MLE与机器学习的数据驱动非常相似&#xff0c;都是采样样本然后估计模型参数。貌似&#xff0c;后知后觉的才意识到极大似然估计就是机器学习有效的数学保证 下面以拟合线性分布的最小二乘与分类问题为例推到以下如何从似然函数推导出M…...

基于 Guns v5.1 框架的分页教程

基于 Guns v5.1 框架的分页教程 第一步&#xff1a;Controller 层处理前端请求 在 Controller 中&#xff0c;需要接收 Bootstrap Table 传来的分页参数&#xff08;limit, offset, sort, order&#xff09;。Guns 提供了封装好的 PageFactory 类来简化 Page 对象的创建。 R…...

从零搭建SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库

系列文章 从零搭建SpringBoot Web单体项目【基础篇】1、IDEA搭建SpringBoot项目 从零搭建 SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库 目录 一、项目基础环境说明 二、数据库整合流程 1. 添加 MyBatis-Plus 相关依赖&#xff08;pom.xml&#xff09; 2…...

Supplemental Table 5FAM49B H-SCORE与其他临床特征的关系

以下是针对 Supplemental Table 5 中不同变量类型所需检验方法的 SPSS纯界面操作步骤(严格匹配原文统计方法): Supplemental Table 5 SPSS操作步骤 目标:分析FAM49B H-SCORE与其他临床特征的关系,按变量类型选择检验方法。 变量与检验方法对应表 变量变量类型检验方法SP…...

信息系统项目管理师考前练习4

项目范围基准变更 当客户提出新增功能需求时,项目经理首先应该: A. 立即更新范围说明书 B. 提交变更请求并评估影响 C. 要求团队加班实现 D. 拒绝变更以保持进度 答案:B 解析:所有范围变更必须走正式变更流程(第5版强调变更控制),评估影响是第一步。 混合项目管理模式…...

C语言判断素数(附带源码和解析)

素数&#xff0c;也称为质数&#xff0c;是一个大于 1 的自然数&#xff0c;除了 1 和它本身外&#xff0c;不能被其他自然数整除。换句话说&#xff0c;素数只有两个因子&#xff1a;1 和它自身。例如&#xff0c;2、3、5、7、11 和 13 都是素数。 素数在数学和计算机科学中扮…...

汽车电子电气架构诊断功能开发全流程解析

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

Xilinx XCAU10P-2FFVB676I 赛灵思 Artix UltraScale+ FPGA

XCAU10P-2FFVB676I 是 AMD Xilinx 推出的 Artix UltraScale™ FPGA 器件&#xff0c;内部集成了约 96,250 逻辑单元&#xff0c;满足中等规模高性能应用的需求。该芯片采用 16 nm FinFET 制程工艺&#xff0c;核心电压典型值约 0.85 V&#xff0c;能够在较低功耗下提供高达 775…...

DS18B20 温度传感器实验探索与实践分享​

DS18B20 温度传感器实验探索与实践分享 在嵌入式系统开发领域&#xff0c;温度监测是常见的应用场景。本次实验聚焦于 DS18B20 温度传感器&#xff0c;旨在掌握其工作原理、单总线通信方式&#xff0c;以及实现温度采集与数码管显示&#xff0c;同时开启温度报警功能。接下来&…...

RT_Thread——内存管理

文章目录 一、为什么要自己实现内存管理二、RT-Thread 的内存管理方法2.1 小内存管理算法2.2 slab 管理算法2.3 memheap 管理算法 三、Heap 相关的函数3.1 rt_system_heap_init3.2 rt_malloc/rt_realloc/rt_calloc2.3 rt_free2.4 rt_malloc_sethook/rt_free_sethook 一、为什么…...

Temporary failure in name resolution

这个错误 ping: baidu.com: Temporary failure in name resolution 通常表示 DNS 解析的问题&#xff0c;也就是说你的系统无法通过域名服务器解析 baidu.com 的 IP 地址。 解决方案&#xff1a; 检查 DNS 配置( 有效 )&#xff1a; 确保系统的 DNS 配置是正确的。你可以检查 …...

【动手学深度学习】1.4~1.8 深度学习的发展及其特征

目录 1.4. 起源1.5. 深度学习的发展1.6. 深度学习的成功案例1.7. 特点1.8. 小结 1.4. 起源 深度学习的起源可追溯至多个领域的长期发展&#xff1a; 统计学基础&#xff1a;早期统计学方法&#xff08;如伯努利分布、高斯分布、最小均方算法&#xff09;和估计思想&#xff08…...

深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略

LSTM深度解析 一、引言 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;在处理序列数据方面具有独特的优势&#xff0c;例如语音识别、自然语言处理等任务。然而&#xff0c;传统的 RNN 在处理长序列数据时面临着严重的梯度消失问题&#xff0c;这使得网…...

Gartner研究报告《Generative AI 赋能Digital Commerce的三种路径》学习心得

一、研究背景 随着生成式 AI(GenAI)技术的迅速发展,其在数字商务领域的应用受到了广泛关注。这篇研究报告深入探讨了 GenAI 在数字商务中的角色以及它如何与现有的数字商务技术相结合来发挥优势,为应用领导者提供了关于如何利用 GenAI 优化技术投资策略的见解。 二、GenA…...

解锁 YOLOv8 新潜能:EfficientViT 主干网络的优化实践与实验数据解读

文章目录 一、YOLO 系列主干网络的发展历程二、EfficientViT&#xff1a;YOLOv8 主干网络的新宠&#xff08;一&#xff09;EfficientViT 的核心优势&#xff08;二&#xff09;EfficientViT 在 YOLOv8 中的集成与实现 三、实验对比&#xff1a;EfficientViT vs. MobileNet 系列…...

【前端基础】12、CSS的overflow(visible、hidden、scroll、auto)【注:只有最基础的说明。】

一、overflow的作用 用于控制内容溢出时的行为。 二、overflow的使用 visible&#xff1a;超出的部分正常显示&#xff08;默认设定&#xff09; hidden&#xff1a;超出的部分隐藏显示&#xff08;直接裁剪掉&#xff09; scroll&#xff1a;超出的部分滚动显示 滚动条…...

创建一个element plus项目

当然可以&#xff01;下面是一个 Vue 3 Element Plus 的最简单完整示例&#xff0c;它包括&#xff1a; 使用 <el-button> 按钮组件点击按钮后用 ElMessage 弹出提示 ✅ 1. 安装并初始化项目&#xff08;如果还没创建项目&#xff09; 你可以用官方推荐的方式快速创建…...

openCV1.1 Mat对象

imread(“D:\souse\duoxile.jpg”, IMREAD_COLOR); 功能: 从指定路径读取图像文件并解码为OpenCV的Mat对象 第一个参数: 文件路径 类型: const string&描述: 要读取的图像文件的绝对或相对路径示例: “D:\souse\duoxile.jpg” 或 “./images/test.png”第二个参数: 读取模…...

C++:array容器

array容器是序列容器&#xff0c;它的特点是&#xff1a;静态&#xff0c;固定数目。可以看作更安全的数组。 它还有一些成员函数&#xff0c;如begin&#xff08;&#xff09;&#xff1a;返回指向容器中第一个元素的随机访问迭代器。 #include<iostream>//数组容器 #…...

26、AI 预测性维护 (燃气轮机轴承) - /安全与维护组件/ai-predictive-maintenance-turbine

76个工业组件库示例汇总 AI 预测性维护模拟组件 (燃气轮机轴承) 概述 这是一个交互式的 Web 组件,旨在模拟基于 AI 的预测性维护 (Predictive Maintenance, PdM) 概念,应用于工业燃气轮机的关键部件(例如轴承)。它通过模拟传感器数据、动态预测剩余使用寿命 (RUL),并根…...

特种兵参会

出发&#xff08;5.15&#xff09; 有了去年去5月去深圳参加OpenTenBase工委会成立的经验&#xff0c;今年这个时候去广州就一定要在下午16点前起飞。恰好到了候机口有蔚来的牛屋&#xff0c;进去躺了一会。飞机顺利到达广州。晚上小聚 总监约了祁总&#xff0c;我们相识多年&…...

手搓四人麻将程序

一、麻将牌的表示 在麻将游戏中&#xff0c;总共有一百四十四张牌&#xff0c;这些牌被分为多个类别&#xff0c;每个类别又包含了不同的牌型。具体来说&#xff0c;麻将牌主要包括序数牌、字牌和花牌三大类。序数牌中&#xff0c;包含有万子、条子和筒子&#xff0c;每种花色…...

一命通关单调栈

前言 我们只是卑微的后端开发。按理说&#xff0c;我们是不需要学这些比较进阶的算法的&#xff0c;可是&#xff0c;这个世界就是不讲道理。最开始&#xff0c;想法是给leetcode中等题全通关&#xff0c;我又不打ACM我去天天钻研hard干嘛&#xff0c;于是碰见单调栈树状数组的…...

NV009NV010美光闪存颗粒NV011NV012

NV009NV010美光闪存颗粒NV011NV012 美光NV009-NV012闪存颗粒技术解析与行业应用全景 一、核心技术架构与制程突破 美光NV009至NV012系列闪存颗粒基于第九代3D TLC架构&#xff0c;通过垂直堆叠技术突破传统2D平面存储的物理限制。该架构将存储单元分层排列&#xff0c;如同将…...

线程、线程池、异步

目录 什么是线程 什么是线程池 什么是异步 异步与线程关系 JS中的异步 什么是线程 线程 Thread 是计算机执行的最小单位&#xff0c;是 进程 内的一个实体&#xff0c;可以被操作系统独立调用和执行 线程可以理解为进程内的“程序执行流”&#xff0c;一个进程可以包含多…...

docker面试题(4)

Docker与Vagrant有何不同 两者的定位完全不同 Vagrant类似于Boot2Docker&#xff08;一款运行Docker的最小内核&#xff09;&#xff0c;是一套虚拟机的管理环境&#xff0c;Vagrant可 以在多种系统上和虚拟机软件中运行&#xff0c;可以在Windows、Mac等非Linux平台上为Docker…...

双检锁(Double-Checked Locking)单例模式

在项目中使用双检锁&#xff08;Double-Checked Locking&#xff09;单例模式来管理 JSON 格式化处理对象&#xff08;如 ObjectMapper 在 Jackson 库中&#xff0c;或 JsonParser 在 Gson 库中&#xff09;是一种常见的做法。这种模式确保了对象只被创建一次&#xff0c;同时在…...

建立java项目

java端: 在idea里面新建一个java,maven项目(springboot): 注意:JDK与java都得是一样的 添加基本的依赖项: 也可以在pom.xml中点击这个,从而跳转到添加依赖 建立三层架构: 在相应的java类中添加代码: <1.UserController package com.example.demo.controller;import com…...

Go语言内存共享与扩容机制 -《Go语言实战指南》

切片作为 Go 中的高频数据结构&#xff0c;其内存共享机制和自动扩容策略直接影响程序性能与行为&#xff0c;深入理解这两者&#xff0c;是高效使用切片的关键。 一、切片的内存结构回顾 切片是对底层数组的一个抽象&#xff0c;其本质是一个结构体&#xff1a; type slice …...

如果教材这样讲--单片机IO口Additional Functions和 Alternate Functions的区别

不管是硬件工程师还是嵌入式软件工程师&#xff0c;都应该能够熟练的看懂数据手册&#xff0c;尤其是英文。在设计单片机外围电路时&#xff0c;工程师需要了解单片机的GPIO口的各项功能来满足自己的设计需求&#xff0c;单片机小白们在查看单片机数据手册时&#xff0c;看到Ad…...

《Effective Java(第三版)》笔记

思维导图 1-4章 5-8章 9-12 章 资料 源码&#xff1a;https://github.com/jbloch/effective-java-3e-source-code...

实践大模型提示工程(Prompt Engineering)

任务目标 本文将结合实战营中的具体案例&#xff0c;分享在提示词设计、模型调用及复杂任务拆解中的实践心得&#xff0c;希望能为读者打开一扇通往 AI 开发实战的窗口。 书生浦语官方链接 实践一——写一段话介绍书生浦语实战营 在提示工程中&#xff0c;第一点给出清晰的…...