深入理解与应用Keepalive机制

目录

引言

一、VRRP协议

(一)VRRP概述

1.诞生背景

2.基本理论

(二)VRRP工作原理

(三)VRRP相关术语

二、keepalive基本理论

(一)基本性能

(二)实现原理

(三)抢占模式

三、keepalive服务

(一)安装keepalive

(二)全局配置

(三)VRRP实例

(四)服务器配置

四、实际操作

(一)web服务器

(二)LVS集群服务器

五、keepalive管理

(一)主从更替

(二)单播组播

1.指定组播地址

2.设置单播

(三)日志功能

六、keepalive实现高可用

(一)基本理论

(二)实现nginx高可用


引言

基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的Keepalive机制是为了解决网络中静态默认网关单点故障的问题。在传统的网络架构中,如果作为默认网关的路由器出现故障,会导致整个子网失去对外通信的能力。而VRRP则通过引入主备模式来提供高可用性。

一、VRRP协议

(一)VRRP概述

1.诞生背景

终端设备访问不同网段设备的时候,必须经过网关。如果只有1个网关,那么网络就存在 单点故障,所以为了避免单点故障导致网络的通信中断, 所以,我们建议在一个网段中,可以同时添加多个网关,从而增加网关的冗余性和网络的可靠性; 但是,多网关的部署会带来其他的问题:
1.网关IP地址冲突
2.终端用户需要频繁的切换网关IP地址 
针对上述两个问题,提出了:
在同网段的多个网关之间运行VRRP,形成1个虚拟网关,终端用户都配置和使用虚拟网关就可以了。

其作用为

在同一个网段的多个真实网关之间配置和运用,形成层一个虚拟路由器, 从而实现网关的冗余和负载均衡

2.基本理论

VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种网络层的容错协议。它的主要目的是在多个物理路由器之间提供一个虚拟路由器服务,以实现默认网关的高可用性。在传统的网络环境中,如果静态配置的默认网关出现故障,则会导致网络中的所有主机失去对外通信的能力。VRRP通过将多台路由器联合起来形成一个虚拟路由器,并选举出一台主路由器来处理所有的流量转发,而其他的备份路由器则随时待命,一旦主路由器出现故障,备份路由器能够迅速接替工作,从而确保网络连通性的持续性和可靠性。

(二)VRRP工作原理

(1) 虚拟路由器中的路由器根据优先级(priority)选举出Master。Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务;

(2) Master路由器周期性发送VRRP报文(心跳线),以公布其配置信息(优先级等)和工作状况;

(3) 如果Master路由器出现故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master;

(4) 虚拟路由器状态切换时,Master路由器由一台设备切换为另外一台设备,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和虚拟IP地址信息的免费ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息。网络中的主机感知不到Master路由器已经切换为另外一台设备。

(5) Backup路由器的优先级高于Master路由器时,由Backup路由器的工作方式(抢占方式和非抢占方式以及延时抢占)决定是否重新选举Master。

(三)VRRP相关术语

虚拟路由器:Virtual Router 不是真实存在 ,虚构出来的

虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器

VIP:Virtual IP 192.168.91.100 路由1 路由2

VMAC:Virutal MAC (00-00-5e-00-01-VRID)

物理路由器:

master:主设备

backup:备用设备

priority:优先级

二、keepalive基本理论

Keepalive机制是网络通信中一种重要的保持连接健康状态的方法,有助于优化网络资源使用,提高服务稳定性和响应速度

常见的keepalive版本

VRRP Keepalive:虚拟路由冗余协议(VRRP)中的心跳检测机制,用于选举和维护路由器的主备状态,确保网络高可用性。

TCP Keepalive:是一种内置于TCP协议中的功能,用于检测并维持连接的活跃状态。当两个端点间存在一个已建立的TCP连接,但在一段时间内没有数据传输时,启用Keepalive的一方会周期性地发送特殊的探测报文(通常是一个空TCP段)给对方。如果接收方没有回应足够数量的Keepalive探测报文,发送方就会认为连接已经断开,并关闭该连接。

HTTP Keepalive:允许HTTP客户端与服务器之间复用同一TCP连接来发送多个请求和响应,以减少TCP连接建立和销毁带来的开销。

应用程序级Keepalive:许多应用程序和服务也有自己的Keepalive机制,比如MySQL数据库的连接保活、WebSocket的ping/pong消息等。

主要学习VRRP Keepalive

(一)基本性能

keepalive是专门为LVS与HA设计的一款健康检查软件

支持故障自动切换(Failover)

支持节点健康状态检查(Health Checking)判断 LVS 负载调度器、节点服务器的可用性,当 master 主机出现故障及时切换到backup 节点保证业务正常,当 master故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。

官方网站:Keepalived for Linux

(二)实现原理

实现原理与虚拟路由一致

1.首先根据优先级选出Master提供服务

2.Master默认每间隔1秒向Baskup发送一次VRRP报文,告知Baskup自己处于工作状态,并公布配置信息(优先级等)情况

3. 如果Master路由器出现故障,Backup将根据优先级重新选举为新的Master

4.当原Master恢复工作时,将根据抢占模式(抢占方式和非抢占方式以及延时抢占)决定是否重新成为Master

(三)抢占模式

1.抢占式
主服务器宕机,过了一段时间修好了,直接把主权抢过来

2.非抢占式
主服务器宕机,过了一段时间修好了,原来的主就作为备了

3延迟抢占
主修好后,等待一定的时间后再次成为主

三、keepalive服务

keepalive服务可以使用yum安装、以及编译安装

本地yum源自带的版本比较旧

编译安装可以从官网下载较新的安装包进行安装

(一)安装keepalive

使用yum安装:yum  install keepalived.x86_64 -y

默认的主配置文件有157行

(二)全局配置

首先看第一部分3-17行,为全局配置

global_defs
#全局配置

notification_email
#定义当VRRP实例状态发生变化时,系统将通过电子邮件发送通知给指定的收件人列表。

acassen@firewall.loc, failover@firewall.loc, sysadmin@firewall.loc
#邮件通知的接收者。

notification_email_from Alexandre.Cassen@firewall.loc
#设置发送邮件通知时显示的发件人地址,这里是 Alexandre.Cassen@firewall.loc。

smtp_server  192.168.200.1
#指定SMTP服务器地址,本例中为 192.168.200.1,该服务器用于发送邮件通知。

smtp_connect_timeout  30
#设置SMTP服务器连接超时时间,单位为秒,这里为30秒。

router_id LVS_DEVEL
#为当前运行的Keepalived实例设置一个唯一的标识符,用在日志和其他网络通信中

vrrp_skip_check_adv_addr
#跳过对通告地址(advertised address)的检查。如果启用此选项,在某些情况下
#可以避免错误,比如通告地址未在任何接口上配置。

vrrp_strict
#启用严格模式,要求配置必须符合RFC文档的标准规范,否则Keepalived服务可能不会启动。
#建议关闭

vrrp_garp_interval 0
#设置发送GARP(即无请求的ARP响应)消息的时间间隔,默认值通常为1秒。设为0表示禁用GARP功能。

vrrp_gna_interval 0
#设置发送GNA(即IPv6下的无请求邻居通告)消息的时间间隔。设为0表示禁用GNA功能

(三)VRRP实例

第二部分:VRRP实例配置(19-34)

vrrp_instance VI_1
'定义VRRP实例名称。'

state MASTER
'设置当前节点在VRRP组中的初始状态为MASTER。这意味着该节点将优先处理请求,
并拥有VIP(虚拟IP地址)的所有权'

'interface eth0'
'指定VRRP通告报文通过哪个网络接口发送,这里使用的是eth0接口。'

virtual_router_id 51
'每个VRRP实例需要一个唯一的标识符,这里用数字51表示。主备需要在同一个标识符内'

priority 100
'设置本节点在VRRP组中的优先级,数值越高代表优先级越高,优先级最高的节点将成为MASTER'

advert_int 1
'设置VRRP通告消息的时间间隔,单位为秒。此处设置为每秒发送一次心跳消息以确认其是否在线'

authentication:
auth_type PASS  '设置认证类型为密码认证。'
auth_pass 1111  '设置用于身份验证的共享密码。'

virtual_ipaddress
'列出此VRRP实例要管理的一系列虚拟IP地址'

(四)服务器配置

第三部分为服务器配置(36-60)

'虚拟服务器'
virtual_server 192.168.200.100 443
#定义了一个虚拟服务器,对外提供服务的地址为192.168.200.100,监听端口为443(即HTTPS服务)。

delay_loop 6
#健康检查间隔,每隔6秒对后端服务器执行一次健康检查。

lb_algo rr
#负载均衡算法采用轮询(Round Robin)策略。

lb_kind NAT
#负载均衡方式采用NAT,客户端与真实服务器之间的通信通过NAT进行转发。

#persistence_timeout 50
#会话保持超时时间,同一个客户端在50秒内发起的新请求都会被转发到同一台后端服务器上。

protocol TCP
#明确指出虚拟服务器处理的是TCP流量。

'真实服务器配置'

real_server 192.168.201.100 443
#定义一个真实服务器,其IP地址为192.168.201.100,同样监听443端口

weight 1
#权重值为1,表示该服务器在负载均衡中分配请求的相对权重。

SSL_GET
#使用SSL协议发送GET请求来进行健康检查。

url
#定义了两个需要检查的URL路径及其预期的HTTP响应摘要。一般不适用url,需要更改

connect_timeout 3    #设置连接到真实服务器的超时时间为3秒。
nb_get_retry 3       #如果首次请求未能得到正确的摘要,将重试3次。
delay_before_retry   #每次重试前等待3秒。

四、实际操作

LVS + Keepalived 高可用群集

环境设备

LVS1192.168.83.30 (MASTER)
LVS2192.168.83.40 (BACKUP)
web1192.168.83.50
web2192.168.83.60
客户端192.168.83.100
VIP192.168.83.200

(一)web服务器

首先配置web服务

1.下载安装web服务

yum install  httpd  -y

2.建立虚拟IP

3.调整内核参数

net.ipv4.conf.all.arp_ignore 和 net.ipv4.conf.default.arp_ignore
'设置为1表示节点将更严格地处理ARP请求。在某些情况下,系统不会响应非本地IP地址的ARP请求
这有助于防止IP地址冲突,并且可以用于LVS DR模式下的Director节点,以避免对外直接响应ARP请求'
 
net.ipv4.conf.all.arp_announce 和 net.ipv4.conf.default.arp_announce
'设置为2表示节点在发送ARP应答时总是使用其主接口上的最具体的地址(即,优先级最高的源IP地址)
这同样对LVS DR模式很有用,确保Director节点在回应ARP请求时只使用VIP,而不是实际的物理接
口地址。'

调整完毕后开启web服务:systemctl  start  network

在站点目录下构建数据文件

两台web服务器同样操作

(二)LVS集群服务器

1.下载服务

yum  install keepalived.x86_64 -y   && yum  install ipvsadm.x86_64 -y

先启动ipvsadm服务

ipvsadm-save >/etc/sysconfig/ipvsadm  #生成配置信息文件
systemctl start ipvsadm.service              #启动服务

2.配置文件

在配置文件之前,最好先进行备份

cp  /etc/keepalived/keepalived.conf   /etc/keepalived/keepalived.conf.bak

删除60行以下的内容

配置全局设置

配置VRRP热备实例

 vrrp_instance VI_1 {
'定义实例名称,默认即可,也可以自定义'
   state MASTER
'设置为MASTER表示为主'
    interface ens33
'指定心跳报文从ens33网卡发送'
    virtual_router_id 51
'实例表示符,默认即可,BACKUP与其一致'
    priority 100
'设置优先级,其值需要比BACKUP高'
    advert_int 1
'每间隔一秒发送一次VRRP报文'
     authentication {
        auth_type PASS
        auth_pass 123123
'定义密码认证方式,并设置密码,BACKUP需要与其一致'
   }   
   virtual_ipaddress {
         192.168.83.200
'设置集群VIP地址'
     }   
}

配置虚拟路由

 virtual_server 192.168.83.200 80 {
  #定义对外提供服务的IP地址,提供服务为80端口,即http服务
     delay_loop 6
     #每6秒对后端服务器进行健康检查
      lb_algo rr 
     #设置调度算法为rr(轮询)
     lb_kind DR
     #负载均衡方式采用DR
     persistence_timeout 0
     #长连接时间为0秒,为体现操作真实性,真实环境建议调高,默认为50秒
    protocol TCP
    #虚拟服务器监听TCP协议的流量
    real_server 192.168.83.50 80 {
    #定义真实服务器,其IP地址为192.168.83.50,监听80端口
        weight 1
      #轮询权重为1
         TCP_CHECK {
        #使用TCP_CHECK模块进行真实服务器的健康状态检测
       connect_port 80
      #通过TCP协议连接到真实服务器的80端口以确认其是否可用
      connect_timeout 3
      #访问超时时间,超过3秒认为该服务器宕机
       nb_get_retry 3
      #重复访问3次
       delay_before_retry 3
       #每次访问间隔3秒
          }   
    }   
     real_server 192.168.83.60 80 {
        weight 1
            TCP_CHECK {
             connect_port 80
              connect_timeout 3
              nb_get_retry 3
             delay_before_retry 3
#原理同上
       }
      }
 }

配置完毕后启动服务:systemctl start  keepalived.service

查看规则情况

另一台服务器与其基本一致

需要修改12,19,22行信息,其余配置与主服务一致

配置完毕后启动服务

ipvsadm-save >/etc/sysconfig/ipvsadm
systemctl start  ipvsadm.service
systemctl start  keepalived.service

使用客户端访问进行测试

五、keepalive管理

(一)主从更替

当MASTER关闭后,优先级最高BACKUP会立马变成MASTER继续工作

当主恢复后,立马会变为MASTER,即为抢占模式(默认)

可以通过添加nopreempt参数,设置为非抢占模式

在虚拟服务器段配置

也可以设置延迟抢占,同样在虚拟服务器段配置

(二)单播组播

在Keepalived中,VRRP实例通常通过组播方式来发送心跳和通告消息以实现高可用性和故障切换

组播地址范围为224.0.0.0-239.255.255.255

默认的组播地址为224.0.0.18。如果有多组keepalive服务器,所有的默认心跳线发送路径都为该地址,容易造成混乱,所以需要修改

通过添加vrrp_mcast_group4来指定特定的组播地址,或者改为单播

注意:如果指定组播地址,所有的服务器都要改

1.指定组播地址

当前192.168.83.30为主。可以通过tcpdump抓包来进行查看

可以看到,MASTER发的VRRP包是发往指定的组播地址224.83.83.83

2.设置单播

'MASTER服务器'

unicast_src_ip 192.168.83.30
#该指令指定当前节点作为VRRP通告和心跳消息的发送源地址。
#这意味着所有从这个节点发出的VRRP报文都将使用 192.168.83.30 这个IP地址作为源地址

unicast_peer { 
192.168.83.40 
}
#这部分定义了单播对等体列表,即指定接收VRRP通告和心跳消息的目标地址。
#在这里,仅指定了一个对等体地址 192.168.83.40,表示此节点将直接向 192.168.83.40 
#发送VRRP通信信息,而不是通过组播方式广播到整个网络。

'BACKUP服务器'
#同上

同样抓包查看验证一下

(三)日志功能

因为keepalive服务较为重要,其日志没有独立的文件存在,默认存放在/var/log/messages文件中

为便于分析,需要将它的日志位置,单独存放

在/etc/sysconfig/keepalived文件中第14行有一段信息为:KEEPALIVED_OPTIONS="-D"

这是一个环境变量或启动参数的设置,用于指定Keepalived服务在启动时使用的额外选项。

-D:表示Keepalived以守护进程(daemon)模式运行。这意味着Keepalived会在后台运行,并且         脱离终端控制台

添加-S选项设置日志

-S :代表设置syslog日志设备,它通常与一个数字参数(0-7)结合使用,用于指定syslog记录的         日志设施级别

修改日志管理配置文件/etc/rsyslog.conf

修改完毕后重启日志管理服务与keepalive服务

六、keepalive实现高可用

keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能

(一)基本理论

VRRP Script是Keepalived的一个强大特性,其配置等级global_defs一致,与它允许用户自定义检测脚本,当Keepalived运行时会周期性地执行这些脚本。如果脚本返回成功(通常为0),则认为被监控的服务处于正常状态;如果脚本返回失败(非0值),则Keepalived将根据配置更改VRRP实例的状态,可能导致主备节点的角色切换,从而确保服务的高可用性。

VRRP Script技术实现,需要先定义脚本,而后调用脚本

'定义脚本'
vrrp_script <SCRIPT_NAME> { 			#定义一个检测脚本,在global_defs 之外配置
     script <STRING>|<QUOTED-STRING> 	#shell命令或脚本路径(注意执行权限)
     interval <INTEGER> 				#间隔时间,单位为秒,默认1秒
     timeout <INTEGER> 					#超时时间
     weight  <INTEGER:-254..254> 			
#默认为0,如果设置此值为负数,当上面脚本返回值为非0时,会将此值与本节点权重相加可以降低
#本节点权重,即表示fall. 如果是正数,当脚本返回值为0,会将此值与本节点权重相加可以提高本
#节点权重,即表示 rise.通常使用负值
     fall <INTEGER>       	#执行脚本连续几次都失败,则转换为失败,建议设为2以上
     rise <INTEGER>       	#执行脚本连续几次都成功,把服务器从失败标记为成功
}

'调用脚本'
track_script {
 SCRIPT_NAME_1
 SCRIPT_NAME_2
}


(二)实现nginx高可用

1.下载安装nginx服务

yum  install epel-release.noarch -y  #下载epel源

yum  install  nginx  -y                    #下载nginx

systemctl  stop  ipvsadm.service  #关闭ipvsamd服务

定义一个简单的脚本

脚本表示使用killall -0,这是Linux命令行中用于检查指定进程名是否存在且至少有一个实例在运行的命令。这里的参数 -0 具有特殊含义,它不会发送任何信号给进程,而是仅仅测试这些进程是否存在

修改nginx配置文件,添加反向代理及负载均衡

修改keepalive配置文件,只保留全局配置与实例配置,删除虚拟服务器与真实服务器配置

在全局配置语句块外添加vrrp_script服务

vrrp_script keep
#定义名为 "keep" 的VRRP检查脚本。

script "/data/keep.sh"
#指定要执行的shell脚本路径为 /data/keep.sh。这个脚本应该返回0表示成功,非零值表示失败。

interval 1
#设置每隔1秒执行一次该脚本以检查服务状态。

timeout 30
#如果脚本在30秒内没有响应(即超时),则认为它执行失败。

weight -50
#当脚本执行成功时,VRRP实例的优先级权重减50。

fall 3
#当连续3次检查失败后,将触发VRRP实例状态变更,可能导致主备切换。

rise 3
#当连续3次检查成功后,恢复VRRP实例到正常状态。

配置完毕后重启keepalive服与nginx服务

systemctl restart  keepalived.service

systemctl start  nginx

另一台keepalive配置与其一致

配置完毕后重启服务,使用客户端访问

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

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

相关文章

异地组网需要几个固定IP?

异地组网指的是在不同地区的终端设备之间建立起稳定的网络连接&#xff0c;以实现信息的远程传输和通信。在进行异地组网时&#xff0c;需要固定IP地址来确保网络连接的稳定性和可靠性。本文将介绍异地组网的基本概念和必要性&#xff0c;并探讨在这一过程中需要使用的固定IP的…

16-Java命令模式 ( Command Pattern )

Java命令模式 摘要实现范例 命令模式&#xff08;Command Pattern&#xff09;中请求以命令的形式包裹在对象中&#xff0c;并传给调用对象 调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执行命令 命令模式是行为型模式&…

接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头

我要成为嵌入式高手之3月6日Linux高编第十六天&#xff01;&#xff01; ———————————————————————————— 学习笔记 接收端 recvfrom #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, si…

java SSM流浪宠物救助与领养myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM流浪宠物救助与领养管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系…

Python 过滤函数filter()详解

一、过滤函数定义 它用于对容器中的元素进行过滤处理。 二、 过滤函数语法 filter(function,iterable) 参数function&#xff1a;提供过滤条件的函数&#xff0c;返回布尔型 参数iterable: 容器类型数据 三、过滤函数的应用场景 1、筛选符合条件的元素 需求&#xff1a;在列表…

【MySQL】not in遇上null的坑

今天遇到一个问题&#xff1a; 1、当 in 内的字段包含 null 的时候&#xff0c;正常过滤&#xff1b; 2、当 not in 内的字段包含 null 的时候&#xff0c;不能正常过滤&#xff0c;即使满足条件&#xff0c;最终结果也为 空。 测试如下&#xff1a; select * from emp e;当…

根据标签出现的频次渲染不同大小的圆和文字,圆随机摆放且相互之间不重叠

效果图&#xff1a; 按每个标签出现的频次大小渲染出不同比例大小的圆&#xff0c;渲染的圆的宽度区间为 [40, 160] &#xff0c;其中的文字的大小区间为 [12, 30] &#xff0c;圆的位置随机摆放且不重叠。 根据已知条件可得出&#xff0c;标签中频次最高的对应圆的宽度(直径…

【网络】:再谈传输层(UDP)

传输层 一.再谈端口号二.UDP 一.再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序。 在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看); 1.端口号划分 0 - 1023:…

第5章 HSA内存模型

5.1 引言 在共享内存环境中&#xff0c;独立的控制线程可以竞相修改单个位置。为程序以可预测的方式运行&#xff0c;程序员必须用同步来控制这些竞争。 “内存一致性模型”或“内存模型”定义了并行代理之间通信的基本规则。当这些规则含糊不清地定义或者更糟的是完全不存在…

简站wordpress主题看上去差不多 实际大不一样

有人说简站wordpress主题&#xff0c;都差不多嘛。我表示无语。表面看上去是差不多的&#xff0c;实际的细节是不一样的。 下面以编号&#xff1a;JZP4431和编号&#xff1a;JZP4878这两个主题为例子来讲一下&#xff0c;简站wordpress主题&#xff0c;在细节方面的不一样之处…

Tensorflow实现手写数字识别

模型架构 具有10个神经元&#xff0c;对应10个类别&#xff08;0-9的数字&#xff09;。使用softmax激活函数&#xff0c;对多分类问题进行概率归一化。输出层 (Dense):具有64个神经元。激活函数为ReLU。全连接层 (Dense):将二维数据展平成一维&#xff0c;为全连接层做准备。展…

智能部署之巅:Amazon SageMaker 引领机器学习革新

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 &#xff08;全球 TMT 2023年12月6日讯&#xff09;亚马逊云科技在 2023 re:Invent 全…

vue element plus Upload 上传

通过点击或者拖拽上传文件。 基础用法# 通过 slot 你可以传入自定义的上传按钮类型和文字提示。 可通过设置 limit 和 on-exceed 来限制上传文件的个数和定义超出限制时的行为。 可通过设置 before-remove 来阻止文件移除操作。 Click to upload jpg/png files with a size …

python--宣传篇--personal-qrcode个性二维码

文章目录 准备代码效果 准备 代码 from MyQR import myqr import osdef get_img_qrcode(words, save_name, picture, colorizedTrue):if save_name[-3:] in ["jpg", "png", "gif"]:if picture[-3:] in ["png", "jpg", &qu…

我们是如何测试人工智能产品的

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已经成为我们生活中不可或缺的一部分。然而&#xff0c;要构建出可信赖的AI系统并非易事。这需要我们不仅深入理解人工智能的核心原理&#xff0c;还需要将这些理论知识应用到实际场景中。 为了帮助大家系…

CSS3笔记

1.相同优先级的样式以写在后面的为主。 2.交集选择器&#xff0c;并且 条件挨在一起 p.rich{...} /*p元素class有rich的元素*/ 3.并集选择器&#xff0c;或者 逗号隔开 .class1,class2{...}/*满足其中一个类名都会使用该样式*/ 4.后代选择器 空格 隔开 所有符合的包括孙子及…

动态规划:Leetcode 91.解码方法

题目 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&am…

一个系列很多样式的wordpress外贸建站模板

菌菇干货wordpress跨境电商模板 食用菌、羊肚菌、牛肝菌、香菇、干黄花菜、梅干菜、松茸wordpress跨境电商模板。 https://www.jianzhanpress.com/?p3946 餐饮调味wordpress跨境电商模板 豆制品、蛋黄糖、烘焙、咖啡、调料、调味酱、餐饮调味wordpress跨境电商模板。 http…

vue3的基本使用(1)

Vue3的基本使用&#xff08;1&#xff09; 初识vue31. vue3简介2. 性能提升3. 源码升级 Vue3的创建1. vue-cli创建2. vite创建 Composition API的区别&#xff08;组合式&#xff09;setup函数响应式数据1. ref响应式2. reactive响应式 toRefs与toRef简单介绍 初识vue3 1. vue…

零售EDI:劳氏 Lowe‘s EDI项目案例

通过 EDI&#xff0c;企业与Lowes之间可以直接交换各种商业文档&#xff0c;如订单、发票、收据等&#xff0c;从而实现信息的实时交换&#xff0c;提高了供应链的效率和准确性。在现代供应链管理中&#xff0c;EDI 已经成为了不可或缺的重要工具。 作为一家拥有多条业务线的企…