【Docker六】Docker-consul

目录

一、docker-consul概述

1、服务注册和发现:

1.1、服务注册和发现概念

1.2、服务注册和发现工作机制:

1.3、服务注册与发现的优点:

2、docker-consul概念

2.1、consul的主要特点:

二、consul架构部署:

1、consul服务器配置

1.1、架构:三台服务器:

1.2、consul安装:

1.3、相关端口:

2、检查consul集群相关命令:

3、集群自动发现和注册

3.1、启动consul server

3.2、检测自动发现和注册

4、配置consul-template

4.1、 准备 template nginx 模板文件

4.2、docker1安装nginx:

4.3、配置nginx

4.4、配置并启动 template

4.5、配置并运行template-nginx

4.6、访问template-nginx

5、实现consul的多节点:


一、docker-consul概述

1、服务注册和发现:

1.1、服务注册和发现概念

什么叫做微服务(容器)的注册与发现?

是一种分布式管理系统,定位服务的方法。

在传统的架构中,应用程序之间是直连到已知的服务,由设备提供的网络:IP地址,基于tcp/ip协议的端口

由于现代微服务部署,服务的动态性,数量增加了,传统的基于ip+端口的形式已经不太适用。所以有了服务注册和发现。

微服务的位置信息(ip+端口+健康状态)统一注册到一个中心化的服务注册表中。可以允许其他服务动态的查询和发现这些服务

服务发现和注册时微服务架构中非常重要的组件

1.2、服务注册和发现工作机制:
  1. 服务注册:当一个服务启动时,会把自己的元数据(ip、端口、服务名称、健康状态)注册到服务注册表中。这个注册表的服务(consul,zookeeper)。也可以在云平台部署
  2. 服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(ip+端口),这样的话可以直接在服务注册表中,直接获取我要的信息,不需要到静态配置查看

1.3、服务注册与发现的优点:
  1. 动态性:可以在运行时动态添加和移除服务,不需要额外的人工操作和配置。
  2. 弹性:一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求的失败。
  3. 可扩展:可以适应不断变化的服务数量
  4. 透明性:服务方调用时,透明性,前端和后端实现解耦

服务注册和发现机制与其他工具配置使用,如负载均衡、健康检查、配置管理(一键同步)

2、docker-consul概念

docker-consul:容器的自动发现与注册

docker-consul的核心就是发现,微服务,可以动态的管理

docker-consul的作用查、看。元数据:ip、端口、健康状态、服务名称

consul:服务注册和发现工具

consul是HashiCrop公司开发的一套工具,用于实现服务发现与注册,配置管理,分布式的系统协调

2.1、consul的主要特点:
  1. 服务发现与自动注册,位置信息(ip+端口+服务名称)
  2. 健康检查,服务注册到consul中,一并加入系统的还有他的健康状态,定期发送一个心跳检查,如果服务挂了,consul会自动移除
  3. 分布式锁:consul提供了一个分布式锁的功能,协调多个节点之间的操作,防止竞争条件和数据冲突

每一个服务的发现与注册都是一个会话,session。

创建锁:微服务1在注册到consul的时候,consul会和服务的会话创建一个锁,锁用来标识具体的服务会话和锁之间相关联

获取锁:微服务2,建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他服务在占用,会给你分配一个新的锁(KV存储)

释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系。删除与锁关联的键。实现资源的释放

  1. KV存储:key-value分布式键值对存储系统,存储配置信息、锁、特性等。应用程序可以使用consul的键值对信息来动态的获取配置信息
  2. 多数据中心支持,consul可以在多个地域部署,可以实现数据中心之间的发现和注册功能。
  3. DNS和http的API:consul支持DNS接口,通过域名解析定位服务的位置。http api:通过api应用接口,可以调用consul的信息,服务信息,健康检查等
  4. 事件通知,如果关键信息可以随时获取通知。

二、consul架构部署:

1、consul服务器配置

1.1、架构:三台服务器:

consul服务器:Docker1:20.0.0.51 consul Docker-ce nginx(二进制部署) consul-template(自动发现和部署)

registrator服务器:Docker2:20.0.0.52 运行注册机制和微服务(容器服务)

consul服务器:多节点服务器 Docker3 20.0.0.28(加入到consul集群中)

1.2、consul安装:

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.51 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
consul agent:开启监听服务
-server:指定集群中的服务器节点,consul的RAFT算法实现分布式结构中节点的一致性。集群的成员,直接成为集群的leader,后续加入的服务器都是follower
-bootstrap:表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导,加入集群
-ui:启动图形化界面
-data-dir=/var/lib/consul-data:consul存储数据的路径
-bind=20.0.0.51:服务器绑定的IP地址,节点中通信
-client=0.0.0.0:客户端的地址,所有主机都可以server建立通信(生产中是指定的服务器)
-node=consul-server01:指定consul节点的名称,在集群中consul节点的名称都是唯一的,不可重复
&> /var/log/consul.log:混合重定向输出到consul.log
&:后台运行

1.3、相关端口:
8300:RAFT协议端口,保持分布式集群的一致性,端口处理复制和领导者选举
8301:LAN Gossip的端口,局域网内部进行节点通信和信息传播的协议
8302:WAN Gossip的端口,广域网内部节点的通信和信息传播协议
8500:web ui的端口,用来访问consul的图形化界面
8600:DNS解析端口

2、检查consul集群相关命令:

consul members
集群信息
consul operator raft list-peers
查看集群状态
curl 127.0.0.1:8500/v1/status/peers
查看集群的server成员
curl 127.0.0.1:8500/v1/status/leader
查看集群的领导者
curl 127.0.0.1:8500/v1/catalog/services
查看已经被集群发现和注册的服务
curl 127.0.0.1:8500/v1/catalog/nodes
查看集群节点的详细信息

3、集群自动发现和注册

3.1、启动consul server
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.52 \
consul://20.0.0.51:8500 -v /var/run/docker.sock:/tmp/docker.sock :指定挂载卷
docker.sock是docker守护进程的Unix的套接字文件,把他映射到容器当中,registrator容器可以监听docker的所有事件,并且完成自动注册服务
--ip=20.0.0.52:注册在consul的IP地址
consul://20.0.0.51:8500 :所有发现的服务都会注册到指定的server节点

3.2、检测自动发现和注册

docker run -itd -p 81:80 --name test-1 -h test1 nginx

docker run -itd -p 82:80 --name test-2 -h test2 httpd

docker run -itd -p 83:80 --name test-3 -h test3 nginx

-h指定容器里的主机名

去浏览器访问consul:

20.0.0.51:8500 查看被监测的节点

consul-template:实现配置管理自动化

用于consul集成,自动更新配置文件,实现噢诶之管理的自动化

作用:

1、动态的配置更新。consul-template监听consul中key-value的存储键值对,键值对发生变化会自动的更新配置文件,无需重启服务

2、支持多种后端的模版:nginx配置、ETCD等等

4、配置consul-template

consul-template:

自动化管理配置文件的工具,获取consul中注册的服务信息,可以自动的添加到配置文件中,即使生效无需重启服务

做到自动化更新配置文件

4.1、 准备 template nginx 模板文件

vim /opt/consul/nginx.ctmpl

upstream test1 {{{range service "nginx"}}server {{.Address}}:{{.Port}};{{end}}
}server {listen 8000;server_name localhost 20.0.0.51;access_log /var/log/nginx/test1-access.log;index index.html index.php;location / {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;proxy_pass http://http_backend;
}
}

在这个配置当中,test1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务

server {{.Address}}:{{.Port}};  将发现和注册的nginx服务的IP地址和端口,添加到test1的upstream方法当中

4.2、docker1安装nginx:
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make2、创建运行用户
useradd -M -s /sbin/nologin nginx3、编译安装
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_modulemake && make install4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetchmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
启动nginx 查看端口

4.3、配置nginx

改nginx的配置文件

18行

创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
创建日志文件目录
mkdir /var/log/nginx
停止nginx
nginx -s stop 
启动nginx
nginx

4.4、配置并启动 template
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/

4.5、配置并运行template-nginx

docker1运行template

consul-template --consul-addr 20.0.0.51:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=infoconsul-template --consul-addr 20.0.0.51:8500 指定consul的地址,告诉 consul-template从server节点获取数据
template "/opt/consul/nginxctmpl:/usr/local/nginx/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload"
/opt/consul/nginx.ctmpl:配置文件的模版位置
/usr/local/nginx/vhost/test.conf:基于模版生成配置文件的位置
/usr/local/nginx/sbin/nginx -s reload" 只要集群中服务发生变化,可以随时更新到配置文件中
--log-level=info	设置consul-template的日志级别为info

开个docker1终端,看日志

var/log/consul.log

consul是一个中间件:nginx服务通过consul-template获取模版,反向代理,consul-template——consul来获取注册服务的ip和端口然后nginx调用nginx调用发现的服务来实现负载均衡

template——本机nginx——调用容器nginx,实现负载均衡

4.6、访问template-nginx
docker exec -it test-1 bash
echo "this is test1 web" > /usr/share/nginx/html/index.htmldocker exec -it test-3 bash
echo "this is test2 web" > /usr/share/nginx/html/index.html

浏览器访问:http://20.0.0.51:8000/ ,并不断刷新。实现轮询

自动生成的配置文件在

/usr/local/nginx/conf/vhost/test.conf

5、实现consul的多节点:

consul的多节点:一旦选举出了leader,后续的服务器都是follower。server的名称不能重复,唯一,但是在一个数据中心上

docker3安装consul

docker3添加到consul集群中去:

consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.28 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.51 &> /var/log/consul.log &

-enable-script-checks=true \
设置检查服务为可用,他也可以发现原集群当中的服务
-datacenter=dc1 \
加入到docker1的数据中心
-join 20.0.0.51加入到已有的集群中

consul members
consul operator raft list-peers

在docker2上执行:

让docker3也监控docker2上的容器

docker run -d \
> --name=registrator2 \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> --ip=20.0.0.52 \
> consul://20.0.0.28:8500

浏览器consul查看:

http://20.0.0.51:8500/

脱离集群:

consul leave

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

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

相关文章

Qt 数据库QSqlDatabase使用记录

记录一些在QT中使用QSqlDatabase操作数据库时,需要注意的地方 创建数据库 bool CDBOperatorAbstract::_openDBConn(CDatabaseConfig config) {QWriteLocker locker(&m_locker);QSqlDatabase db;if(QSqlDatabase::contains(m_connectionName)){db QSqlDatabas…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言: 最近在打开之前的项目demo时,出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下: Executio…

微积分-三角函数2

三角函数 在上一节中,讨论了如何在直角三角形中定义三角函数,限制让我们扩展三角函数的定义域。 事实上我们可以取任意角的正弦和余弦,而不只是局限于 0 0 0~ π 2 \frac{\pi}{2} 2π​当中。 当然需要注意的是,正切函数对不是对…

大模型下开源文档解析工具总结及技术思考

1 基于文档解析工具的方法 pdf解析工具 导图一览: PyPDF2提取txt: import PyPDF2 def extract_text_from_pdf(pdf_path):with open(pdf_path, rb) as file:pdf_reader PyPDF2.PdfFileReader(file)num_pages pdf_reader.numPagestext ""f…

【MySQL学习之基础篇】多表查询

文章目录 1. 多表关系1.1. 一对多1.2. 多对多1.3. 一对一 2. 多表查询概述2.1. 数据准备2.2. 概述 3. 查询的分类3.1. 内连接查询3.2. 外连接查询3.3. 自连接3.3.1. 自连接查询3.3.2. 联合查询 3.4. 子查询3.4.1. 概述3.4.2. 标量子查询3.4.3. 列子查询3.4.4. 行子查询3.4.5. 表…

pycharm某个xxx.sh文件显示问号,无法编辑

文章目录 pycharm某个xxx.sh文件显示问号,无法编辑其他参考 pycharm某个xxx.sh文件显示问号,无法编辑 问题描述:pycharm某个xxx.sh文件显示问号,无法编辑 问题分析: pycharm无法识别文件类型。 问题解决: 在pycharm中选中该文件&#xff0…

jmeter前置/后置处理器耗时问题

1. 问题: 需要前置处理器处理一个较为复杂的请求体,循环和判断较多,所以想要验证一下,jmeter在统计业务响应时间时,是否包括前置/后置处理器耗时问题 2. 准备: 创建一个jsr请求,sleep 10毫秒…

TS类型体操-简单-实现pick

文章目录 问题描述举例实现 问题描述 不使用 Pick<T, K> &#xff0c;实现 TS 内置的 Pick<T, K> 的功能。 从类型T 中选出符合 K 的属性&#xff0c;构造一个新的类型。 举例 interface Todo {title: stringdescription: stringcompleted: boolean }type TodoPre…

爆火的“数字人”,你还不知道吗?

数字人是一种基于人工智能技术创建的虚拟实体&#xff0c;具有高度智能化和交互性。他们可以像真正的人类一样思考、学习和表达情感&#xff0c;与人类进行对话和互动。数字人的出现在电影中已经有了一些令人难忘的片段。 首先&#xff0c;值得一提的是电影《阿凡达》中的数字…

10、神秘的“位移主题”

神秘的“位移主题” 1、什么是位移主题2、位移主题的消息格式3、位移主题是怎么被创建的4、什么地方会用到位移主题5、位移主题的删除机制 本章主题是&#xff1a;Kafka 中的内部主题&#xff08;Internal Topic&#xff09;__consumer_offsets。 __consumer_offsets 在 Kafka …

【玩转TableAgent数据智能分析】TableAgent全功能详解及多领域数据分析实践(下)数据分析过程及总结展望

6 TableAgent的数据分析过程解析 TableAgent的整个分析过程包括以下步骤&#xff0c;形成一个有机结构&#xff0c;让我们理清其工作原理。 6.1 Data Graph阶段 TableAgent首先绘制数据图&#xff0c;以解决问题。这个图形表示了问题的分解和细化&#xff0c;将大问题分解成…

紫光展锐CEO任奇伟博士:展锐5G芯筑基当下,迈向未来

12月5日&#xff0c;紫光集团执行副总裁、紫光展锐CEO任奇伟博士受邀出席2023世界5G大会5G产业强基发展论坛&#xff0c;发表了题为《展锐5G芯&#xff1a;筑基当下&#xff0c;迈向未来》的演讲。 ​ 世界5G大会由国务院批准&#xff0c;国家发展改革委、科技部、工信部与地方…