使用Docker Swarm部署RabbitMQ+HAProxy高可用集群(三节点-镜像模式)

news2024/11/26 4:25:51

1. 部署规划

当前规划中,只启动一个HAProxy服务,主要用来做RabbitMQ节点的负载均衡和代理,但是HAProxy可能会出现单点故障,后续需要启动多个HAProxy节点,然后结合Keepalived来进行 设置虚拟IP 做故障转移

节点名称节点主机名IP地址角色运行服务备注
cluster01cluster01192.168.12.48Docker Swarm Manager & NodeHAProxy & RabbitMQ-Node01
cluster01cluster02192.168.12.49Docker Swarm Manager & NodeRabbitMQ-Node02
cluster01cluster03192.168.12.50Docker Swarm Manager & NodeRabbitMQ-Node02

下面部署文档中,需要执行的指令所在节点,将会说明在以上规划的某个节点执行,均已节点名称代替。

2. 安装Docker和Docker Swarm

安装Docker和Docker Swarm。Docker是用于构建、发布和运行容器化应用程序的开源工具,而Docker Swarm是Docker的一种编排和集群管理方式,用于实现容器化应用程序的高可用性和负载均衡。

需要多节点,那么在多个节点上安装Docker和Docker Swarm

可以通过以下命令来安装Docker和Docker Swarm

  • cluster01、cluster02、cluster03节点执行
# 安装Docker
$ curl -sSL https://get.docker.com/ | sh

# 启动Docker
$ systemctl start docker

# 安装Docker Swarm
$ docker pull swarm:latest

3. 创建Docker Swarm集群

创建Docker Swarm集群。Docker Swarm集群由一组Docker主机组成,其中有一台主机作为管理节点,其它主机作为工作节点

3.1. 创建Docker Swarm集群

如果配置多节点,需要在多个节点创建Docker Swarm集群

cluster01 节点执行

# 创建Docker Swarm管理节点 
$ docker swarm init \
      --advertise-addr=192.168.12.48
  • 执行输出如下:
    在这里插入图片描述
    注意:三个节点我们都规划成了manager管理节点并且充当node节点,也会为了访问单点故障,所以下面执行的指令,我们将不通过已经指令执行,我们通过获取manager的加入指令来操作

cluster01节点执行

$ docker swarm join-token manager

# 将指令的输出结果复制,将作为后续其他cluster02、cluster03的加入操作指令

在这里插入图片描述

3.2. 将工作节点加入Docker Swarm集群

复制上面通过docker swarm join-token manager管理节点的初始化输出指令

cluster02、cluster03 节点执行

# 创建Docker Swarm其他管理节点
$ docker swarm join \
      --token=TOKEN MANAGER_IP:2377

3.3. 查看集群运行状态

# 查询Docker Swarm集群的状态
$ docker node ls
  • 以下输出则表示Docker Swarm 3个节点均已成功加入集群,三个管理节点,其中cluster01为主节点

在这里插入图片描述

4. 创建共享数据持久化卷

共享存储卷,可以使用外部NFS做为共享卷来存储服务的持久化数据,也是可以Docker Swarm的本地volume卷来存储数据,这里两种方式都有具体操作,但是建议使用本地volume来存储。

下面所有步骤关于共享卷的使用,本文档选择本地Volume的方式,其他方式可以自行配置即可。

4.1. 创建共享存储卷 - local

Docker Swarm 的共享存储卷功能会自动在集群中的多个节点之间分布共享存储卷的数据,并保证数据的一致性和可用性。它内部使用了分布式文件系统来存储数据,并提供一个统一的接口,让容器可以访问存储卷中的数据。

总之,Docker Swarm 的共享存储卷功能可以方便地解决容器之间共享数据的问题,并保证数据的安全性和可用性。

4.1.1. 使用 Docker 命令行工具创建共享存储卷 - RabbitMQ

cluster01、cluster02、cluster03节点执行

# 初始化一个本地目录做数据共享
$ mkdir -p /data/rabbitmq-data

# 执行挂载挂载映射指令
$ docker volume create --driver local \
      --opt type=none \
      --opt device=/data/rabbitmq-data \
      --opt o=bind \
      cluster<01、02、03>-rabbitmq-data

上面的命令将创建一个名为 cluster<01、02、03>-rabbitmq-data 的共享存储卷,并将它挂载到本地主机的 /data/rabbitmq-data 目录

5. 创建节点间通信共享overlay网络

5.1. 创建服务共享网络

这里的 rabbitmq_network 为三个节点直接共享所使用的网络名称,分别为三个服务创建单独通信的网络,后续将会使用这个网络节点之间的网络通信,名称可以自定义,但后续在创建服务时需要查询使用

cluster01节点执行

  • 创建rabbitmq服务使用网络
$ docker network create -d overlay --attachable rabbitmq_network

6. 创建RabbitMQ服务

6.1. 拉取RabbitMQ镜像

cluster01、cluster02、cluster03节点执行

$ docker pull rabbitmq:3.11-management

6.2. 创建RabbitMQ服务

6.2.1. 在cluster01节点创建RabbitMQ服务

使用 docker run 命令来创建一个运行 RabbitMQ 的服务,是否配置参数如下:

配置参数配置值解析
–namerabbitmq-node01指定容器服务启动的名称
–hostnamerabbitmq-node01指定服务的主机名称
-vcluster01-rabbitmq-data:/var/lib/rabbitmq指定本地映射目录,将cluster01-rabbitmq-data的本地volume卷映射到容器内部/var/lib/rabbitmq目录作为数据存储目录使用【cluster01-rabbitmq-data就是上面给rabbitmq所创建的卷名称】
-p5672:5672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机5672映射到容器的5672端口,此端口为RabbitMQ的对外服务连接端口
-p15672:15672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机15672映射到容器的15672端口,此端口为RabbitMQ管理控制台访问端口
-e RABBITMQ_DEFAULT_USERadmin指定RabbitMQ服务启动后所创建的默认用户
-e RABBITMQ_DEFAULT_PASSadmin指定RabbitMQ服务启动后所创建的默认用户的默认密码
-e RABBITMQ_ERLANG_COOKIErabbitmqcookie指定集群节点间通信认证密钥,同属于一个集群,需要所有服务器启动时配置值都保持一致才可以正常加入到一个集群
–networkrabbitmq_network指定容器服务所使用的网络【rabbitmq_network就是上面给rabbitmq通信所创建的网络】

cluster01节点执行

$ docker run -d \
      --hostname rabbitmq-node01 \
      --name rabbitmq-node01 \
      -e RABBITMQ_ERLANG_COOKIE="rabbitcookie" \
      -e RABBITMQ_DEFAULT_USER="admin" \
      -e RABBITMQ_DEFAULT_PASS="admin" \
      -v cluster01-rabbitmq-data:/var/lib/rabbitmq \
      -p 5672:5672 \
      -p 15672:15672 \
      --net=rabbitmq_network \
      rabbitmq:3.11-management
  • 查看服务信息

通过指令查看rabbitmq-node01的容器服务是否正常启动

# 查看rabbitmq-node01服务的所有配置信息
$ docker inspect rabbitmq-node01
  • 确认rabbitmq服务正常启动

通过浏览器访问cluster01节点15672端口查看服务状态
在这里插入图片描述
在这里插入图片描述
通过RabbitMQ管理页面查看,可以确认rabbitmq-node01节点一服务启动正常

6.2.2. 在cluster02节点创建RabbitMQ服务

使用 docker run 命令来创建一个运行 RabbitMQ 的服务,是否配置参数如下:

配置参数配置值解析
–namerabbitmq-node02指定容器服务启动的名称
–hostnamerabbitmq-node02指定服务的主机名称
-vcluster02-rabbitmq-data:/var/lib/rabbitmq指定本地映射目录,将cluster02-rabbitmq-data的本地volume卷映射到容器内部/var/lib/rabbitmq目录作为数据存储目录使用【cluster01-rabbitmq-data就是上面给rabbitmq所创建的卷名称】
-p5672:5672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机5672映射到容器的5672端口,此端口为RabbitMQ的对外服务连接端口
-p15672:15672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机15672映射到容器的15672端口,此端口为RabbitMQ管理控制台访问端口
-e RABBITMQ_ERLANG_COOKIErabbitmqcookie指定集群节点间通信认证密钥,同属于一个集群,需要所有服务器启动时配置值都保持一致才可以正常加入到一个集群
–networkrabbitmq_network指定容器服务所使用的网络【rabbitmq_network就是上面给rabbitmq通信所创建的网络】

cluster02节点执行

$ docker run -d \
      --hostname rabbitmq-node02 \
      --name rabbitmq-node02 \
      -e RABBITMQ_ERLANG_COOKIE="rabbitcookie" \
      -v cluster02-rabbitmq-data:/var/lib/rabbitmq \
      -p 5672:5672 \
      -p 15672:15672 \
      --net=rabbitmq_network \
      rabbitmq:3.11-management
  • 查看服务信息

通过指令查看rabbitmq-node02的容器服务是否正常启动

# 查看rabbitmq-node02服务的所有配置信息
$ docker inspect rabbitmq-node02

确认RabbitMQ服务正常启动

6.2.3. 在cluster03节点创建RabbitMQ服务

使用 docker run 命令来创建一个运行 RabbitMQ 的服务,是否配置参数如下:

配置参数配置值解析
–namerabbitmq-node03指定容器服务启动的名称
–hostnamerabbitmq-node03指定服务的主机名称
-vcluster03-rabbitmq-data:/var/lib/rabbitmq指定本地映射目录,将cluster03-rabbitmq-data的本地volume卷映射到容器内部/var/lib/rabbitmq目录作为数据存储目录使用【cluster01-rabbitmq-data就是上面给rabbitmq所创建的卷名称】
-p5672:5672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机5672映射到容器的5672端口,此端口为RabbitMQ的对外服务连接端口
-p15672:15672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机15672映射到容器的15672端口,此端口为RabbitMQ管理控制台访问端口
-e RABBITMQ_ERLANG_COOKIErabbitmqcookie指定集群节点间通信认证密钥,同属于一个集群,需要所有服务器启动时配置值都保持一致才可以正常加入到一个集群
–networkrabbitmq_network指定容器服务所使用的网络【rabbitmq_network就是上面给rabbitmq通信所创建的网络】

cluster02节点执行

$ docker run -d \
      --hostname rabbitmq-node03 \
      --name rabbitmq-node03 \
      -e RABBITMQ_ERLANG_COOKIE="rabbitcookie" \
      -v cluster03-rabbitmq-data:/var/lib/rabbitmq \
      -p 5672:5672 \
      -p 15672:15672 \
      --net=rabbitmq_network \
      rabbitmq:3.11-management
  • 查看服务信息

通过指令查看rabbitmq-node03的容器服务是否正常启动

# 查看rabbitmq-node03服务的所有配置信息
$ docker inspect rabbitmq-node03

确认RabbitMQ服务正常启动

7. 加入RabbitMQ集群

每个RabbitMQ节点,要么是内存节点,要么是磁盘节点。

内存节点:将所有的队列、交换器、绑定、用户等元数据定义都存储在内存中;

磁盘节点:将元数据存储在磁盘中。

单节点系统只允许磁盘类型的节点,否则当节点重启以后,所有的配置信息都会丢失。

如果采用集群的方式,可以选择至少配置一个节点为磁盘节点,其余部分配置为内存节点,这样可以获得更快的响应。所以本集群中配置节点1为磁盘节点,cluster02和cluster03为内存节点。

集群中的第一个节点将初始元数据代入集群中,并且无须被告知加入。而第2个和之后加入的节点将加入它并获取它的元数据。要加入节点,需要进入Docker容器,重启RabbitMQ。

7.1. 在cluster01节点执行初始化

cluster01节点执行

$ docker exec -ti rabbitmq-node01 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl start_app

7.2. 在cluster02节点执行加入操作

cluster02节点执行

$ docker exec -ti rabbitmq-node02 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl join_cluster --ram rabbit@rabbitmq-node01
$ rabbitmqctl start_app

7.3. 在cluster03节点执行加入操作

cluster03节点执行

$ docker exec -ti rabbitmq-node03 bash
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl join_cluster --ram rabbit@rabbitmq-node01
$ rabbitmqctl start_app

8. 配置RabbitMQ镜像队列

  • 配置镜像队列

镜像队列工作原理:在非镜像队列的集群中,消息会路由到指定的队列。当配置为镜像队列之后,消息除了按照路由规则投递到相应的队列外,还会投递到镜像队列的拷贝。也可以想象在镜像队列中隐藏着一个fanout交换器,将消息发送到镜像的队列的拷贝。

进入任意一个RabbitMQ节点,执行如下命令:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

可以设置镜像队列,"^"表示匹配所有队列,即所有队列在各个节点上都会有备份。在集群中,只需要在一个节点上设置镜像队列,设置操作会同步到其他节点。

查看集群的状态:

rabbitmqctl cluster_status

9. 检查RabbitMQ集群状态

完成以上cluster01、cluster02、cluster03三个节点的RabbitMQ服务的启动和集群的配置。

所有节点设置完成之后,在浏览器访问cluster01、cluster02和cluster03中任意一个节点的15672端口,都会看到RabbitMQ集群已经创建成功。
在这里插入图片描述

  • 新建立一个队列服务,查看是否已经为镜像队列模式
    在这里插入图片描述
    在这里插入图片描述

如图所示则表示集群已经开启了镜像队列模式,所有的对接消息将在其他节点都存在一份,访问任何一个节点都可以,而且他们直接数据都是同步的。

10. 配置HAProxy服务

三个节点的RabbitMQ服务集群正常之后,已经完成高可用配置,但是在使用过程中,不能让使用RabbitMQ的程序连接三个地址,所以我们还需要一个代理服务器,来配置代理转发做到负载均衡,在使用中客户端只需要连接代理服务器的地址,由代理服务器根据策略来负责分发到后台的三个节点进行数据库的访问,而且可以持续监测后台三个RabbitMQ服务的状态,如果某一个节点挂掉之后,自动负载到其他可用节点。上线之后重新加入到集群,并持续监听,来实现负载均衡高可用。

做代理服务可以有多种选,例如:HAProxy、Nginx都可以实现,这里我们选择HAProxy来实现代理服务,其他配置实现可以自定查阅相关资料来配置。

10.1. 拉取HAProxy镜像

这里我们选择最新的HAProxy的镜像,版本为2.7.0 ,其他版本可以通过访问 https://haproxy.org 来获取

具体版本:HAProxy version 2.7.0-437fd28 2022/12/01

cluster01 节点执行

目前只在一个节点HAProxy服务,会存在一个单点故障的问题,由于所有客户端都会通过HAProxy来转发到后端服务,所以后续将结合Keepalived来实现高可用。

$ docker pull haproxy:latest

10.2. 配置HAProxy配置文件

HAProxy镜像服务内部没有配置文件,需要在容器启动之前将haproxy.cfg配置文件按照需要配置完成,再启动服务时映射到容器内部使用

cluster01节点执行

10.2.1. 创建一个宿主机映射配置文件目录

$ mkdir -p /data/haproxy

10.2.2. 编写HAProxy配置文件

配置文件中,需要修改的内容主要是 listen proxy-rabbitmq 段,这里需要将RabbitMQ的三个节点的RabbitMQ地址进行配置,具体IP地址为容器的内部地址,可以在每个节点通过**docker inspect rabbitmq-node<01/02/03>**来获取,IP地址获取后配置到文件中即可,其他haproxy的配置参数,也可以根据具体环境来进行配置。

这里配置的负载模式为:roundrobin,轮训算法,可以根据实际环境自行配置其他模式即可

cluster01 节点执行

$ vim /data/haproxy/haproxy.cfg
# ---- 配置文件内容如下 ----
global
    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    log 127.0.0.1 local5 info
    #守护进程运行
    daemon

defaults
    log    global
    mode    http
    #日志格式
    option    httplog
    #日志中不记录负载均衡的心跳检测记录
    option    dontlognull
    #连接超时(毫秒)
    timeout connect 5000
    #客户端超时(毫秒)
    timeout client  50000
    #服务器超时(毫秒)
    timeout server  50000

#监控界面
listen  admin_stats
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8888
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息, 用于web浏览器的访问用户名密码
    stats auth  admin:root123.
#数据库负载均衡
listen  proxy-rabbitmq
    #访问的IP和端口
    bind  0.0.0.0:5672
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source
    balance  roundrobin
    #日志格式
    option  tcplog
    #inter 每隔五秒对mq集群做健康检查,2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
    #weight 表示权重都为1,三个节点平均分配资源
    #maxconn 2000,每个节点最大连接2000
    server  RabbitMQ-Node01 10.0.13.23:5672 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
    server  RabbitMQ-Node02 10.0.13.26:5672 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
    server  RabbitMQ-Node03 10.0.13.6:5672 check weight 1 maxconn 2000 inter 5000 rise 2 fall 2
    #使用keepalive检测死链
    option  tcpka

10.3. 创建HAProxy服务

使用 docker run 命令来创建一个运行 HAProxy 的服务,是否配置参数如下:

配置参数配置值解析
-p4001:8888指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机4001映射到容器的8888端口,这个端口后续用来访问haproxy服务的浏览器可视化监控页面
-p4002:5672指定服务映射端口,表示宿主机端口:内部容器服务端口,这里是宿主机4002映射到容器的5672端口,这个端口主要对外客户端访问外部端口,通过这个端口转发至容器内部来访问后端的3个RabbitMQ集群。
-v/data/haproxy:/usr/local/etc/haproxy指定本地映射目录,将/data/haproxy的本地目录映射到容器内部/usr/local/etc/haproxy目录作为haproxy的配置文件目录使用
–namehaproxy指定容器服务启动的名称
–networkrabbitmq_network指定容器服务所使用的网络【rabbitmq_network就是上面给rabbitmq通信所创建的网络】

cluster01 节点执行

$ docker run -d \
     -p 4001:8888 \
     -p 4002:5672 \
     -v /data/haproxy:/usr/local/etc/haproxy \
     --name=haproxy \
     --net=rabbitmq_network \
     --privileged \
     haproxy:latest

11. 测试HAProxy服务功能

HAProxy服务启动后,可以通过访问cluster01节点宿主机的http://:4001/dbs来访问HAProxy服务的浏览器可视化监控页面来查看后端RabbitMQ服务的监测及数据转发负责情况,通过页面可以看到目前后端的节点数量以及状态是否正常等相关信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CcqiOg7y-1688046983475)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/40293903-614a-47c4-939c-e5b34245604e/Untitled.png)]

12. 配置其他应用程序访问RabbitMQ服务

截止到当前,RabbitMQ+HAProxy实现的高可用负载集群就配置完成,那么内部及外部其他应用客户端可以访问HAProxy服务的对外地址及端口来访问后端的RabbitMQ服务。

外部服务访问地址:192.168.12.48 4002 端口,即可访问到数据库,后面就由HAProxy来根据配置的轮训算法来转发到后端的三台RabbitMQ服务 (192.168.12.48 为cluster01节点宿主机的IP地址)

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

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

相关文章

nvm安装nodejs-2023年6月29日

nvm安装nodejs-2023年6月29日 cmd命令行&#xff0c;执行如下代码&#xff0c;表示安装最新稳定版本的node,这里默认是国外的node节点服务器 nvm install lts报错的话&#xff0c;找到安装目录&#xff0c;打开settings.txt&#xff0c;添加如下代码 更换node的国内淘宝镜像节…

cnocr安装和识别文字

cnocr 介绍 参考&#xff1a; cnocr: 极简的中文OCR Python包 https://cnocr.readthedocs.io/zh/latest/ cnocr 主要针对的是排版简单的印刷体文字图片&#xff0c;如截图图片&#xff0c;扫描件等。目前内置的文字检测和分行模块无法处理复杂的文字排版定位。如果要用于场景…

《从零开始编写一个直播服务器》音视频封装FLV

流媒体服务系列文章 文章目录 流媒体服务系列文章前言一、FLV 封装格式解析二、实例分析总结 前言 一、FLV 封装格式解析 flv header flv body flv header previous size0 tag1 previous size1 tag2 … prvious sizen tagn1 flv header previous size0 tag1 header ta…

华为OD机试真题 Python 实现【获得完美走位】【2022Q4 200分】

一、题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键盘并且…

经典文献阅读之--Wheel-SLAM(低成本轮式机器人定位算法)

0. 简介 最近随着越来越多的团队开始注重将SLAM应用在机器人和无人驾驶上&#xff0c;最近SLAM的顶刊顶会也开始想着多模态和低成本这两个方向开始发力。而本文讲的这个《Wheel-SLAM: Simultaneous Localization and Terrain Mapping Using One Wheel-mounted IMU》就是讲了如…

Scala中那些奇怪的符号

<- 运算符 用于 for 循环中&#xff0c;如下所示&#xff1a; for ( i <- arr ){println( "i" i ) } -> 只会用在 k->v 里面 // Map 键值对演示 val colors Map("red" -> "#FF0000", "azure" -> "#F0FF…

WPF 控件设置透明度的方法

方法一&#xff1a;通过 Opacity 属性设置背景色透明度。范围从0-1&#xff0c;0表示完全透明&#xff0c;看不见。 通过 Opacity 属性去改变控件透明度 会影响子控件的透明度&#xff0c;是因为Opacity属性是在UIElement 类(以及Brush基类)中定义&#xff0c;所有元素都具有该…

python分析QQ群聊天记录全过程,从获取到可视化

​ 随着社交媒体的兴起&#xff0c;QQ群成为了人们交流的重要平台&#xff0c;而提取这些数据可以帮助我们了解用户关注的重点和行为&#xff0c;那么如何获取QQ群聊天记录呢&#xff1f;如何对其进行处理并分析呢&#xff1f; 这是一套完整的流程&#xff0c;从选定的QQ群中…

2023最新版SpringCloudAlibaba笔记,把微服务玩的出神入化

SpringCloud Alibaba 大家都知道&#xff0c;新的东西出现必然是因为市场的需求。由于 SpringCloud 版本更新较快&#xff0c;日积月累之下产生了许多的 Bug&#xff0c;所以 SpringCloud 微服务实现方式&#xff1a;Spring Cloud Netflix 自然而然地进入了维护状态&#xff0…

java计算器拓展

源代码&#xff1a; package shixun; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.SwingConstants;import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.Font; impor…

Golang项目引入第三方依赖库

基本目录 第一步&#xff1a; 初始化依赖&#xff0c;切换到项目根目录下面&#xff0c;执行一下命令&#xff0c;g6 为 module 的名称 go mod init g6 生成 go.mod 文件 module g6 go 1.20 将来我们项目的所有依赖都会依赖于 g6 第二步&#xff1a; 引入第三方依赖 &qu…

禁烟警示器报警器

本例介绍的禁止吸烟警示器&#xff0c;可用于家庭居室或各种不宜吸烟的场合 (例如医院、会议室等)。当有人吸烟时&#xff0c;该禁止吸烟警示器会发出"请不要吸烟!"的语言警示声&#xff0c;提醒吸烟者自觉停止吸烟。 一、电路工作原理 电路原理如图 5 所示。 该…

3-如何创建等比数列?【视频版】

目录 问题视频解答 问题 视频解答 点击观看&#xff1a; 3-如何创建等差数列&#xff1f;

一文带你了解WebSocket与技术原理

文章目录 一、技术发展史二、什么是WebSocket三、WebSocket与Socket四、WebSocket 机制五、WebSocket API简单实现 一、技术发展史 在了解WebSocket之前&#xff0c;我们先了解这项技术的发展史&#xff0c;它可以追溯到2008年&#xff0c;当时HTML5规范中引入了该协议作为一种…

【Java】Java核心 80:Git 教程(3)初始化工作区 add与commit

文章目录 04.GIT本地操作-初始化工作区目标内容小结 05.GIT本地操作-add与commit目标内容小结 在Git中&#xff0c;初始化工作区并使用add和commit命令是进行版本控制的基本操作。 下面是对这些操作的简要解释&#xff1a; 初始化工作区&#xff1a;在使用Git之前&#xff0c…

【语音播报】没时间刷新闻热搜?让博灵语音通知终端读给你听!-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器

背景 每天上班太忙碌&#xff0c;没有时间刷微博&#xff0c;新闻发展的太快&#xff0c;生怕错过微博热搜&#xff0c;看着手边的博灵语音通知终端&#xff0c;决定自己写一个脚本&#xff0c;让它给我读新闻&#xff01; 少废话&#xff0c;先看东西 实现了以下效果 每90…

02 快速定位关键点并爆破

vm所进行的代码级的保护是对于软件保护的最后一层 1、API断点法 如何切换到程序的代码节的位置&#xff1f; 》od点击e->双击xxx.exe即可 程序需要读取文本框输入的内容&#xff0c;所以肯定会调用GetWindowText函数&#xff0c;所以可以ctrlg然后输入GetWindowText进行…

ChatGPT 和 Elasticsearch:分面、过滤和更多上下文

作者&#xff1a;Luca Wintergerst 在最近的一篇博客文章中&#xff0c;我们讨论了 ChatGPT 和 Elasticsearch 如何协同工作以帮助更有效地管理专有数据。 通过利用 Elasticsearch 的搜索功能和 ChatGPT 的上下文理解&#xff0c;我们演示了如何改进结果。 在这篇文章中&#…

制造业数字化转型难?低代码带来曙光

概要&#xff1a;制造业企业在数字化转型中一直面临着许多困难和挑战&#xff0c;中小企业更是如此。天翎低代码平台通过自身可视化设计、私有化部署、灵活性、扩展性和兼容性等特性&#xff0c;帮助制造业企业更好地完成数字化转型目标。不仅如此&#xff0c;天翎还推出了微鳄…

iview tree树形控件多选,自定义内容

项目中需要一个iview框架的树形控件,需要里面包含以下功能 1、控件宽度可展开,可缩小2、树形控件可搜索,并且定位到搜索的节点3、控件可以一键勾选,一键取消4、控件图标自定义5、 点击最后一个节点时可以进入到二级节点,点击上一节点可返回完整代码:listToTree文件 效果图: 具…