一、微服务(容器)的注册与发现——微服务架构中极其重要的组件
1、定义:是一种分布式管理系统以及定位服务的方法。传统架构中,应用程序之间直连到已知的服务,设备提供的网络(IP地址),基于TCP/IP协议:端口。由于现代微服务部署,服务的动态性、数量增加,传统的基于IP地址+端口的方式已不太适用,应运而生服务注册及发现
2、服务注册及发现核心:微服务的位置信息(IP地址+端口+服务名称+健康状态)统一注册到服务注册中心表中,可以允许其他服务动态的查询和发现这些服务(发现和查询机制)
3、工作机制
(1)服务注册:当一个服务启动时,会把自己的元数据【IP地址+端口+服务名称+健康状态(服务是否在运行)】注册到服务注册表(consul、zookeeper、云平台)中
(2)服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(IP地址+端口),这样可以直接在服务注册表中直接获取需要的信息,不需要到静态配置查看
注:一旦服务停止,会从服务注册中心表中移除该服务的所有信息
4、服务注册与发现的优点
(1)动态性:可以在运行时动态添加或移除服务,无需额外的人工操作和配置
(2)弹性:一旦某个服务不可用,服务注册表会及时更新,通知其他服务避免请求失败
(3)可扩展:适应不断变化的服务数量
(4)透明性:服务方调用时,前端和后端实现解耦
注:服务注册与发现机制和其他工具配合使用,例如:负载均衡、健康检查、配置管理(一键同步)
二、consul
1、定义:consul是HashiCrop公司开发的一套工具,用于实现服务发现与注册、配置管理、分布式系统协调
2、特点
(1)★服务发现与自动注册:保存位置信息(IP地址+端口+服务名称)
(2)★健康检查:服务注册到consul,一并加入系统的还有其健康状态,定期发送一个心跳检查,若服务挂了,consul会自动解除
(3)分布式锁:consul提供一个分布式锁的功能,可协调多个节点之间的操作,防止竞争条件和数据冲突
①创建锁:每一个服务的发现与注册都是一个会话session。微服务1注册到consul时,consul会和这个服务的会话创建一个锁,锁用来表示具体的服务,会话和锁之间进行关联
②获取锁:微服务2建立会话获取锁,若申请的锁没有被使用,客户端成功获取;若已存在,表示已有其他服务在占用,会给该服务分配一个新的锁(KV存储)
③释放锁:任务完成或服务断开连接,会把锁释放,删除会话和锁之间的关系,删除与锁关联的KV键,实现资源释放
(4)KV存储:key-value分布式的键值对存储系统,存储配置信息、锁、特性等,应用程序可以使用consul的键值对存储来动态的获取配置信息
(5)多数据中心支持:consul可以在多个地域部署,可以实现数据中心之间的发现和注册功能
(6)DNS和HTTP API:consul支持DNS接口,通过域名解析定位服务的位置,HTTP API通过API应用接口调用consul的信息(服务信息、健康检查等)
(7)事件通知:若有关键信息可以随时获取通知
三、一键化自动管理以及自动发现和管理(consul-template工具)
1、定义:用于consul集成,自动更新配置文件,实现配置管理的自动化
2、作用
①动态的配置更新:consul-template监控consul中的key-value的存储键值对,键值对发生变化,会自动更新配置文件,无需重启服务
②支持多种后端的模板:比如nginx配置、ETCD等
四、容器自动发现与注册、配置实验
主机名 | 作用 | IP地址 | 组件 |
docker1 | consul服务器 | 20.0.0.16 | consul、docker-ce、nginx二进制、sonsul-template(自动发现与自动配置) |
docker2 | registrator服务器 | 20.0.0.26 | 运行注册机制和微服务 |
docker3 | consul服务器 | 20.0.0.36 | 多节点服务器,加入到consul集群中 |
1、consul部署和服务发现docker1
(1)安装consul
consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=20.0.0.16 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
(2)启动consul
consul agent | 开启监听服务 |
-server | 指定集群当中的服务器节点,consul的RAFT算法实现分布式结构中节点的在一致性。集群中的成员,直接成为集群的leader,后续加入的服务器都是follower |
-bootstrap | 表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导,加入集群 |
-ui | 表示启动图形化界面 |
-data-dir=/var/lib/consul-data | consul存储数据的路径 |
-bind=20.0.0.16 | 服务端绑定的IP地址,用于节点通信 |
-client=0.0.0.0 | 所有主机都可以和server建立通信(生产环境中指定IP地址) |
-node=consul-server01 | 指定consul节点的名称(在集群中,名称是唯一且不可重复的) |
&> /var/log/consul.log | 混合重定向输出到/consul.log中 |
& | 后台运行 |
(3)查看consul端口
8300 | RAFT协议的端口,保持分布式集群的一致性,端口处理复制和领导者选举 |
8301 | LAN Gossip的端口,局域网内进行节点通信和信息传播的协议 |
8302 | Wan Gossip的端口,广域网内进行节点通信和信息传播的协议 |
8500 | web ui的端口,用来访问consul的图形化界面 |
8600 | DNS解析的端口 |
①查询集群信息
consul members
②查看集群状态
consul operator raft list-peers
③查看集群的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、自动发现与配置【docker2】
(1)创建自动注册的容器
docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> --ip=20.0.0.26 \
> consul://20.0.0.16:8500
docker run -itd -p 81:80 --name test-1 -h test1 nginx
docker run -itd -p 82:80 --name test-2 -h test1 httpd
--name=registrator | 容器名称 |
-v /var/run/docker.sock:/tmp/docker.sock | docker.sock是docker守护进程的套接字文件,把它应色号到容器中,registrator容器可以监听docker的所有事件,且完成自动注册服务 |
--ip=20.0.0.26 | 注册在consul的IP地址 |
consul://20.0.0.16:8500 | 所有发现的服务都会注册到指定的server节点 |
(2)浏览器访问20.0.0.16:8500
(3)模拟服务停止,consul是否能自动移除
docker stop test-2
(4)恢复服务,consul是否会自动发现
(5)查看集群中已经被注册与发现的服务【docker1】
curl 127.0.0.1:8500/v1/catalog/services
3、自动发现与配置【docker1】
(1)创建自动化更新nginx配置文件
range service "nginx" | 在这个配置中,test1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务 |
server {{.Address}}:{{.Port}} | 将发现和注册的nginx服务的IP地址和端口添加到test1的方法中 |
(2)编译安装nginx
(3)虚拟主机创建目录
(4)解压template源码包
(5)启动template服务,启动后不要按 ctrl+c 中止 consul-template 进程
consul-template --consul-addr 20.0.0.16: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 192.168.233,40:8500 | 指定consul的地址,告诉consul-template从server节点获取数据 |
/opt/consul/nginx.ctmpl: | 配置文件的模板位置 |
/usr/local/nginx/vhost/test,conf | 基于模板生成配置文件的位置 |
/usr/local/nginx/sbin/nginx -s reload | 只要集群中服务发生变化,可以随时更新到配置文件中 |
--log-level=info | 设置consul-template的日志级别为info |
consul是一个中间件,nginx服务通过consul-template获取模板,反向代理,consul-template,consul来获取服务的IP地址和端口,然后nginx调用发现的服务实现负载均衡
4、添加多个consul节点【docker3】
(1)解压consul源码包
(2)在集群中添加节点服务器【docker2】
docker run -d --name=registrator3 -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest --ip=20.0.0.26 consul://20.0.0.36:8500
(3)启动consul
consul agent-server \
-ui \
-data-dir=/var/lib/consul-databind=20.0.0.36 \
client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.16 &> /var/log/consul.log &
-enable-script-checks=true | 设置检查服务为可用,也可以发现原集群中的服务 |
-datacenter=dc1 | 加入到40的数据中心 |
-join 192.168.233.40 | 加入到已有的集群中 |
(4)查看集群状态
consul operator raft list-peers
查询集群信息consul members
(5)脱离集群consul leave