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

1、微服务(容器)、容器的注册和发现:是一种分布式管理系统,用于定位服务的方法

(1)在传统的架构中,应用程序之间直连到已知的服务,设备提供的网络(ip地址、基于tcp/ip的端口)
2 由于现代微服务的部署,服务的动态性,数量增加了,传统的只基于ip+端口的形式已经不太适用
3 服务注册和发现:把微服务的位置信息(包括ip+端口+健康状况)统一注册到一个中心化的服务注册表中,可以允许其他服务动态的查询和发现这些服务

2、服务注册和发现的工作机制

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

3、服务注册和发现的优点

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

4、服务注册和发现机制与其他工具配合使用(微服务架构中非常重要的组件)

1 负载均衡
2 健康检查
3 配置管理:一键同步,只要有变化,及时同步变化

5、consul

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

6、consul的主要特点

1 服务发现与自动注册 :保存位置信息(ip+端口+服务名称)
2 健康检查 :服务注册到consul之后,一并加入系统的还有他的健康状态,定期发送一个心跳检查,如果服务挂了,consul会自动移除
3 分布式锁 :consul提供了一个分布式锁的功能,用于协调多个节点之间的操作,防止竞争条件和数据冲突
①每一个服务的发现和注册都是一个会话session
②创建锁:微服务1在注册到consul的时候,consul会和这个服务的会话创建一个锁,锁用来标识具体的服务器,会话和锁之间关联
③获取锁:微服务2,建立会话、获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他的服务在占用,会给你分配一个新的锁(KV存储)
④释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系,删除与锁关联的键,实现资源的释放
4 KV存储 :key-value,分布式的键值对存储系统,存储配置信息、锁、特性;应用程序可以使用consul的键值对信息来动态的获取配置信息
5 多数据中心支持 :consul可以在多个地域部署,可以实现数据中心之间的发现和注册功能
6 DNS和http、API:consul可以支持DNS接口,可以通过域名解析定位服务的位置;http和API:通过API应用接口,可以调用consul的信息,服务信息、健康信息等等
7 事件通知:如有关键信息可以随时获取通知

7、consul部署和服务发现

|--------------------|----------------------------------------------------------------------------------------|
| consul服务器 | docker1:20.0.0.61 consul组件、docker-ce、nginx服务(二进制部署)、consul-template(自动发现和自动配置) |
| registrator服务器 | docker2:20.0.0.62 运行注册机制和微服务(容器服务) |
| consul服务器 | docker3:20.0.0.63 多节点服务器,加入到consul集群中 |

1 部署consul

①启动consul

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

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

②查询集群信息:consul members

③查看集群的状态:consul operator raft list-peers

④API接口查询:

|----------------------|---------------------------------------------|
| 查看集群的server成员 | curl 127.0.0.1:8500/v1/status/peers |
| 查看集群的leader(领导者) | 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 |

2 部署集群自动发现和自动注册
①创建自动注册的容器(registrator)

|----------------------------------------------|----------------------------------------------------------------------------------|
| --name= registrator | 指定名称 |
| -v /var/run/docker.sock:/tmp/docker.sock | |
| docker.sock | 是docker守护进程的unix的套接字文件,把它映射到容器中, registrator容器可以监听docker的所有事件,并且完成自动注册服务 |
| --ip=20.0.0.62 | 注册在consul的ip地址 |
| consul://20.0.0.61:8500 | 所有被发现的服务都会注册到指定的server节点 |

②运行容器,测试能否被自动发现和注册
docker run -itd -p 81:80 --name test-1 -h test1 nginx
docker run -itd -p 82:80 --name test-2 -h test2 httpd
-h:指定创建主机的主机名

③访问:20.0.0.61:8500

④测试

(3)一键化自动发现和自动配置:consul-template

|------------------------------------------------------------------------------------------------------------------------|
| consul-template:用于consul集成,自动更新配置文件,实现配置管理的自动化 |
| consul-template的作用: |
| 1、 动态的配置更新,consul-template监听consul当中的key-value的存储键值对,键值对发生变化,会自动更新配置文件,无需重启服务 |
| 2、支持多种后端的模版:nginx配置、ETCD等等 |
| consul是一个中间件:本地nginx服务通过consul-template获取模版(反向代理),consul-template通过consul server获取注册服务的ip和端口,然后nginx调用发现的服务来实现负载均衡 |

①自动化更新配置文件

|--------------------------------------------------|--------------------------------------------------|
| {{range service " nginx " }} | hyde1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务 |
| server {{.Address}}:{{.Port}} | 将发现和注册的nginx服务的ip地址和端口,添加到hyde1的upstream的方法中 |

②编译安装nginx
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.22.0.tar.gz -C /opt/
cd /opt/nginx-1.22.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j 4 && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

③修改nginx的配置文件

创建虚拟主机目录 mkdir /usr/local/nginx/conf/vhost
创建日志文件目录 mkdir /var/log/ngin

④配置template

在前台启动 template 服务
consul-template --consul-addr 20.0.0.61:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

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

⑤测试
创建nginx容器:docker run -itd -p 83:80 --name test-3 -h test3 nginx

关闭容器:

重启容器:

⑥配置轮询------配置访问页面

(4)实现consul的多节点部署
①部署consul
②启动consul
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind= 20.0.0.63 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.61 &> /var/log/consul.log &

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

③加入集群
docker run -d \
--name=registrator1 \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.62 \
consul://20.0.0.63:8500

④查看集群状态:consul operator raft list-peers

⑤脱离集群:consul leave

8、总结

(1)docker-consul的核心作用:发现自动生成的微服务,可以动态的管理
(2)docker-consul:查、看(元数据---ip+端口+健康状态+服务名称)
(3)consul-template:自动化管理配置文件的工具,获取consul当中注册的服务信息,可以自动的添加到配置文件中,即时生效,无需重启服务
(4)consul的多节点,一旦选举出了leader,后续的服务器都是follower。server的名称不能重复,是唯一的,但是可以在一个数据中心
相关推荐
阿尔帕兹2 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
景天科技苑6 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge7 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇7 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试9 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!15 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林16 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis18 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision18 小时前
Docker学习—Docker核心概念总结
java·学习·docker