LVS的三种工作模式---(DR/TUN/NAT)

目录

一、NAT模式(LVS-NAT)

二、IP隧道模式(LVS-TUN)

三、DR模型--直接路由模式(LVS-DR)

LVS/DR模式ARP抑制

 原因:

LVS的DR工作模式及配置:

LVS的NAT工作模式及配置:


一、NAT模式(LVS-NAT)

原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此真实服务器RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可。

在整个过程中,负载调度作为NAT设备,负责将请求数据包的源IP从客户端IP转换为负载调度器的VIP(虚拟IP),并将响应数据包的源IP从真实服务器的私有IP转换回VIP

二、IP隧道模式(LVS-TUN)

       调度器把请求的报文通过 IP 隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用 lvs-tun 模式后,可以大大的减少对负载调度器的压力,集群系统的最大吞吐量可以提高 10 倍

三、DR模型--直接路由模式(LVS-DR)

      客户端向目标vip发出请求,lvs接收 ,LVS根据负载均衡算法选择一台活跃的的节点,将此节点的ip所在网卡的mac地址作为目标mac地址,发送到局域网里

节点在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送到局域网.此时IP包的目标ip是客户端,源ip是自己的vip地址。

LVS的DR工作模式及配置:

环境准备:

四台openEuler操作系统的虚拟机

openEuler node1充当前端的负载调度器

openEuler node2充当客户端测试

openEuler node3充当后端web服务器

openEuler node4充当后端web服务器

关闭所有防火墙和selinux

openEuler node3和openEuler node4 :

添加dummy类型的接口VIP:

[root@node1 ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.182.140/24

[root@node3 ~]# nmcli con add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.182.140/24

[root@node4 ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.182.140/24

修改相应的ARP内核配置(ARP的抑制)

[root@node3 ~]# cat >> /etc/sysctl.conf << EOF

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

net.ipv4.conf.dummy1.arp_ignore=1

net.ipv4.conf.dummy1.arp_announce=2

EOF

[root@node3~]# sysctl -p           使其生效

[root@node4 ~]# cat >> /etc/sysctl.conf << EOF

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

net.ipv4.conf.dummy1.arp_ignore=1

net.ipv4.conf.dummy1.arp_announce=2

EOF

[root@node4~]# sysctl -p           使其生效

准备web站点:

[root@node3 ~]# dnf install nginx -y

[root@node4 ~]# dnf install nginx -y

提供默认主页:

[root@node3 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node3 ~]# systemctl start nginx

[root@node4 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node4 ~]# systemctl start nginx

openEuler node2:测试

[root@node2 ~]# curl 192.168.182.144

web test page,my ip is192.168.182.144 192.168.182.140 .

[root@node2 ~]# curl 192.168.182.143

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

准备安装工具:

[root@node1 ~]# dnf install ipvsadm -y

几种常见的算法:

rr

轮循调度(Round-Robin),它将请求依次分配不同的RS,也就是在RS中均摊请求。这种

算法简单,但是只适合于处理性能相差不大的情况

wrr

加权轮循调度(Weighted Round-Robin)它将依据不同RS的权值分配任务。权值较高的

RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相

同数目的连接数。

wlc

加权最小连接数调度(weighted leastconnection)假设各台RS的权值依次为wi

(i=1..n),当前的TCP连接数依次为Ti(i=1..n),依次选取Ti/Wi为最小的RS作为下一个

分配的RS。

lc

最小连接数调度(Least-Connection),IPVS表存储了所有的活动的连接。把心的连接请

求发送到当前连接数最小的RS。

负载均衡器:

[root@node1 ~]# ipvsadm -At 192.168.182.140:80 -s  rr   

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.143:80

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.144:80

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.182.140:80 wlc

  -> 192.168.182.143:80           Route   1      0          0        

  -> 192.168.182.144:80           Route   1      0          0

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.140;done

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

加权轮询调度算法:

[root@node1 ~]# ipvsadm -At 192.168.182.140:80 -s  wrr   

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.144:80    不指定默认为1

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.143:80 -w 2    指定143web服务器为2

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.182.140:80 wrr

  -> 192.168.182.143:80           Route   2      0          3        

  -> 192.168.182.144:80           Route   1      0          3

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.140;done

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

常用命令:

[root@node1 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm    保存这个加权轮询调度算法

[root@node1 ~]# cat /etc/sysconfig/ipvsadm

-A -t 192.168.182.140:80 -s wrr

-a -t 192.168.182.140:80 -r 192.168.182.143:80 -g -w 2

-a -t 192.168.182.140:80 -r 192.168.182.144:80 -g -w 1

[root@node1 ~]# ipvsadm -C   清除

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActCon

[root@node1 ~]# ipvsadm -R < /etc/sysconfig/ipvsadm   恢复

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.182.140:80 wrr

  -> 192.168.182.143:80           Route   2      0          0        

  -> 192.168.182.144:80           Route   1      0          0  

删除VIP接口:

[root@node1 ~]# nmcli connection  delete dummy-dummy1

成功删除连接 "dummy-dummy1" (bfe8c98b-1e87-4cf9-b3b7-49f2ca4699a9)。

ARP抑制:

[root@node3 ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore

1

另一种方法:使用arptables工具来做arp抑制

[root@node1 ~]# dnf install arptables -y

[root@node1 ~]# arptables -A INPUT -d 192.168.182.140 -j DROP    抑制dummy-dummy1这个接口流量的流入

[root@node1 ~]# arptables -A OUTPUT -s 192.168.182.140 -j mangle --mangle-ip-s 192.168.182.140

[root@node1 ~]# arptables-save > /etc/sysconfig/arptables   保存

[root@node1 ~]# arptables -F

[root@node1 ~]# arptables -L -n

Chain INPUT (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)

[root@node1 ~]# arptables-restore < /etc/sysconfig/arptables    恢复

[root@node1 ~]# arptables -L -n

Chain INPUT (policy ACCEPT)

-j DROP -d 192.168.182.140

Chain OUTPUT (policy ACCEPT)

-j mangle -s 192.168.182.140 --mangle-ip-s 192.168.182.140

Chain FORWARD (policy ACCEPT)

[root@node1 ~]#

LVS的NAT工作模式及配置:

环境准备:准备4台openEuler操作系统的虚拟机

openEuler node1充当前端的负载调度器

openEuler node2充当客户端测试

openEuler node3充当后端web服务器

openEuler node4充当后端web服务器

VMWARE

openEuler node1上增加网络适配器并改为仅主机模式

openEuler node3上网络适配器改为仅主机模式

openEuler node4上网络适配器改为仅主机模式

[root@node1 ~]# nmcli connection add type ethernet ifname ens224 ipv4.method manual ipv4.addresses 10.10.10.21/24

在openEuler node3和openEuler node4上使用nmtui命令修改ip地址分别是10.10.10.2310.10.10.24,网关都指向10.10.10.21的内网,无DNS

[root@node1 ~]# echo  1 > /proc/sys/net/ipv4/ip_forward     开启路由转发

开启路由转发:

临时开启:

方法1 echo 1 > /proc/sys/net/ipv4/ip_forward

方法2 sysctl -w net.ipv4.ip_forward=1

永久开启:

Vim /etc/sysctl.conf

准备web站点:

[root@node3 ~]# dnf install nginx -y

[root@node4 ~]# dnf install nginx -y

提供默认主页:

[root@node3 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node3 ~]# systemctl start nginx

[root@node4 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node4 ~]# systemctl start nginx

[root@node1 ~]# ipvsadm -At 192.168.182.141:80 -s  rr   

[root@node1 ~]# ipvsadm -at 192.168.182.141:80 -r 10.10.10.23:80  -m   指定目标为NAT转发模式

[root@node1 ~]# ipvsadm -at 192.168.182.141:80 -r 10.10.10.24:80  -m   指定目标为NAT转发模式

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.182.141:80 rr

  -> 10.10.10.23:80                        Masq     1              0                      0        

  -> 10.10.10.24:80                        Masq     1              0                      0

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.141;done

web test page,my ip is 10.10.10.23.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.23.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.23.

web test page,my ip is 10.10.10.24.

[root@node1 ~]# ipvsadm -Et 192.168.182.141:80 -s wrr -p 60   60秒内都由某个服务器来提供响应

[root@node1 ~]# iptables -t mangle -A PREROUTING -d 192.168.182.141 -p tcp --dport 80 -j MARK --set-mark 10

# 添加一个防火墙规则,当目标地址为 192.168.182.141 并且 目标端口为 80 时给数据包打一

个标记,设置mark 值为 10

[root@node1 ~]# iptables -t mangle -A PREROUTING -d 192.168.182.141 -p tcp --dport 443 -j MARK --set-mark 10

# 添加一个防火墙规则,当目标地址为 192.168.182.141 并且 目标端口为 443 时给数据包打一个标记,

设置mark 值为 10

[root@node1 ~]# ipvsadm -A -f 10 -s rr -p 100 # 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使  轮询算法,持久化时间100

[root@node1 ~]# ipvsadm -a -f 10 -r 10.10.10.23:80 -m

[root@node1 ~]# ipvsadm -a -f 10 -r 10.10.10.24:80 -m

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

FWM  10 rr persistent 100

  -> 10.10.10.23:80               Masq    1      0          0        

  -> 10.10.10.24:80               Masq    1      0          0        

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.141;done

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

[root@node1 ~]# ipvsadm -D -f 10 删除

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

openEuler版本自带iptables

[root@node1 ~]# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination        

MARK       tcp  --  0.0.0.0/0            192.168.182.141      tcp dpt:80 MARK set 0xa

MARK       tcp  --  0.0.0.0/0            192.168.182.141      tcp dpt:443 MARK set 0xa

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination  

[root@node1 ~]# iptables -t mangle -F  清空防火墙

问题:

LVS没有健康检测功能

LVS存在单点故障

解决方法:使用ldirectord第三方软件工具

[root@node1 ~]# dnf install ldirectord

[root@node1 ~]# vim /etc/ha.d/ldirectord.cf

quiescent=no

virtual=192.168.182.141:80

        servicename=Web Site

        comment=Test load balanced web site

        real=10.10.10.23:80 masq

        real=10.10.10.24:80 masq

        #fallback=127.0.0.1:80 gate

        service=http

        scheduler=rr

        #persistent=600

        #netmask=255.255.255.255

        protocol=tcp

        checktype=negotiate

        checkport=80

        request="index.html"

        receive="test page"

[root@node1 ~]# systemctl start ldirectord.service

测试:模拟一台服务器不工作时:

[root@node3 ~]# systemctl stop nginx.service    模拟关闭nginx服务

[root@node1 ~]# watch ipvsadm -Ln

Every 2.0s: ipvsadm -Ln          node1: Tue Apr 16 16:12:38 2024

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InAc

tConn

TCP  192.168.182.141:80 rr

  -> 10.10.10.24:80               Masq    1         0          0

[root@node2 ~]# for ((i=1;i<=8;i++));do curl 192.168.182.141; done

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

[root@node1 ~]# yum install nginx -y

[root@node1 ~]# vim /etc/nginx/nginx.conf

[root@node1 ~]# echo "服务器维护中..." > /usr/share/nginx/html/index.html

[root@node1 ~]# systemctl start nginx.service

[root@node1 ~]# vim /etc/ha.d/ldirectord.cf

quiescent=no

checktimeout=3

checkinterval=1

autoreload=yes

#fallback=127.0.0.1:8080

virtual=192.168.182.141:80

        servicename=Web Site

        comment=Test load balanced web site

        real=10.10.10.23:80 masq

        real=10.10.10.24:80 masq

        fallback=10.10.10.21:8080 masq

        service=http

        scheduler=rr

        #persistent=600

        #netmask=255.255.255.255

        protocol=tcp

        checktype=negotiate

        checkport=80

        request="index.html"

        receive="test page"

测试:模拟两台服务器都不工作:

[root@node3 ~]# systemctl stop nginx.service

[root@node4 ~]# systemctl stop nginx.service

[root@node1 ~]# watch ipvsadm -Ln

Every 2.0s: ipvsadm -Ln                                                                               node1: Tue Apr 16 16:38:28 2024

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.182.141:80 rr

  -> 10.10.10.21:8080             Masq    1         0          0

[root@node2 ~]# for ((i=1;i<=8;i++));do curl 192.168.182.141; done

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

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

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

相关文章

Python游戏制作大师,Pygame库的深度探索与实践

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#x…

ppt图片居中对齐

今天简单尝试了一下ppt图片怎么居中对齐&#xff0c;记录如下 准备一张图片 可以把位置该成居中 就可以让图形居中了

完全背包问题(c++)

完全背包问题 当前有 N 种物品&#xff0c;第 i 种物品的体积是 ci​&#xff0c;价值是 wi​。 每种物品的数量都是无限的&#xff0c;可以选择任意数量放入背包。 现有容量为 V 的背包&#xff0c;请你放入若干物品&#xff0c;使总体积不超过 V&#xff0c;并且总价值尽可…

7. path路径绘制:使用path绘制曲线

曲线在SVG中通常是通过贝塞尔曲线命令来绘制的&#xff0c;包括二次贝塞尔曲线&#xff08;Q&#xff09;和三次贝塞尔曲线&#xff08;C&#xff09;。这些命令允许我们创建平滑的曲线路径。 贝塞尔曲线的原理 贝塞尔曲线的基本原理是通过控制点和锚点来定义一条曲线的形状。…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中&#xff0c;Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作&#xff0c;以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系&#xff1a;用户在View上进行操作&…

数据结构复习指导之树、森林

文章目录 树、森林 考纲内容 复习提示 1.树的存储结构 1.1双亲表示法 1.2孩子表示法 1.3孩子兄弟表示法 2.树、森林、与二叉树的转换 2.1树转换为二叉树 2.2森林转换为二叉树 2.3二叉树转换为森林 3.树和森林的遍历 3.1树的遍历 3.2森林的遍历 树、森林 考纲内容…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具&#xff0c;其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息&#xff0c;还能有效提高工作效率。然而&#xff0c;市场上很多便签应用仅限于单一平台使用&#xff0c;对于需要在手机和电脑间频繁切换…

FPGA第1篇,FPGA现场可编程门阵列,从0开始掌握可编程硬件开发(FPGA入门指南)

简介&#xff1a;FPGA全称Field-Programmable Gate Array&#xff0c;是一种可编程逻辑器件&#xff0c;它通过可编程的逻辑单元和可编程的连接网络实现了灵活的硬件实现。与固定功能的集成电路&#xff08;ASIC&#xff09;相比&#xff0c;FPGA具有更高的灵活性和可重新配置性…

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词&#xff0c;以及random库来随机选择单词。 使用after方法来定时更新窗口的位置&#xff0c;实现单词窗口的慢慢移动效果 使用…

day10-Map集合

Map 1.Map 1.1 Map简介 1.为什么使用Map集合 购物车提供的四个商品和购买的数量在后台需要容器存储。 每个商品对象都一一对应一个购买数量。 把商品对象看成是Map集合的键&#xff0c;购买数量看成Map集合的值。 例如: {商品12 , 商品23 &#xff0c; 商品3 2 , 商品4…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名&#xff0c;是因为既可以拉取…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发&#xff0c;在这个开发过程中会用到较多的接口、类、抽象类&#xff0c;它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器&#xff0c;而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式&#xff1a; // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意&#xff1a;此种方式如果在远程服务器上的JupyterLab上运行&#xff0c;可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键&#xff0c;之后关闭所有窗口 cv2.w…

c语言题库之多个数组从两边移动向中间汇聚

文章目录 题目分析代码实现代码分析 题目 c语言题库之多个数组从两边移动向中间汇聚 呈现效果&#xff1a;输入想要输入的字符数组呈现数组从两边向中间逐渐打开的样子 分析 首先我们需要一组我们想要输入的字符数组用来展示打开的字符其次我们需要进行对数组的替换&#x…

基于STM32单片机的环境监测系统设计与实现

基于STM32单片机的环境监测系统设计与实现 摘要 随着环境污染和室内空气质量问题的日益严重&#xff0c;环境监测系统的应用变得尤为重要。本文设计并实现了一种基于STM32单片机的环境监测系统&#xff0c;该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓…

怎么把学浪课程视频下载到相册

在这个快节奏的学习时代&#xff0c;每一刻的知识获取都显得至关重要。想象一下&#xff0c;在浩瀚如海的学浪app中&#xff0c;你已经找到了那些能够点亮智慧的课程视频&#xff0c;它们不仅充满了启发&#xff0c;还是你求学旅途中的宝贵资源。但是&#xff0c;在网络不稳定或…

Unity2D 模拟手柄实现玩家移动

1&#xff0c;创建控制器UI 2&#xff0c;挂载脚本 3&#xff0c;脚本编写 基本要素 [Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed 1f;[Tooltip("玩家动画")]public Animator animator;public …

Docker in Docker(DinD)原理与实战

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker幻想曲&#xff1a;从零开始&#xff0c;征服容器宇宙》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Docker简介 2、Docker …

MES系统与WMS集成方法(满分100学习资料)

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…