Keepalived介绍、安装和简单使用

目录

  • 1 Keepalived
    • 1.1 keepalived介绍
      • 1、keepalived原理
      • 2、keepalived原理
      • 3、VRRP工作模式
    • 1.2 keepalived安装配置
      • 1、安装配置
      • 2、keepalived配置文件详解
      • 3、通过配置文件实现资源监控
    • 1.3 案例
      • 1、nginx + keepalived 实现高可用
      • 2、nginx + keepalived 实现高可用 - 非抢占模式
  • 总结

1 Keepalived

1.1 keepalived介绍

1、keepalived原理

​ Keepalived是一个基于VRRP协议来实现LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会使用2台服务器运行Keepalived,一台为主服务器MASTER,另一台为备份服务器BACKUP,但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证高可用性。Keepalived是VRRP的完美实现。
说明:VRRP协议,即虚拟路由冗余协议,通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信

2、keepalived原理

keepalived工作在TCP/IP参考模型的第三、四和第五层,也就是网络层、传输层个和应用层
keepalived主要有三个模块,分别是core、check和vrrp。

  • core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
  • check负责健康检查,包括常见的各种检查方式。
  • vrrp模块是来实现VRRP协议的
    组件架构:
    在这里插入图片描述

整个体系结构分层用户层和内核层:

  • Scheduler I/O Multiplexer:I/O复用分发调用器,负责安排Keepalived所有的内部的任务请求
  • Memory Management:内存管理机制
  • Control Plane:控制面板,实现对配置文件的编译和解析,Keepalived的配置文件解析比较特殊,它并不是一次解析所有模块的配置,而是只有在用到某模块时才解析相应的配置
  • Core components:Keepalived的核心组件,包含了一系列功能模块,主要有watch dog、Checkers、VRRP Stack、IPVS wrapper、Netlink Reflector
    • watch dog:一个极为简单又非常有效的检测工具,针对被监视目标设置一个计数器和阈值,watch dog会自己增加此计数值,然后等待被监视目标周期性的重置该数值,一旦被监控目标发生错误,就无法重置该数值,watch dog就会检测到。Keepalived是通过它来监控Checkers和VRRP进程
    • Checkers:实现对服务器运行状态检测和故障隔离
    • VRRP Stack:实现HA集群中失败切换功能,通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群
    • IPVS wrapper:实现IPVS功能,该模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现负载均衡功能
    • Netlink Reflector:实现VIP的设置和切换

3、VRRP工作模式

  • 三种状态
    • Initialize状态:系统启动后进入initialize状态
    • Master状态
    • Backup状态
  • 选举机制
    • 抢占模式下,一旦有优先级高的路由器加入,立即成为Master,默认
    • 非抢占模式下,只要Master不挂掉,优先级高的路由器只能等待

1.2 keepalived安装配置

1、安装配置

yum install -y keepalived
#备份
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

2、keepalived配置文件详解

! Configuration File for keepalived# 全局配置
global_defs {# 接收邮件notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}# 发送的邮箱notification_email_from Alexandre.Cassen@firewall.loc# 邮件服务器smtp_server 192.168.200.1# 邮件服务器超时时间smtp_connect_timeout 30# 路由id,唯一的router_id LVS_DEVEL# #对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查vrrp_skip_check_adv_addr# 开启了此项后没有设置vrrp_iptables则会自动开启iptables防火墙规则,导致VIP地址无法访问,建议不加此项vrrp_strict# 与vrrp_strict同时设置时可禁止iptables规则的生成,注释或者无vrrp_strict时可不加此项
!   vrrp_iptables# 设置ARP接口之间发送报文的延迟时间,可以精确到毫秒,默认是0vrrp_garp_interval 0# 设置非请求消息的发送延迟时间,默认为0vrrp_gna_interval 0# 指定要在其下运行脚本的默认用户名/组名,如果未指定此选项,则如果该用户存在,则用户默认为keepalived_script,否则为root,如果未指定groupname,则默认为用户的组。
!   script_user root
}# 脚本配置
## 自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作,脚本可被多个实例调用。
## vrrp_script,仅仅通过监控脚本返回的状态码来识别集群服务是否正常,如果返回状态码是0,那么就认为服务正常,反之亦然
## vrrp_script,其实不关注监控脚本或者命令是怎么实现的,仅仅通过监控脚本返回的状态码来识别集群是否正常工作
vrrp_script nginx_check {script"/tools/nginx_check.sh"interval 1
} # 配置虚拟路由器
vrrp_instance VIP_1 {# 设置此虚拟路由器的初始状态,可选择MASTER或者BACKUPstate MASTER# 绑定当前虚拟路由器所使用的物理接口,如eth0、lo等interface eth0# 设置虚拟路由器的唯一标识,取值范围为0-255,每个虚拟路由器的该项值必须是唯一的,否则无法启动服务,并且同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯一virtual_router_id 51# 设置当前物理节点在此虚拟路由器中的优先级,优先级取值范围为1-254,值越大优先级越高,每个keepalived节点取值不同priority 100# 设置VRRP通告的时间间隔,默认为1秒advert_int 1# 设置认证机制authentication {# 认证类型,可选择AH和PASS两种,AH为IPSC互联网安全协议认证,PASS为简单密码认证,推荐PASS认证auth_type PASS# 预共享秘钥设置,仅前8位有效,同一虚拟路由器的多个keepalived节点auth_pass值必须保持一致auth_pass 1111}# 添加虚拟路由器的IP,并可设置IP对应的子网掩码、网卡和标签等,生产中可能会在同一个虚拟路由器上添加上百个IP,不同的IP分行隔开,不指定网卡时默认添加在eth0上,不设置子网掩码时默认为32位。在添加IP地址时,需确保将要使用的IP不存在virtual_ipaddress {192.168.200.16192.168.200.17192.168.200.18}#指定当切换到master时,执行的脚本
!    notify_master /opt/keepalived/etc/script/notify_fifo.sh#指定当切换到backup时,执行的脚本
!    notify_backup /opt/keepalived/etc/script/notify_fifo.sh#故障时执行的脚本
!    notify_fault /opt/keepalived/etc/script/notify_fifo.sh# 通知
!    notify /opt/keepalived/etc/script/notify_fifo.sh#使用global_defs中提供的邮件地址和smtp服务器发送邮件通知 
!    smtp_alert
}

3、通过配置文件实现资源监控

通过track_script和vrrp_script组合,实现对集群资源的监控并改变优先级,进而实现主备切换

# 1、通过killall命令探测服务运行状态
## killall会发送一个信号给正在运行的进场,默认信号量是15
vrrp_script nginx_check {script"killall -0 nginx"interval 1
}
track_script {nginx_check
}# 2、通过检测端口运行状态
vrrp_script nginx_check {script "</dev/tcp/127.0.0.1/80"interval 1fail 2rise 1
}
track_script {nginx_check
}##  </dev/tcp/127.0.0.1/80定义了一个对本机80端口的状态检测
## 其中"fail"表示检测到失败的最大次数,也就是说如果请求失败两次,就认为此节点资源发生故障,进行切换操作
## rise表示请求一次成功,就认为此节点资源恢复正常# 3、通过shell语句进行状态监控
vrrp_script nginx_check {script "if [ -f /var/log/nginx/nginx.pid ]; then exit 0; else exit 1; fi"interval 1
}
track_script {nginx_check
}
## shell语句执行返回的结果最好是返回一个状态码:0或非0# 4、通过脚本进行服务状态监控
vrrp_script nginx_check {script"/tools/nginx_check.sh"interval 1
}track_script {nginx_check
}
## shell脚本执行返回的结果最好是返回一个状态码:0或非0

1.3 案例

1、nginx + keepalived 实现高可用

keepalived的抢占模式:MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来
环境:
192.168.92.10 server
192.168.92.11 node1

# 1、安装(在两台服务器上执行)
yum install -y keepalived## 安装nginx以及拓展源
yum install epel-release -y
yum install -y nginx# 2、配置nginx 服务cat > /etc/nginx/conf.d/web.conf << EOF
server{listen 8080;root         /usr/share/nginx/html;index test.html;
}
EOF
### server上执行
echo "<h1>This is test1</h1>"  > /usr/share/nginx/html/test.html
### node1上执行
echo "<h1>This is test2</h1>"  > /usr/share/nginx/html/test.htmlsystemctl start nginx.service
systemctl status nginx.service# 3、编写脚本
vim nginx_check.sh 
#!/bin/bash
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fivim master.sh 
#!/bin/bash
ip=`hostname -I | awk '{print $1}'`
dt=$(date +'%Y%m%d %H:%M:%S')
echo "$0--${ip}--${dt}--master" >> /root/scripts/kp.logvim backup.sh
#!/bin/bash
ip=$(hostname -I | awk '{print $1}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo "$0--${ip}--${dt}--backup" >> /root/scripts/kp.logvim fault.sh
#!/bin/bash
ip=$(ip addr|grep inet| grep 192.168 |awk '{print $2}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo "$0--${ip}--${dt}--fault" >> /root/scripts/kp.logvim stop.sh
#!/bin/bash
ip=$(ip addr|grep inet| grep 192.168| awk '{print $2}')
dt=$(date +'%Y%m%d %H:%M:%S')
echo "$0--${ip}--${dt}--stop" >> /root/scripts/kp.log## 两个服务器都要有脚本
scp -r scripts/ root@192.168.92.11:/root# 4、配置 keepalived
cp /etc/keepalived/keepalived.conf{,.bak}
### server 上配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script nginx_check {script "/root/scripts/nginx_check.sh"interval 1
}vrrp_instance VI_1 {state MASTERinterface ens33    # 修改为实际网卡名,可以通过 ip a 查看virtual_router_id 51    # # VRRP 路由 ID实例,每个实例是唯一的priority 100    # 优先级advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒 authentication {auth_type PASSauth_pass 1111}# 虚拟IP,必须与本地网卡在同一网段virtual_ipaddress {192.168.92.200/24}track_script {nginx_check}notify_master /root/scripts/master.shnotify_backup /root/scripts/backup.shnotify_fault /root/scripts/fault.shnotify_stop /root/scripts/stop.sh
}
#### node1 上配置
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script nginx_check {script "/root/scripts/nginx_check.sh"interval 1
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.92.200/24}track_script {nginx_check}notify_master /root/scripts/master.shnotify_backup /root/scripts/backup.shnotify_fault /root/scripts/fault.shnotify_stop /root/scripts/stop.sh}# 5、启动服务
###  server 节点上
systemctl start nginx
systemctl start keepalived
#### 启动之后可以看到,ens33 网卡上已经有虚拟IP了
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:c9:3a:06 brd ff:ff:ff:ff:ff:ffinet 192.168.92.10/24 brd 192.168.92.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.92.200/32 scope global ens33
### node1节点上
systemctl start nginx
systemctl start keepalived
#### # 6、测试
curl 192.168.92.200:8080
<h1>This is test1</h1>

在这里插入图片描述

### 关掉server 上的nginx
systemctl stop nginx.service
### 再查看,可以看出来 VIP 漂移了
curl 192.168.92.200:8080
<h1>This is test2</h1>

在这里插入图片描述

### server 上的nginx启动
systemctl start nginx.service
### 再查看,可以看出来 VIP 又漂移了
curl 192.168.92.200:8080
<h1>This is test1</h1>

在这里插入图片描述

2、nginx + keepalived 实现高可用 - 非抢占模式

keepalived的非抢占模式:意味着即使一个 Keepalived 实例的优先级更高,它也不会从当前拥有虚拟 IP(VIP)的实例中抢占 VIP,除非当前拥有 VIP 的实例主动释放或者无法提供服务。
环境:
server 192.168.92.10
node1 192.168.92.11
其他配置同上不需要修改,只需要修改 keepalived 的配置文件

# 1、修改 keepalived 配置文件
#### server 上的配置文件
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script nginx_check {script "/root/scripts/nginx_check.sh"interval 1
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 100nopreempt               #设置为不抢占advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.92.200/24}track_script {nginx_check}notify_master /root/scripts/master.shnotify_backup /root/scripts/backup.shnotify_fault /root/scripts/fault.shnotify_stop /root/scripts/stop.sh
}#### node1 上的配置文件
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_script nginx_check {script "/root/scripts/nginx_check.sh"interval 1
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.92.200/24}track_script {nginx_check}notify_master /root/scripts/master.shnotify_backup /root/scripts/backup.shnotify_fault /root/scripts/fault.shnotify_stop /root/scripts/stop.sh}# 2、重启服务(修改配置文件后,需要重启服务才能生效)
systemctl restart keepalived.service# 3、测试
#### VIP 此时在 server 节点上
curl 192.168.92.200:8080
<h1>This is test1</h1>
#### 关闭server 上的 nginx
systemctl stop nginx.service
####  可以看出 VIP漂移了
curl 192.168.92.200:8080
<h1>This is test2</h1>
#### sever :再重启nignx ,看是否VIP是否会漂移会server上
systemctl start nginx.service
#### 可以看到VIP并没有漂回来
curl 192.168.92.200:8080
<h1>This is test2</h1>
#### 此时关闭 node1 上的nignx
systemctl stop nginx.service
#### 此时 VIP没有漂移
curl 192.168.92.200:8080
curl: (7) Failed connect to 192.168.92.200:8080; 拒绝连接
#### 关闭 keepalived 服务
systemctl stop keepalived.service
#### 此时 VIP才发生了漂移
curl 192.168.92.200:8080
<h1>This is test1</h1>### 从上述实验中可以看出来,keepalived的非抢占模式中,nginx服务停止的时候VIP不会发生漂移,除非keepalived服务停止

总结

keepalived默认选举机制是通过优先级,优先级高的节点启动后会把Master节点拿过来,也可以认为是抢占模式。
keepalived的非抢占模式,只有当 keepalived 所在节点不可用,或者keepalived服务不可用的时候,VIP才会漂移到优先级高的节点上,如果用来监控某个服务,如nginx时,即使nginx挂掉也不会发生VIP漂移,这点一定要注意。

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

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

相关文章

嵌套查询(一)-谓词IN、量词ANY、量词ALL、比较运算符

一、在多个表之间进行数据查询&#xff0c;除了可以使用连接查询之外&#xff0c;也可以使用嵌套查询&#xff0c;那么什么是嵌套查询呢&#xff1f;如何使用嵌套查询呢&#xff1f; 1、将一个SELECT-FROM查询&#xff0c;嵌套在另一个SELECT查询语句中&#xff0c;那么这个SE…

swagger美化

参考资料 https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 版本选择 需要先确认springboot版本&#xff0c;再确认swagger版本是2还是3&#xff0c;最后还要关注Springfox的版本。 确认springboot版本的方法 简单的看当前项目使用的就行 例子 https:…

前端面试项目细节重难点(已工作|做分享)(九)

面试官&#xff1a;请你讲讲你在工作中如何开发一个新需求&#xff0c;你的整个开发过程是什么样的&#xff1f; 答&#xff1a;仔细想想&#xff0c;我开发新需求的过程如下&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;理解需求文档&#xff1a; 首先&#x…

这三款使用的视频、图片设计工具,提供工作效率

Videograp Videograp是一款专注于视频生成的工具&#xff0c;特别适合需要快速剪辑和编辑视频的用户。Videograp具备以下特点&#xff1a; 影音比例转换&#xff1a;Videograp支持调整视频的分辨率和比例&#xff0c;使其更适合不同的播放环境和设备。 AI快剪&#xff1a;该工…

期望14K,某小公司java社招面试经历

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 面试的是一家几百人的公司&#xff0c;基本面试的考察有八股文&#xff0c;也有按照项目问你的&#xff0c;总的来说比较全面吧 1、java代理模式 …

k8s 自动伸缩机制-------HPA 超详细解读

目录 在K8s中扩缩容分为两种&#xff1a; 前言 弹性伸缩是根据用户的业务需求和策略&#xff0c;自动“调整”其“弹性资源”的管理服务。通过弹性伸缩功能&#xff0c;用户可设置对定时、周期或监控策略&#xff0c;恰到好处地增加或减少“弹性资源”&#xff0c;并完成实例…

Android native层的线程分析(C++),以及堆栈打印调试

文章目录 Android native层的线程分析(C)&#xff0c;多线程实现1.native线程的创建第一部分&#xff1a;android_thread模块第二部分&#xff1a;linux_thread模块 2.测试linux_thread模块3.Android native的Thread类3.1源码分析 4.native层堆栈调试方法1. 引用库2. 头文件3. …

前端实现获取后端返回的文件流并下载

前端实现获取后端返回的文件流并下载 方法一&#xff1a;使用Axios实现文件流下载优点缺点 方法二&#xff1a;使用封装的Request工具实现文件流下载优点缺点 方法三&#xff1a;直接通过URL跳转下载优点缺点 结论 在前端开发中&#xff0c;有时需要从后端获取文件流&#xff0…

性能测试3【搬代码】

1.Linux服务器性能分析命令及详解 2.GarafanainfluxDB监控jmeter数据 3.GarafanaPrometheus监控服务器和数据库性能 4.性能瓶颈分析以及性能调优方案详解 一、无界面压测时&#xff0c; top load average:平均负载 htop 二、Garafana监控平台 传统项目&#xff1a;centosphpm…

网站接口是怎么开发的,开发之后是怎么用的

网站接口的开发流程 1.确定接口需求 在开发接口之前我们先要知道&#xff0c;要开发什么样的接口&#xff0c;这个接口是用来干什么的&#xff0c;得先知道相关的需求&#xff0c;才能规划下一步&#xff0c;比如客户想要一个文章列表&#xff0c;那么我们就知道这个需求…

kettle从入门到精通 第六十九课 ETL之kettle kettle cdc mysql,轻松实现增量同步

1、之前kettle cdc mysql的时候使用的方案是canalkafkakettle&#xff0c;今天我们一起学习下使用kettle的插件Debezium直接cdc mysql。 注&#xff1a;CDC (Change Data Capture) 是一种技术&#xff0c;用于捕获和同步数据库中的更改。 1&#xff09;Debezium步骤解析mysql b…

基于Python+OpenCV高速公路行驶车辆的速度检测系统

简介&#xff1a; 基于Python和OpenCV的高速公路行驶车辆的速度检测系统旨在实时监测高速公路上的车辆&#xff0c;并测量它们的速度。该系统可以用于交通监控、道路安全管理等领域&#xff0c;为相关部门提供重要的数据支持。 系统实现&#xff1a; 视频流输入&#xff1a;系…

Antd 自定义列表全选功能

背景 需要为List组件自定义全选功能&#xff0c;如下图所示&#xff1a; 全选checkbox需要与下面每一项的checkbox联动&#xff1b;当从第一页翻页到第二页的时候&#xff0c;第一页已选的内容保持&#xff0c;可以对第二页勾选&#xff0c;同时保证全选checkbox的状态是正确的…

当JS遇上NLP:开启图片分析的奇幻之旅

前言 在当今科技飞速发展的时代&#xff0c;JavaScript&#xff08;JS&#xff09;作为广泛应用的编程语言&#xff0c;展现出了强大的活力与无限的可能性。与此同时&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也正在经历着深刻的变革与进步。 当这两者碰撞在一…

【并发编程系列一】并发编年史:线程的双刃剑——从优势到风险的全面解析

文章目录 并发简史&#x1f5a5;️初期探索&#xff08;20世纪50-60年代&#xff09;并发理论基础&#xff08;1965年以后&#xff09;并行计算的兴起&#xff08;1970年代至1980年代&#xff09;现代并发技术&#xff08;1990年代至今&#xff09; 线程的优势&#x1f60d;发挥…

DDei在线设计器-API概述

API文档 本文档提供了DDei组件所包含的关键API接口&#xff0c;以及重要类之间的关系&#xff0c;并以可运行示例代码的形式说明API的调用&#xff0c;便于开发人员进行查阅、调试和复制。 如需了解详细的API教程以及参数说明&#xff0c;请参考DDei文档 设计器 设计器API用于…

【车载AI音视频电脑】200万像素迷你一体机

产品主要特点&#xff1a; -设备安装方便简洁&#xff0c;可通过3M胶直接将设备粘 贴到车前挡风玻璃上 -支持IE预览&#xff0c;手机&#xff0c;PAD实时预览&#xff0c; 支持电脑客 户端实时预览功能 -内置2路模拟高清, 每路均可达到200万像素。另 外可扩充2路1080P模拟…

基于springboot实现问卷调查系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现问卷调查系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;问卷信息因为其管理内容繁杂&#xff0c;管理数…

go context 源码刨析(一)

Context 上下文context.Context 是用来设置截止时间、同步信号&#xff0c;传递请求相关值的结构体。 context.Context 定义了四个需要实现的方法&#xff1a; Deadline: 返回 context.Context 被取消的时间。Done: 返回一个 Channel&#xff0c;这个 Channel 会在当前工作完…

Django 5 Web应用开发实战

文章目录 一、内容简介二、目录内容三、值得一读四、适读人群 一、内容简介 《Django 5 Web应用开发实战》集Django架站基础、项目实践、开发经验于一体&#xff0c;是一本从零基础到精通Django Web企业级开发技术的实战指南。《Django 5 Web应用开发实战》内容以Python 3.x和…