Day06-01-lvs

news2024/11/16 3:34:56

Day06-01-lvs

  • 0. 核心内容
  • 1.负载均衡项目 选择
    • 故障:
  • 2.lvs 预备姿势-arp
  • 3.lvs 概述
  • 4. lvs工作模式
    • 4.1 预备姿势
    • 4.2 lvs-dr模式
    • 4.3 lvs-nat模式
    • 4.4 小结
  • 5. lvs-dr模式
    • 5.1 环境准备
    • 5.2 lvs-dr模式配置流程
      • 1) lvs服务端配置
      • 2) web服务器 RS服务端配置
      • 3) 小结
      • 4) 调试
    • 5.3 抓包查看lvs dr
    • 5.4 lvs规则 备份与恢复
  • 6. lvs 负载均衡排错流程
  • 7. lvs 与keepalived配合
  • 8. lvs

0. 核心内容

  • 负载均衡选型项目
  • 负载均衡 lvs 工作模式 : dr nat tun full nat
  • 部署后通过wireshark抓包

1.负载均衡项目 选择

star法则:表达故障/项目 如何说的更流畅或逻辑性

  • s situation 场景/在什么情况下?
  • t task/target 目标/你要完成什么?
  • a action 动作/你是怎么做的?
  • r result 结果/最终结果如何?
负载均衡选择项目
s公司演变用户量越来越多.选择负载均衡 搭建多台web服务器.对比与选择 负载均衡
T选择1款 适合负载均衡
A1.找出市面上常见负载均衡: 硬件F5 A10 开源软件: lvs,nginx,haproxy
2.对比
3.根据公司实际需求选择
R根据当前访问量,选择 nginx负载均衡 nginx proxy缓存.
常见负载均衡对比优势缺点
硬件:F5性能好 技术支持价格昂贵 购买2台1对 .
lvs工作四层 效率极其高 对数据做的转发 负载均衡部署 维护(运维成本较高)
nginx/tengine/openresty(lua)使用简单 支持4层(1.9版本后支持)和7层 反向代理 缓存 流量镜像(mirror)处理数据代理模式 替用户去查找 找到后发送给用户 并发较大(1w以上) 卡
haproxy相对复杂 支持4层和7层 反向代理 动态加载配置文件处理数据代理模式 替用户去查找 找到后发送给用户 并发较大(1w以上 比nginx多) 卡
云服务: clb(slb)clb 4层和7层只能支持url或者域名的转发
albalb 7层支持更多的7层的转发功能 基于用户请求头 http_user_agent 用户语言 镜像流量(申请,深圳)
  • 4层 lb vs 7层 lb
    • 4层负载均衡 传输层 负载均衡最多认识到端口
    • 7层负载均衡 应用层 url uri 转发 http https

image-20240524142026190

image-20240524142035506

  • 负载均衡: Lvs 对数据进行转发

  • 反向代理: nginx/haproxy 做的代理 代替用户找,找到后发送给用户

  • lvs vs ngx区别

lvsngx
区别01仅工作在4层,性能好4层和7层,配置方便
区别02lvs(DR模式)处理数据流程是转发ngx对处理进行代理(2次请求,2次响应)

故障:

一.多个虚拟主机通过域名访问 直接访问web服务器ok 通过负载均衡 访问 只显示 第1个虚拟主机.

负载均衡向后端发出请求的时候 请求Host upstream 池塘 名称. 所以相当于是使用ip访问后端服务器.

访问第1个虚拟主机.

proxy_set_header Host $host;

二.使用负载均衡后端web服务器记录用户真实ip(客户端ip)地址

proxy_set_header X-Forwarded-For $remote_addr;

2.lvs 预备姿势-arp

  • DNS 域名解析 域名 -->ip

  • arp协议 地址解析协议 IP----->mac地址 3层协议工作在2层

    • ip(网络层 3层)
    • mac (2层)
  • arp解析过程

    • 发出广播 请求ip对应的mac地址是? Who has 10.0.0.8? Tell 10.0.0.7
    • 发出响应 单播 告诉对方我的mac地址是xxxx
    • 0.8 发请请求 询问 .7的mac地址 单播
    • 0.7 把自己mac地址 发送给.8
    • 0.7缓存1份mac地址(arp缓存)

image-20240526155250612

  • arp病毒
  • 老男孩教育-arp欺骗
    • 员工入职的时候 记录号 mac 或 mac和ip绑定
    • 找出mac 在网络设备 屏蔽

image-20240526155328283

3.lvs 概述

  • sersync /jumpserver
  • linux virtual server linux虚拟服务器 负载均衡
  • lvs 放到Linux内核中 内核模块 ip_vs
  • 通过命令行管理工具或服务,间接管理lvs
    • 命令行管理命令 ipvsadm ()
    • 服务: keepalived通过配置文件的方式管理lvs. ( keepalived for lvs ) 控制管理 ip_vs内核模块

image-20240524143419451

4. lvs工作模式

  • dr direct routing 直接路由模式

  • nat

  • tun 隧道

  • full nat 完全nat模式

4.1 预备姿势

image-20240526155531493

名称单词含义
CIPclient ip客户端ip地址
VIPVirtual ip虚拟ip
DIPdirector ip负载均衡本身的ip
RS服务器real server真实服务器 处理用户请求.
RIPReal erver IPreal server ip 真实服务器的ip地址

4.2 lvs-dr模式

image-20240526155757964

image-20240526155812337

  • 特点
    • lvs dr模式中lvs只负责转发并修改用户的目标IP的mac地址 dmact
    • lvs dr模式中服务端给用户的响应是通过后端rs服务器处理直接响应给用户. 不需要再通过lvs.
    • lvs vip公网ip,rs服务器也要有公网ip.
  • 优势
    • lvs dr支持更高并发(几万 几十万) ,nginx(1w)
  • 局限性
    • lvs服务器和后端rs服务器,必须要在同1个局域网,涉及到arp解析
    • 用户请求过来的端口,无法修改的. 用户的请求是什么端口 ,后端rs服务器就要开端口
    • lvs dr模式需要lvs服务器进行配置,同时还要在后端rs服务端:lo网卡绑定vip;抑制arp解析

4.3 lvs-nat模式

image-20240524151936969

image-20240526160020441

image-20240526160036253

  • lvs-nat模式特点
    • lvs服务器与rs服务器可以不在同一局域网
    • nat模式:流量进出都要经过lvs,效率性能不高 .
    • 端口也可以不同
  • 基于nat模式进阶模式 full-nat模式(数据流入的时候与nat模式一致,数据流出的时候类似于dr模型,直接响应给用户)

4.4 小结

  • lvs dr模式 nat模式 tun(隧道模式) full nat模式
  • 官网传送门http://www.linuxvirtualserver.org/zh/lvs3.html#google_vignette

5. lvs-dr模式

5.1 环境准备

主机服务ip
lb01lvs10.0.0.5
vipvip10.0.0.3
lb0210.0.0.6
web01nginx10.0.0.7
web02nginx10.0.0.8
  • lvs.oldboylinux.com
lb01 lb02 #nginx 关闭  
web01 web02 lvs.oldboylinux.com    
/code/lvs/index.html      
#web01
cat index.html  
lvs web01

#web02
cat index.html
lvs web02

[root@web01 ~]# cat /etc/nginx/conf.d/lvs.oldboylinux.com.conf
server {
   listen 80;
   server_name lvs.oldboylinux.cn;
   root /app/code/lvs;
   location / {
   index index.html ;
   }
}
[root@web01 ~]# curl -H Host:lvs.oldboylinux.com 172.16.1.7
lvs web01 10.0.0.7 172.16.1.7
[root@web01 ~]# curl -H Host:lvs.oldboylinux.com  172.16.1.8
lvs web02 10.0.0.8 172.16.1.8

#lb01 lb02
##关闭 keepalived   nginx负载均衡
systemctl stop keepalived nginx  
systemctl disable keepalived nginx  

yum install  -y ipvsadm
#软件包内容
/etc/sysconfig/ipvsadm-config
/usr/lib/systemd/system/ipvsadm.service
/usr/sbin/ipvsadm           #管理lvs规则 ip_vs
/usr/sbin/ipvsadm-restore   #恢复从文件中恢复lvs规则
/usr/sbin/ipvsadm-save      #保存lvs规则

#检查 ip_vs 内核模块是否加载
[root@lb01 ~]# lsmod |grep ip_vs
ip_vs                 145497  0
nf_conntrack          139264  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

5.2 lvs-dr模式配置流程

1) lvs服务端配置

#01.手动添加vip,后面是由keepalived生成
ip addr add 10.0.0.3/24 dev eth0 label eth0:0

#02. 查看lvs规则
[root@lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port Forward Weight ActiveConn InActConn

#03. 清空规则,要备份
ipvsadm -C     #clear清除 #iptables -F flush

#04. 设置 tcp超时时间
ipvsadm --set 30 5 60   #设置tcp 超时时间

#05. 添加规则
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn

#添加规则 ngx upstream
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20  

#-A --add-service 创建池塘  
#-t --tcp-service tcp协议
#10.0.0.3:80 组名称
#-s scheduler 轮询算法   wrr weight 加权轮询   rr lc wlc
#-p persistent 会话保持时间  

#添加规则 向upsteam中添加server  
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

ipvsadm -ln
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1

#-a 添加 rs服务器  
#-t tcp协议
#-r 指定rs服务器ip
#-g --gatewaying dr模式 默认的
#-w 权重
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20 
-> 10.0.0.7:80                 Route   1      0   0        
-> 10.0.0.8:80                 Route   1      0   0        
[root@lb01 ~]# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port
TCP  10.0.0.3:80                         0        0     0        0        0
-> 10.0.0.7:80                          0        0      0        0        0
-> 10.0.0.8:80                         0        0       0        0        0

upstream web_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
location / {
proxy_pass http://web_pools;
}
}
  • 加载lvs内核模块
[root@lb01 ~]# lsmod |grep ip_vs
[root@lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lb01 ~]# lsmod |grep ip_vs
ip_vs                 145497  0
nf_conntrack          133095  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack
  • lb负载均衡 规则的备份与恢复
#ipvsadm 规则的备份与恢复
[root@lb01 ~]# ipvsadm-save -n >/root/ipvs.txt
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port  Forward WeightActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80                 Route   1      0  0        
-> 10.0.0.8:80                 Route   1      0  0        
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lb01 ~]# ipvsadm-restore <root/ipvs.txt
[root@lb01 ~]# ipvsadm -ln
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
  -> 10.0.0.7:80                 Route   1      0  0        
  -> 10.0.0.8:80                 Route   1      0  0

2) web服务器 RS服务端配置

#lo网卡绑定 vip
#ip addr add 10.0.0.3/32 dev lo label lo:1
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.3
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
[root@web01 ~]# systemctl restart network
[root@web02 ~]# ip a s lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc
noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet 10.0.0.3/32 brd 10.0.0.3 scope global lo:1
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
#抑制arp解析
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p

3) 小结

  • lvs服务器: 配置
  • 后端rs服务: 配置:lo vip ;抑制arp解析

4) 调试

  • 不要在lvs本地进行测试

  • lvs应对高并发负载均衡,访问量比较少的时候,不会像nginx 1:1

  • 抓包wireshark

  • 测试 准备 wireshark 抓包

  • curl 10.0.0.[7-8]

  • 浏览器10.0.0.3/index.html

  • 不要在 lvs本地进行测试 curl

  • lvs 高并发 大访问量使用的 nginx 接近于1:1

5.3 抓包查看lvs dr

image-20240526163455393

image-20240526163507099

5.4 lvs规则 备份与恢复

  • 后面我们通过keepalived管理lvs
  • ipvsadm-save -n
  • ipvsadm-restore <
[root@lb01 ~]# ipvsadm-save -n
-A -t 10.0.0.3:80 -s wrr -p 20
-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
-A -t 10.0.0.4:80 -s wrr -p 20
-a -t 10.0.0.4:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.4:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.conf
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port   Forward Weight ActiveConn InActConn
[root@lb01 ~]# ipvsadm-restore < /root/ipvsadm.conf
[root@lb01 ~]# ipvsadm-restore < /root/ipvsadm.conf
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port  Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr persistent 20
  -> 10.0.0.7:80                 Route   1      0  0        
  -> 10.0.0.8:80                 Route   1      0  0        
TCP  10.0.0.4:80 wrr persistent 20
  -> 10.0.0.7:80                 Route   1      0  0        
  -> 10.0.0.8:80                 Route   1      0  0

6. lvs 负载均衡排错流程

image-20240526163853420

故障:

  1. 不通过浏览器访问 命令行进行访问 测试 10.0.0.3
  2. ping/telnet
  3. 直接访问后端rs服务器进行测试
  4. 某一台web服务器配置是否正常

7. lvs 与keepalived配合

  • keepalived for lvs

  • 配置文件分为几个部分?

#GLOBAL CONFIGURATION 全局配置部分
route_id 每个keepalived软件 独一无二 id

#VRRPD CONFIGURATION     配置vip vrrp实例部分

#LVS CONFIGURATION   配置管理lvs
#GLOBAL CONFIGURATION   全局定义部分
global_defs {
      router_id lb01      #keepalived身份 id 每个keepalived 不同
}
#VRRPD CONFIGURATION vrrp实例部分   虚拟路由冗余协议vrrp
vrrp_instance oldboy {    #实例名称   在同1对主备之间 要一致
 state MASTER          #MASTER BACKUP
 interface eth0        #指定网卡 公网网卡
 virtual_router_id 62  #虚拟路由id 同1对 主备之间要一致 在同1个keepalived文件中要不同
 priority 100          #优先级 主>备 相差50
 advert_int 1          #interval 间隔 心跳间隔 秒 每隔1秒检查
 authentication {      #认证 方式
   auth_type PASS    #简单认证
   auth_pass 1234    #在同1对 主备之间一直 
   }
 virtual_ipaddress {   #vip  
  10.0.0.3/24 dev eth0 label eth0:0   #ip addr add 10.0.0.3/24 dev eth0 label eth0:0
  }
}

#ip addr add
#LVS CONFIGURATION 管理lvs
##ipvsadm 通过命令
##keepalived 通过 配置文件控制lvs
#               vip     端口
#ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#相当于ngx的upstream
virtual_server 10.0.0.3 80 {  #创建组 池塘  
##ipvsadm -A -t 10.0.0.3:80 -s wrr -p 50
     delay_loop 6         
     lb_algo wrr              #轮询算法   lc least conn 最小连接数   或者 lvs_sched
                              #         wlc
                              #weighted round robin
     lb_kind DR               # lvs DR模式       lvs_method
     nat_mask 255.255.255.0   #vip对应的子网掩码
     persistence_timeout 20   #会话保持时间   -p  
     protocol TCP             #协议 -t      
     
     #ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
     #指定rs服务器
     real_server 10.0.0.7 80 {  #rs服务器的配置
     weight 1               #权重
     TCP_CHECK {            #-t TCP_CHECK 检查 传输层 tcp/udp 端口
                            #三次握手 建立连接 与你的端口建立连接
                            #四次挥手
                            # 或者 指定url进行http检查 HTTP_GET
     connect_timeout 8      
     nb_get_retry 3         #number of get retry重试的次数  
     delay_before_retry 3   #每次检查之前 等待3秒
     connect_port 80        #检查端口
     }
   }  
#                        HTTP_GET   {
#                             url {
#                               #path指定uri
# #                             path /nginx_status
#                               status_code 200
#                             }
#   connect_timeout 8
# nb_get_retry 3
# delay_before_retry 3
                               
#   }
   
#nginx负载均衡
#upstream web_pools {
#server 10.0.0.7:80 wegiht=1 max_fails=3fail_timeout=30s ;
#}
real_server 10.0.0.8 80 {
         weight 1
         TCP_CHECK {
         connect_timeout 8
         nb_get_retry 3
         delay_before_retry 3
         connect_port 80
         }
      }
  }
 TCP  10.0.0.3:80 wrr persistent 20 
    -> 10.0.0.7:80                 Route   1      0  0        
    -> 10.0.0.8:80                 Route   1      0  0  

virtual_server 10.0.0.3 80 {  #创建组 池塘
     delay_loop 6
     lb_algo wrr              #轮询算法   lc leastconn 最小连接数  
                              #         wlc
                              #weighted round robin
     lb_kind DR               # lvs DR模式
     nat_mask 255.255.255.0   #vip对应的子网掩码
     persistence_timeout 50   #会话保持时间   -p
     protocol TCP             #协议 -t
                              #ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80   -g-w 1  
real_server 10.0.0.7 80 {   #添加rs服务器
       weight 1
       TCP_CHECK {                 #健康检查 检查端口
       connect_timeout 8
       nb_get_retry 3
       delay_before_retry 3
       connect_port 80
       }
     }

  #ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1  
       real_server 10.0.0.8 80 {   #添加rs服务器
       weight 1
       TCP_CHECK {                 #健康检查 检查端口
       connect_timeout 8
       nb_get_retry 3
       delay_before_retry 3
       connect_port 80
       }
     }
   }

virtual_server 10.0.0.3 80 {
   delay_loop 6
   lb_algo wrr
   lb_kind DR
   nat_mask 255.255.255.0
   persistence_timeout 50
   protocol TCP
   real_server 10.0.0.7 80 {
     weight 1
     TCP_CHECK {
       connect_timeout 8
       nb_get_retry 3
       delay_before_retry 3
       connect_port 80
       }
     }
   real_server 10.0.0.8 80 {
      weight 1
      TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
      }
    }
  • 搭建与检测
  • 关闭keepalived 是否切换 ok

image-20240526164414075

image-20240526164425072

  • 关闭某一个web服务器:nginx

8. lvs

  • lvs-arp ip(3层) -->mac(2层) 工作在哪层? 3层协议工作在2层.
  • lvs 常见模式 dr nat tun(隧道) full nat
  • lvs+keepalived

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

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

相关文章

电脑清理软件用哪个好?这款工具有些饱受争议

电脑清理软件用哪个好?电脑作为我们工作和娱乐的重要工具&#xff0c;其运行速度和安全性直接影响着我们的生活质量。然而&#xff0c;随着时间的推移&#xff0c;电脑系统会积累大量垃圾文件、注册表错误、恶意软件等&#xff0c;导致电脑运行缓慢甚至崩溃。 这时&#xff0c…

el-tree 获取当前勾选节点的选中状态以及选中值对象 触发check-change多次事件问题原因

1.需求 现在需要一个树状结构的资产树 但是现在需求是 获取当前选中的值的状态是选中还是取消选中 然后再用当前选中 or 取消选中的值 进行 选中 or 取消选中的操作 一开始使用的是 check-change 方法 接收参数如图 但是我勾选父节点 或者 子节点后 他会打印一堆数据 是因…

基于Java+SpringMvc+Vue技术的智慧校园系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别

1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…

geospy.AI 根据图片定位地理位置

文章目录 简介场景标志性建筑平凡的商店名标志性的物品标志性的地理位置标志性的街道难以分辨的古建筑不出名的山水 简介 GeoSpy.ai 作为一个地理空间情报平台&#xff0c;可以在以下场景中使用&#xff1a; 农业&#xff1a;监控农作物生长情况&#xff0c;预测产量&#xf…

课设:二手车交易管理系统(Java+MySQL)

简易数据库课程设计~分享 技术栈 本项目使用以下技术栈构建&#xff1a; Java: 作为主要编程语言&#xff0c;负责业务逻辑的实现。MySQL: 用于数据存储&#xff0c;管理用户、车辆和订单信息。JDBC: 用于Java与MySQL数据库之间的连接和操作。Swing GUI: 提供用户图形界面&am…

数据库课设---酒店管理系统(MySQL、VBNet)

目录 一. 知识技术 二. 需求分析 2.1 功能需求 2.2 数据需求 三. 数据流图与数据字典 3.1 数据流图 3.1.1 业务流图 3.1.2 数据流图 3.1.3 关系图 3.2 数据字典 四. 数据库设计 4.1 概念模型设计 4.2 逻辑模型设计 4.3 数据库实现 …

【LSB图像低位隐写】字符串隐写

按照自己的理解写了一个简单的字符串隐藏在图像中的python代码 前言 脱胎于内容安全的大作业~ 目前第一阶段&#xff0c;只完成了字符串隐藏在图像中 步过图像隐藏在图像应该异曲同工&#xff0c;之后实现~ 一、代码 图像的output路径和input路径写死了&#xff0c;这个需要…

【SpringBoot】IDEA查看spring bean的依赖关系

前因&#xff1a;研究springcloud config组件时&#xff0c;我发现config-server包下的EnvironmentController不在扫描的包路径下却可以响应客户端的请求&#xff0c;这引起了我的注意&#xff0c;我的问题是&#xff1a;EnvironmentController是怎么被添加进bean工厂的。本章就…

联系表单提交Contact Form自动发送邮件源码

联系表单Contact Form提交后自动发送邮件源码构建指南&#xff1f; 无论是商业网站、博客还是个人主页&#xff0c;几乎每个网站都会有一个联系表单&#xff0c;用于收集用户的反馈、询问或建议。AokSend将探讨联系表单在网站中的重要性&#xff0c;以及如何通过源码实现自动发…

新加坡工作和生活指北:工作篇

文章首发于公众号&#xff1a;Keegan小钢 一年多以前&#xff08;2022 年 8 月初&#xff09;&#xff0c;那时我过来新加坡才 4 个多月&#xff0c;就写了篇文章分享了当时在新加坡的生活和工作体验。文章得到的反响不错&#xff0c;但也反馈出了一些新的问题&#xff0c;比如…

【数据结构】栈的实现(含详细代码)

文章目录 1.栈1.1 栈的概念及结构1.2 栈的实现1.3 代码实现 1.栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后…

如何监控和优化 PostgreSQL 中的连接池使用?

文章目录 一、连接池的基本概念二、监控 PostgreSQL 连接池使用的重要性&#xff08;一&#xff09;性能优化&#xff08;二&#xff09;资源管理&#xff08;三&#xff09;故障排查 三、PostgreSQL 连接池监控指标&#xff08;一&#xff09;活跃连接数&#xff08;二&#x…

下一代 CSS 框架:Mojo CSS

前言 Tailwind CSS 推出即受到广大开发者的欢迎&#xff0c;当前 Github star 数已达 77.8k。它是一个功能类优先&#xff08;utility-first&#xff09;的 CSS 框架&#xff0c;它提供了一系列功能类&#xff0c;让开发者可以在 HTML 中通过组合这些功能类&#xff08;原子类…

阶段三:项目开发---大数据开发运行环境搭建:任务3:安装配置Hadoop集群

任务描述 知识点&#xff1a;安装配置Hadoop 重 点&#xff1a; 安装配置Hadoop 难 点&#xff1a;无 内 容&#xff1a; Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威…

Flink 提交作业的方式

参考&#xff1a; Flink运行方式及对比-腾讯云开发者社区-腾讯云

前端程序员如何转大模型?收藏这一篇就够了(非常详细)

最近各行各业都不容易啊&#xff0c;那个中金女员工跳楼事件频繁上热点&#xff0c;引起广泛的关注&#xff0c;本质上还是经济下行&#xff0c;我们互联网行业也是如此&#xff0c;特别是程序员&#xff0c;本来就有35岁危机&#xff0c;加上行业不景气&#xff0c;大厂都在裁…

C语言中的数组:掌握数据的有序集合【一维数组,二维数组,字符串数组,直方图打印,计算全排列,字符数组常用函数】

目录 C语言中的数组&#xff1a;掌握数据的有序集合【一维数组&#xff0c;二维数组&#xff0c;字符串数组】一维数组一维数组的创建数组的七种初始化完全初始化&#xff1a;部分初始化&#xff1a;字符数组的初始化&#xff1a;自动初始化为0&#xff1a;使用memset函数初始化…

C语言求10进制转2进制(除2取余法)

1.思路&#xff1a;除2取余法&#xff0c;也就是说用除以2取余来将10进制数转换为二进制 2.两种代码实现&#xff0c;这里用了两&#xff0c;一个递归一个非递归。 递归是一种编程技术&#xff0c;其中一个函数直接或间接地调用自己。递归通常用于解决那些可以被分解为更小的、…

QCC5181 歌词歌曲名多国语言显示替代QCC5125 CSR8675

QCC518X作为Qualcomm新一代蓝牙技术芯片&#xff0c;支持最新蓝牙协议V5.4&#xff0c;较QCC512X系列&#xff0c;它有更强大的DSP、CPU。除支持USB、I2S、SPDIF等接口外&#xff0c;还扩展了LE Audio功能&#xff0c;扩展支持AptX Lossless。以5181为例&#xff0c;我们还扩展…