Docker--consul
目录
前言
一、Consul 简介
1.1、 consul 概述
1.2 、consul 的两种模式
1.3、consul 提供的一些关键特性
二、Consul 容器服务更新与发现
三、consul 部署
3.2、查看集群信息
四、registrator服务器
consul-template
五、consul 多节点
前言
服务注册与发现是微服务架构中不可或缺的重要功能。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中
一、Consul 简介
1.1、 consul 概述
consul 是 google 开源的一个使用 go 语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用 Raft 算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行 agent,他有两种运行模式 server 和 client。 每个数据中心官方建议需要 3或 5 个 server 节点以保证数据安全,同时保证 server-leader 的选举能够正确的进行。
1.2 、consul 的两种模式
在 client 模式下,所有注册到当前节点的服务会被转发到 server 节点,本身是不持久化这些信息的。
在 server 模式下,功能和 client 模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
server-leader 是所有 server 节点的老大,它和其它 server 节点不同的是,它需要负责同步注册的信息给其它的 server 节点,同时也要负责各个节点的健康监测。
1.3、consul 提供的一些关键特性
- 服务注册与发现:consul 通过 DNS 或者 HTTP 接口使服务注册和服务发现变的很容易,一些外部服务,例如 saas 提供的也可以一样注册。
- 健康检查:健康检测使 consul 可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
- Key/Value 存储:一个用来存储动态配置的系统。提供简单的 HTTP 接口,可以在任何地方操作。
- 多数据中心:无需复杂的配置,即可支持任意数量的区域。
- 基于 Golong 语言,可移植性强。
- 支持 ACL 访问控制。
- 与 Docker 等轻量级容器可无缝配合。
二、Consul 容器服务更新与发现
两个 nginx 之间做 keepalived,访问的时候通过 httpd 的方式访问 keepalived,访问到 nginx 的主服务器,并且这个主服务器会代理给后端服务器上的 Container,Container 上面可以跑 tomcat/php/apache 等服务。
发现:Consul 会在 docker 服务器上安插一个眼线(registrator),它会自己去探测当前主机上容器的状态变化(增加和减少),并且可以自己去进行调整。当发现容器变化了以后,会把变化的信息告诉 consul 的 server 端并且注册到 consul 的 server 端,注册以后在 UI 界面可以在 web 网页里面查看节点的变化。
更新:Consul agent 控制 consul template 模板,使用 template 组件去和 nginx.conf 来进行对接,使用 template 这种方式来构建模板,模板里面都是变量,引用变量的方式去加载后端由 consul 注册到 server 端之后,server 会把这个信息告诉 agent,agent 会和 template 进行对接并写入 template 中,更新完以后它会作为 nginx.conf 的子配置文件被前端的 nginx 所识别,最后 consul agent 会控制 nginx 来进行 reload,reload 后会识别到 nginx.conf 配置文件中 upstream 池和 proxy_pass 信息的变化,也就是说可以识别后端的节点,这样就可以在地址池中动态的调整后端的资源。
三、consul 部署
consul服务器 | 192.168.239.60 | 运行consul服务、nginx服务、consul-template守护进程 |
---|---|---|
registrator服务器 | 192.168.239.70 | 运行registrator容器、运行nginx容器 |
#关闭防火墙
systemctl stop firewalld.service
setenforce 0
3.1、consul服务器
#将consul软件包上传到/opt目录
mkdir /opt/consul #创建工作目录
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd /opt/consul
unzip consul_0.9.2_linux_amd64.zip #解压
mv consul /usr/local/bin/ #优化路径史系统识别命令
设置代理,在后台启动 consul 服务端consul
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.239.60 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
-server: 以server身份启动。默认是client。
-bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader。
-bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效。
-ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
-data-dir :指定数据存储目录。
-bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。
-client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。-datacenter :指定数据中心名称,默认是dc1。
netstat -natp | grep consul启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口
3.2、查看集群信息
查看members状态
consul members #查看集群成员
查看集群状态
consul operator raft list-peers #查看当前集群状态
consul info | grep leader #查看日志的方式查看集群leader节点
通过 http api 获取集群信息
curl 127.0.0.1:8500/v1/status/peers #查看集群server成员
curl 127.0.0.1:8500/v1/status/leader #集群 server-leader
curl 127.0.0.1:8500/v1/catalog/services #注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx #查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes #集群节点详细信息
四、registrator服务器
容器服务自动加入 Nginx 集群
安装 Gliderlabs/Registrator
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.239.70 \
consul://192.168.239.60:8500
--net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
--restart=always :设置在容器退出时总是重启容器。
--ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。consul :指定consul服务器的IP和端口。
测试服务发现功能是否正常
docker run -itd -p:83:80 --name test-01 -h gb nginx
docker run -itd -p:84:80 --name test-02 -h gb1 nginx
docker run -itd -p:85:80 --name test-03 -h gb2 httpd docker run -itd -p:86:80 --name test-04 -h gb3 httpd
#-h:设置容器主机名
验证 http 和 nginx 服务是否注册到 consul
浏览器中,输入 http://192.168.239.60:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 4个服务。
在consul服务器使用curl测试连接服务器
curl 127.0.0.1:8500/v1/catalog/services
consul-template
Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。
通过consul-template配置实现nginx负载均衡的自动配置
#将软件包拉取opt目录进行解压
unzip consul-template_0.19.3_linux_amd64.zip#优化路径让系统识别
mv consul-template /usr/local/bin/
准备 template nginx 模板文件
#在consul服务器上操作mkdir consul #创建工作目录vim nginx.ctmpl #定义nginx upstream一个简单模板
upstream http_backend {{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
#定义一个server,监听8080端口,反向代理到upstream
server {listen 8080;server_name www.gb.com;access_log /var/log/nginx/kgc.com-access.log;index index.html index.php;location / {proxy_pass http://http_backend;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
yum安装nginx
准备nginx -yum源cd /etc/yum.repos.d/vim nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install nginx -y #安装
systemctl start nginx
netstat -natp |grep 80
启动 template
#在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.239.60:8500 --template "/opt/consul/nginx.ctmpl:/etc/nginx/conf.d/gb-consul.conf:/usr/sbin/nginx -s reload" --log-level=info#--consul-addr 指定consul的ip和端口号;8500既是UI界面端口也是管理服务端口
#/opt/consul/nginx.ctmpl:模板文件路径
#nginx/conf.d/gb-consul.conf:生成的配置文件的路径
#/usr/sbin/nginx -s reload:重载
#--log-level=info:日志的级别
另外打开一个终端查看生成配置文件
cat /etc/nginx/conf.d/gb-consul.confupstream http_backend {server 192.168.239.70:83;server 192.168.239.70:84;}server {listen 8080;server_name www.gb.com;access_log /var/log/nginx/gb.com-access.log;index index.html index.php;location / {proxy_pass http://http_backend;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
访问 template-nginx
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca49c5b1948e httpd "httpd-foreground" 24 hours ago Up 4 hours 0.0.0.0:86->80/tcp, :::86->80/tcp test-04
2c1fbf05eae9 httpd "httpd-foreground" 24 hours ago Up 4 hours 0.0.0.0:85->80/tcp, :::85->80/tcp test-03
82eeea53ebca nginx "/docker-entrypoint.…" 25 hours ago Up 4 hours 0.0.0.0:84->80/tcp, :::84->80/tcp test-02
682af3b7c713 nginx "/docker-entrypoint.…" 25 hours ago Up 4 hours 0.0.0.0:83->80/tcp, :::83->80/tcp test-01
6f8e0a158c62 gliderlabs/registrator:latest "/bin/registrator --…" 25 hours ago Up 4 hours registrator
#进入nginx容器在站点目录写入文件
docker exec -it 682af3b7c713 bash
echo "this is test01 web" > /usr/share/nginx/html/index.htmldocker exec -it 82eeea53ebca bash
echo "this is test02 web" > /usr/share/nginx/html/index.html
浏览器访问:http://192.168.239.60:8080/ ,并不断刷新。
增加一个 nginx 容器节点,测试服务发现及配置更新功能。
docker run -itd -p:85:80 --name test-05 -h test05 nginx
观察 template 服务,会从模板更新/etc/nginx/conf.d/gb-consul.conf文件内容,并且重载 nginx 服务。
#查看/etc/nginx/conf.d/gb-consul.conf 文件内容
cat /etc/nginx/conf.d/gb-consul.conf
upstream http_backend {server 192.168.239.70:83;server 192.168.239.70:84;server 192.168.239.70:87;}
查看第三胎 nginx 容器web站点目录写入文件,网页访问测试是否正常轮询到各个容器节点上
docker exec -it f6a8b57d3a52 bashecho "this is test03 web" > /usr/share/nginx/html/index.html
浏览器访问:http://192.168.239.60:8080/ ,并不断刷新。
五、consul 多节点
#将consul文件传输给50节点让系统识别consul命令
cd /usr/local/bin/
scp consul 192.168.239.50:`pwd`
#添加一台已有docker环境的服务器192.168.239.50/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.239.50 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.239.60 &> /var/log/consul.log &#################################################
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
#查看集群成员
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.239.60:8301 alive server 0.9.2 2 dc1
consul-server02 192.168.239.50:8301 alive server 0.9.2 2 dc1#查看当前集群状态
consul operator raft list-peers
Node ID Address State Voter RaftProtocol
consul-server01 192.168.239.60:8300 192.168.239.60:8300 leader true 2
consul-server02 192.168.239.50:8300 192.168.239.50:8300 follower true 2
相关文章:

Docker--consul
目录 前言 一、Consul 简介 1.1、 consul 概述 1.2 、consul 的两种模式 1.3、consul 提供的一些关键特性 二、Consul 容器服务更新与发现 三、consul 部署 3.2、查看集群信息 四、registrator服务器 consul-template 五、consul 多节点 前言 服务注册与发现是微服…...

ESP-01S使用AT指令连接阿里云
ESP-01S使用AT指令连接阿里云 烧录MQTT AT固件 出厂的ESP-01S是基本的AT指令固件,没有MQTT的,所以无法通过MQTT指令与云平台通信,需要烧录固件(如果测试到有MQTT相关的指令,则不用重新烧录固件) 固件烧录…...

【Kafka】【三】安装Kafka服务器
Kafka基本知识 Kafka介绍 Kafka是最初由Linkedin公司开发,是⼀个分布式、⽀持分区的(partition)、多副本的 (replica),基于zookeeper协调的分布式消息系统,它的最⼤的特性就是可以实时的处理 …...
关于适配器模式,我遗漏了什么
近期有些tasks需要 重构or适配 老的代码。 与其向上面堆💩,不如优雅的去解决。 首先我的问题在于,错误的把 堆屎的操作 ,当作了适配器模式的操作。 比如原函数入参,需要更改某个属性,把这种操作外包一层…...

SQL Serve 日志体系结构
SQL Server 事务日志记录着 undo 及 redo 日志,为了保证数据库在崩溃后恢复,或者在正常数据库操作期间进行回滚,保证数据库事务完整性和持久化。如果没有事务日志记录,数据库在事务上将不一致,并且在数据库崩溃后可能导…...

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号,public,ooci
文章目录1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf2.1 构造函数:对成员变量初始化2.2 析构函数:一个类只有一个,不允许被重载3.引用:C中&取地址&#x…...
asio网络编程 tcp、udp、rpc
轻量级的tcp/udp/rpc库,简化socket程序编写。 同时,RPC部分也提供了方便易用的功能。 仓库地址 https://github.com/shuai132/asio_net asio_net a Tiny Async TCP/UDP/RPC library based on ASIO and RpcCore Features 简化TCP、UDP相关程序的编写…...

双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)
Depth2Uart 双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输 一、项目说明/Overview 所实现的功能:基于Intel Realsense官方提供的SDK,双目深度相机能获取到相机任何一个像素点距离前方障碍物的距离࿰…...

jetson nano(ubuntu)安装Cmake
文章目录安装环境一.命令行安装二.Cmake源码编译安装安装环境 jetson nano 系统:4.6.1 一.命令行安装 sudo apt install cmake这种直接安装cmake的方式,其实安装的版本都太老了,这种方式不推荐 二.Cmake源码编译安装 更新一下系统软件 su…...

图的基本介绍和表示方式
图的基本介绍 为什么要有图这个基本数据结构? 我们还学习过线性表(数组、队列、链表和栈)和树,但是我们可以发现,线性表局限于一个直接前驱(就是只能有唯一一个前面的结点)和一个直接后继的(…...

本周大新闻|传微软解散工业元宇宙团队,MIT研发垂直堆叠全彩Micro LED
本周大新闻,AR方面,消息称微软解散工业元宇宙团队;德国AR公司Gixel GmbH亮相;Brilliant推出单片式附加形态AR眼镜;MIT研发垂直堆叠全彩Micro LED;谷歌XR串流正式上线。VR方面,索尼发布了PS VR2的…...

SpringMVC:拦截器(12)
拦截器1. 拦截器概念2. 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1: 创建拦截器类步骤2: 配置拦截器类步骤3: SpringMVC添加SpringMvcSupport包扫描和interceptor包扫描步骤4: 简化SpringMvcSupport的编写5 测试3. 拦截器参数解析(了解)3.1 前置处理…...

计算机网络3:HTTP1.0和HTTP1.1的区别
目录1. HTTP是什么2.HTTP1.0和HTTP1.1的区别3.名词解释(1)If-Modified-Since(IMS)、Expires(2)If-None-Match,Etag(3)If-Unmodified-Since1. HTTP是什么 超文本传输协议…...
Urho3D 编辑器说明
Urho3D编辑器是一个脚本应用程序,可以与Urho3D播放器应用程序一起运行。要开始,请执行以下任意命令:(在bin目录中)Editor.bat、Editor.sh或Urho3DPlayer Scripts/Editor.as Urho3D播放器应用程序支持的所有命令行选项…...

C++类基础(十一)
运算符重载(二) ● 对称运算符通常定义为非成员函数以支持首个操作数的类型转换 struct Str {int val 0;Str(int input): val(input){}auto operator(Str x){std::cout << "auto operator(Str x)\n";return Str(val x.val);} }; int …...

Windows安装系列:SVN Server服务
一、下载与安装 1、下载VisualSVN-Server-5.1.1-x64.msi 地址:Download | VisualSVN Server 2、找到最新版本SVN 5.1.1,直接双击它,弹出如下安装界面 3、点击Next 4、勾选我接受, 点击"Next" 5、默认选项,…...
快速傅里叶算法(FFT)快在哪里?
目录 前言 1、DFT算法 2、FFT算法 2.1 分类 2.2 以基2 DIT(时间抽取) FFT 算法为例 2.2.1 一次分解 2.2.2 多次分解 参考 前言 对信号分析的过程中,为了能换一个角度观察问题,很多时候需要把时域信号波形变换到频域进行分…...
利用Markdown写学术论文资料汇总贴
1是最详细的,重点看! Markdown 写作,Pandoc 转换:我的纯文本学术写作流程 2补充一些细节,也可以看看。 用Markdown写作学术论文 3写得和上面差不多,如果上面两篇有什么问题还没解决,可以看看…...

MySQL 高级查询
目录1.左关联2.右关联3.子查询4.联合查询5.分组查询1.左关联 MySQL中的左关联(Left Join)是一种基于共同列的连接操作, 它将左侧表中的所有行与右侧表中匹配的行结合在一起, 如果右侧表中没有匹配的行,则结果集中右侧…...

JavaSE学习day4_01 循环for,while,do...while
1. 循环高级 1.1 无限循环 for、while、do...while都有无限循环的写法。 最为常用的是while格式的。 因为无限循环是不知道循环次数的,所以用while格式的 代码示例: while(true){} 1.2 跳转控制语句(掌握) 跳转控制语句&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...