系统学习Linux-LVS集群
集群概述
负载均衡技术类型
四层负载均衡器 也称为 4 层交换机,主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等;
七层负载均衡器 也称为 7 层交换机,位于 OSI 的最高层,即应用层,此负载均衡器支持多种协议,如HTTP、FTP、SMTP 等。7 层负载均衡器可根据报文内容,配合一定的负载均衡算法来选择后端服务器,即“内容交换器”。如常见的 HAProxy、Nginx。
负载均衡实现方式
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
LVS结构
三层结构:负载调度器、服务器池、共享存储
架构对象:
VS:Virtual Server,也称为 Director,负载均衡服务器
RS:Real Server,真正的服务器,集群中各节点
VIP:Director 向外部提供服务的 IP
DIP:Director 向内部与 RS 通信的 IP
RIP:真实服务器的 IP
CIP:客户端的 IP
LVS工作模式
LVS-NAT(NAT模式)
LVS-DR(直接路由模式)(应用最广泛)
LVS-TUN(IP隧道(Tunnel)模式,不常用)
FULL-NAT模式(双向转换模式,不常用)
LVS负载均衡算法
静态负载均衡:
rr(round robin,轮询 )
wrr(weight round robin,加权轮询)
sh(source hashing,源地址散列算法(HASH))
dh(destination hashing,目标地址 HASH)
动态负载均衡:
lc(leash-connection,最少连接 )
简单算法:active * 256 + inactive (谁的小选谁)
wlc(加权最少连接)
简单算法:(active * 256 + inactive) / weight(谁的小选谁)
sed(最少期望延迟)
简单算法:(active + 1) * 256 / weight (谁的小选谁)
nq(never queue,永不排队)
LBLC(基于局部性的最少连接 )
LBLCR(基于局部性的带复制功能的最少连接)
ipvsadm命令详解
| -A | 添加虚拟服务节点 |
| -D | 删除虚拟服务节点 |
| -L | 查看虚拟服务节点列表 |
| -a | 添加真实服务节点 |
| -d | 删除真实服务节点 |
| -l | 查看真实服务节点列表 |
| -t | 指定虚拟服务器IP地址 |
| -s | 指定调度算法 |
| -r | 指定真实服务器节点IP地址 |
| -w | 指定权重值 |
| -g | 直接路由模式(默认) |
| -i | 隧道模式(不常用) |
| -m | NAT模式 |
| 案例 | ipvsadm -A -t 207.175.44.110:80 -s rr ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m |
| 基础配置 |
| systemctl stop firewalld.service systemctl stop NetworkManager setenforce 0 sed -i "s/ONBOOT=no/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-ens33 cat /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network |
| 修改主机名 |
| 关闭防火墙 |
| 关闭Selinux |
| 关闭Networkmanager |
| 配置IP地址 |
LVS配置案例
实现NAT模型搭建
负载调度器配置
配置IP地址
增加一块网卡
![]()
配置ens33和ens37网卡添加路由转发
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
#网卡1配置
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.4
PREFIX=24
GATEWAY=192.168.31.2
DNS1=192.168.31.2
[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens37
#网卡2配置
TYPE=Ethernet
BOOTPROTO=static
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR=192.168.217.100
PREFIX=24
GATEWAY=192.168.217.3
DNS1=192.168.217.3[root@localhost ~]# vim /etc/sysctl.d/route.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p /etc/sysctl/route.conf
查看网卡

修改宿主机

测试网通性

LVS2、LVS3(web1、web2)
安装nginx
#LVS2机器上nginx1网页配置
[root@localhost html]# yum -y install nginx
[root@localhost html]# systemctl start nginx
[root@localhost html]# ss -anl | grep :80
nl UNCONN 0 0 0:805 *
nl UNCONN 0 0 0:805 *
tcp LISTEN 0 128 *:80 *:*
tcp LISTEN 0 128 [::]:80 [::]:* #网络源安装完成后修改网关联到LVS主机ens37上
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.5
PREFIX=24
GATEWAY=192.168.217.100
DNS1=192.168.31.2
[root@localhost html]# ifdown ens33 && ifup ens33
成功断开设备 "ens33"。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)#写网页内容一会测试用
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# echo nginx1 index.html
nginx1 index.html
[root@localhost html]# echo nginx1 > index.html #LVS3机器上nginx2网页
[root@localhost html]# yum -y install nginx
[root@localhost html]# systemctl start nginx
[root@localhost html]# ss -anl | grep :80
nl UNCONN 0 0 0:809 *
nl UNCONN 0 0 0:809 *
nl UNCONN 0 0 15:809 *
nl UNCONN 0 0 15:809 *
nl UNCONN 0 0 16:809 *
tcp LISTEN 0 128 *:80 *:*
tcp LISTEN 0 128 [::]:80 [::]:* #网络源安装完成后修改网关联到LVS主机ens37上
[root@localhost html]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.6
PREFIX=24
GATEWAY=192.168.217.100
DNS1=192.168.31.2
[root@localhost html]# ifdown ens33 && ifup ens33
成功断开设备 "ens33"。
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)#写网页内容一会测试用
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# echo nginx2 index.html
nginx1 index.html
[root@localhost html]# echo nginx2 > index.html
回到LVS1继续配置
通信与配置后主机安装
yum install -y ipvsadm
加载ip_vs模块并检测

启动ipvsadm服务
systemctl start ipvsadm
启动会报错少目录文件

创建目录
#创建目录后可以启动但没有文件
[root@localhost ~]# mkdir /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm
[root@localhost ~]# ipvsadm -A -t 192.168.217.100:80 -s rr
[root@localhost ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
[root@localhost ~]# 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.217.100:80 rr
#移动到ipvadm配置负载分配策略
root@localhost sysctl.d]# ipvsadm -A -t 192.168.217.100:80 -s rr
[root@localhost sysctl.d]# ipvsadm -a -t 192.168.217.100:80 -r 192.168.31.5:80 -m
[root@localhost sysctl.d]# ipvsadm -a -t 192.168.217.100:80 -r 192.168.31.6:80 -m
[root@localhost sysctl.d]# 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.217.100:80 rr-> 192.168.31.5:80 Masq 1 0 0 -> 192.168.31.6:80 Masq 1 0 0
[root@localhost sysctl.d]# ipvsadm-save > /etc/sysconfig/ipvsadm/ipvsadm
[root@localhost sysctl.d]# cd /etc/sysconfig/ipvsadm/
[root@localhost ipvsadm]# ls
ipvsadm

配置好后测试ctrl+f5刷新会从web1和web2一直跳转


实现DR模型搭建
DR模型原理

LVS-DR的工作原理就是:通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变
LVS-DR:直接路由的特点
Director和各RS上都配置使用VIP
(1)确保前端路由将目标IP为VIP的请求报文发往Director
(a)在前端网关做静态绑定
(b)在RS上使用arptables
(c)在RS上修改内核参数以限制ARP通告和应答级别
arp_announce
arp-ignore
(2)RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一IP网络,RIP的网关不能指向DIP,以确保响应报文不会经由Director
(3)RS跟Director要在同一个物理网络
(4)请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client
(5)不支持端口映射
还用刚才的试验机所以要关闭网卡2 清空数据还原成新的主机
[root@localhost ~]# ipvsadm -C
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn

删除ens37配置文件
![]()
留一块ens33的配置文件网卡

删除ipvsadm的配置文件 并创建新的ipvsadm配置文件
[root@localhost ~]# rm -rf /etc/sysconfig/ipvsadm
[root@localhost ~]# touch /etc//sysconfig/ipvsadm
删除路由转发功能
[root@localhost ~]# cd /etc/sysctl.d/
[root@localhost ~]# rm -rf route.conf
复制网卡配置ens33:0
[root@localhost sysctl.d]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:0
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.31.200
PREFIX=24
#GATEWAY=192.168.31.2
#DNS1=192.168.31.2
[root@localhost network-scripts]# systemctl restart network
配置负载分配策略
[root@localhost network-scripts]# ipvsadm -A -t 192.168.31.200:80 -s rr
[root@localhost network-scripts]# ipvsadm -a -t 192.168.31.200:80 -r 192.168.31.5:80 -g
[root@localhost network-scripts]# ipvsadm -a -t 192.168.31.200:80 -r 192.168.31.6:80 -g
[root@localhost network-scripts]# 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.31.200:80 rr-> 192.168.31.5:80 Route 1 0 0 -> 192.168.31.6:80 Route 1 0 0
保存策略
[root@localhost network-scripts]# ipvsadm-save > /etc/sysconfig/ipvsadm
接下来配置两台web
先将两台web服务器上注销网关与DNS
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@localhost ~]# systemctl restart network


首先负载调度器配置
内核参数配置生效后才可以进行配置web节点配置
调整ARP参数

[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
配置虚拟ip地址
注意:web服务器虚拟地址为32位子网验码
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# ls
ifcfg-ens33 ifdown-ib ifdown-routes ifup-aliases ifup-isdn ifup-sit network-functions
ifdown-ippp ifdown-sit ifup-bnep ifup-plip ifup-Team network-functions-ipv6
ifcfg-lo ifdown-ipv6 ifdown-Team ifup-eth ifup-plusb ifup-TeamPort
ifdown ifdown-isdn ifdown-TeamPort ifup-ib ifup-post ifup-tunnel
ifdown-bnep ifdown-post ifdown-tunnel ifup-ippp ifup-ppp ifup-wireless
ifdown-eth ifdown-ppp ifup ifup-ipv6 ifup-routes init.ipv6-global
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.31.200
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback:0
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.31.200/32 brd 192.168.31.200 scope global lo:0valid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:12:94:c3 brd ff:ff:ff:ff:ff:ffinet 192.168.31.5/24 brd 192.168.31.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe12:94c3/64 scope link valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 52:54:00:45:34:d8 brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000link/ether 52:54:00:45:34:d8 brd ff:ff:ff:ff:ff:ff
web服务器分别添加回环路由
[root@localhost network-scripts]# route add -host 192.168.31.200/32 dev lo:0
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.31.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
这样重启就没有了 写到etc下的bashrc或
写下来就可以访问了
ctrl+f5
也可以先tcpdump抓包
tcpdump -i ens33:0 >> ./tcpdump.txt
查找看http的包

或者用Wireshark抓包软件 可以看到全是200网段看不到web1、2的ip地址

课下了解内容CDN内容分发网络—网页缓存加速
相关文章:
系统学习Linux-LVS集群
集群概述 负载均衡技术类型 四层负载均衡器 也称为 4 层交换机,主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等; 七层负载均衡器 也称为 7 层交换机,位于 OSI 的最高层,即…...
使用matplotlib绘制动图
主程序如下: 项目:701项目三分报告 作者:WN 内容:速度障碍法实现 时间:2023年8月26号import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import animation from utils import *uav1 Agen…...
加油站ai视觉分析检测预警
加油站ai视觉分析预警系统通过yolov8图像识别和行为分析,加油站ai视觉分析预警算法识别出打电话抽烟、烟火行为、静电释放时间是否合规、灭火器摆放以及人员工服等不符合规定的行为,并发出预警信号以提醒相关人员。YOLOv8 的推理过程和 YOLOv5 几乎一样&…...
Docker构建镜像
Docker根据Dockerfile文件构建镜像 在实际生产中,常常使用Dockerfile构建企业级生产环境镜像,然后再部署在我们的生产环境中,本文将从从零开始介绍Dockerfile如何使用,构建镜像。 Dockerhub官网地址:https://registry.hub.docke…...
【太多网工对NAT还存在这4种误解!你是其中一个吗?】
NAT是解决公网地址不够用大家最熟悉的网络技术之一,而NAT最依赖的是NAT translation表项,至于NAT的概念和背景这里不再解释,网络上有很多关于此的类似介绍,自己搜索即可。下面主要是针对大家对NAT的一些误解进行分析。 1 误解一…...
React钩子函数之useEffect,useLayoutEffect与useInsertionEffect的区别
React钩子函数在React开发中扮演着非常重要的角色。其中,useEffect、useLayoutEffect和useInsertionEffect是三个常用的钩子函数,它们的作用虽然有些相似,但是也存在一些区别。在本文中,我们将详细介绍这三个钩子函数的区别&#…...
Unity——后期处理举例
Post Processing(后期处理)并不属于特效,但现代的特效表现离不开后期处理的支持。本文以眩光(Bloom)为例,展示一种明亮的激光的制作方法 1、安装后期处理扩展包 较新的Unity版本已经内置了新版的后期处理扩…...
PMP P-05 Quality Management
质量管理...
vue中css修改滚动条样式
vue中css修改滚动条样式 效果图: 代码(在app.vue中全局增加下面样式即可): &::-webkit-scrollbar {width: 8px;height: 8px;border-radius: 3px;}/*定义滚动条轨道 内阴影圆角*/&::-webkit-scrollbar-track {//-webkit-box-shadow: inset 0 0 …...
uniapp的H5实现图片长按保存
实现图片预览 使用uniapp的api实现图片预览,可以缩放,关闭等操作 uni.previewImage({urls:[imageUrl],success:()>{this.controllTouch();} }) imageUrl是图片地址,如https://www.111.com/abc/image.png urls是字符串数组,…...
Java 8:Stream API 流式操作(学习)
Java 8:Stream API Java 8 中的 Stream API 是一组用于对集合数据进行处理的新特性;提供一种以声明式风格对集合进行操作的方式,简化集合的处理,使得代码更加简洁、优雅,并且能够更高效地处理数据; 这种风格…...
04_20 直接使用代码 创建内核模块获取物理内存信息
好像和 free得出来有关 和/proc/meminfo 有关 但是下面是全部的物理页 #include <linux/version.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h>//下面宏表示物理内存空间起始地址 对应页帧号 #define ARCH_PFN_OFFSET…...
<C++> STL_list
1.list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。list与…...
聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化
聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化 目录 聚类分析 | MATLAB实现基于FCM模糊C均值聚类结果可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 FCM模糊C均值聚类,聚类结果可视化,MATLAB程序。 FCM(Fuzzy C-Means&a…...
C++笔记之设计模式:setter函数、依赖注入
C笔记之设计模式:setter函数、依赖注入 参考笔记: 1.C笔记之静态成员函数可以在类外部访问私有构造函数吗? 2.C笔记之设计模式:setter函数、依赖注入 3.C笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究…...
Spring MVC详解
文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、接收请求参数3.1 基本类型参数3.2 实体收参【重点】3.3 数组收参3.4 集合收参 【了解】3.5 路径参数3.6 中文乱码 四…...
谷歌公开.zip域名,应采取哪些措施应对可能的安全风险?
近期,谷歌发布了几个新的顶级域名,这些新域名包括.dad、.esq、.prof、.phd、.nexus、.foo、.mov以及本文我们将要提到的.zip域名。自发布以来,多个安全社区都开始讨论这些顶级域名所带来的影响,主要原因是.zip很容易被误认为是文件…...
css3滤镜属性filter让网页变黑白
今天是特殊的日子,抗击疫情全国哀悼日,向英雄们致敬,一路走好!应该发现了今天很多网站页面都是黑白色的,我的博客今天都是黑白色,用css3滤镜属性filter让网页马上变黑白,一行代码就搞定。 在你…...
C++教程 - How to C++系列专栏第5篇
关于专栏 这个专栏是优质的C教程专栏,如果你还没看过第0篇,点击这里去第0篇 本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C编译器:Clang 感谢一路相伴的朋友们,感谢你…...
Vue2向Vue3过度核心技术插槽
目录 1 插槽-默认插槽1.作用2.需求3.问题4.插槽的基本语法5.代码示例6.总结 2 插槽-后备内容(默认值)1.问题2.插槽的后备内容3.语法4.效果5.代码示例 3 插槽-具名插槽1.需求2.具名插槽语法3.v-slot的简写4.总结 4 作用域插槽1.插槽分类2.作用3.场景4.使用…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
