什么叫微服务或者注册与发现?
是一种分布式管理系统,定位服务的方法。
在传统的架构中,应用程序之间直连到已知的服务。
已知的服务:设备提供的网络、IP地址、基于tcp/ip端口
基于现微服务部署,服务的动态性,数量增加了,传统的基于IP+端口的形式已经不太适用了。
服务注册以及发现:微服务的位置信息(ip+端口+健康状况)统一注册到一个中心化的服务注册表中。
可以允许其他服务动态的查询和发现这些服务。
docker-consul的工作流程
1、 服务注册:当一个服务启动时,会把自己的元数据(IP、端口、服务名称、健康状态也就是服务是否在运行)注册到服务注册表中。
这个注册表的服务(consul、zookeeper)也可以在云平台部署
2、 服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(ip地址+端口),这样的话可以在服务注册表中直接获取我要的信息。不需要到静态配置查看了
服务注册与发现的优点:
-
动态性:可以在运行时动态添加和移除服务,不需要额外的人工操作和配置。
-
弹性:一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求失败。
-
可扩展:可以适应不断变化的服务数量。
-
服务方调用时的透明性:前端和后端实现解耦
服务注册与发现机制和其它工具配合使用:负载均衡、健康检查、配置管理(一键同步)
服务注册与发现机制是微服务架构中非常重要的组件
consul是什么?
consul是HashiCrop公司开发的一套工具,用于实现服务发现与注册,配置管理,分布式的系统协调。
consul的特点
1、 服务发现与自动注册:保存位置信息(ip+端口+服务名称)
2、 健康检查:服务注册到consul时一并加入系统的还有他的健康状态,定期发送一个心跳检查。如果服务不存在,consul会自动移除。
3、 分布式锁机制:consul提供了一个分布式锁的功能,协调多个节点之间的操作。防止竞争条件和数据冲突
4、 KV存储(key-value):分布式的键值对存储系统,存储配置信息、锁、特性。应用程序可以使用consul的键值存储来动态地获取配置信息。
5、 多数据中心支持:consul可以在多个地域部署,可以实现数据中心(机房)之间的发现和注册功能
6、 DNS和HTTP、API:consul支持DNS接口,通过域名解析定位服务的位置。http、api通过api的应用接口,可以调用consul的信息。如服务信息、健康检查等等。
7、 事件通知:如果有关键事件,可以随时获取通知。
分布式锁是什么?
每一个服务的发现和注册都是一个会话 session
创建锁:微服务在注册到consul的时候,consul会和这个服务端会话创建一个锁,分布式锁用来标识具体的服务,会话和锁之间相关联。
获取锁:微服务2,建立会话,获取锁,如果申请的锁没有被占用,客户端成功获取,如果已经存在,表示已经有其他的服务在占用,会分配一个新的锁(KV存储)
释放锁:任务完成或者服务断开连接,会把锁释放,删除会话和锁之间的关系。删除与锁关联的键。
docker-consul部署和搭建
实验准备
ocker1 20.0.0.41 docker-ce nginx二进制 consul-template(自动发现和自动配置)
docker2 20.0.0.42 registrator 运行注册机制和微服务容器服务
docker3 20.0.0.43 consul多节点服务器加入到consul集群中
docker1
mkdir consul
cp consul_0.9.2_linux_amd64.zip consul/
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/local/bin/
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.41 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
#-server:指定集群当中的服务器节点,consul的RAFT算法实现分布式结构中节点的一致性。集群当中的成员.直接成为集群的leader,后续加入的服务都是follower
#-bootstrap:表示该节点是引导接待你,引导选组过程,以及为后续加入的server做引导,加入集群。
#-ui:启动图形化界面
#-data-dir=/var/lib/consul-data:指定consul存储数据的路径
#-bind=20.0.0.41:指定consul服务端绑定的IP地址,实现在节点中通信
#-client=0.0.0.0:客户端的地址0.0.0.0:表示所有主机都可以和server建立通信。(生产中是指定的服务器)
#-node=consul-server01:指定consul节点的名称。在集群当中consul节点的名称都是唯一的不可以重复的。
# &> /var/log/consul.log:重定向混合的方式保存到log文件
#&:后台运行
netstat -antp | grep consul
#8300:raft协议的端口,保持分布式集群的一致性,端口处理复制和领导者选举
#8301:LAN Gossip的端口,局域网内部进行节点的通信和信息传播的协议
#8302:Wan Gossip的端口。广域网内节点的通信和信息传播的协议
#8500:webui的端口。用来访问consul的图形化界面
#8600:DNS解析的端口。
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
#查看集群节点的详细信息。
consul info | grep leader
#查看领导者是否工作
docker2服务端
创建自动发现和注册的容器
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.42 \
consul://20.0.0.41:8500
#-v /var/run/docker.sock:/tmp/docker.sock:docker.sock的是docker守护进程的UNIX的套接字文件,把他映射到容器当中,registrator容器可以监听docker的所有事件,并且完成自动注册服务。
#--ip=20.0.0.42:注册consul的ip地址
#consul://20.0.0.41:8500:所有发现的服务都会注册到指定的server节点。
如果网页查看不到可以使用这个命令
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.42 \
consul://20.0.0.41:8500
docker run -itd -p 81:80 --name tets-1 -h test1 nginx
docker run -itd -p 82:80 --name tets-2 -h test2 httpd
到页面访问测试:20.0.0.41:8500
docker2
实现自动化更新文件
是HashiCrop公司开发的一个工具,用于consul集成,自动更新配置文件,实现配置管理的自动化。
作用:
1、 动态的配置更新。consul-template监控consul当中key-vlaue的存储键值对,键值对发生变化会自动更新配置文件,无需重启服务
2、 支持多种后端的模板:nginx配置,ETCD等等
docker2
回到docker1查看外部服务信息
负载均衡实现
docker3
回到docker1
回到docker2
回到页面查看
实验完成
总结
docker-consul和核心作用就是发现自动生成的微服务,可用动态的管理。
docker-consul:查、看,元数据:IP、端口、健康状态、服务名
consul-template:自动化管理配置文件的工具,获取consul当中注册的服务信息,可用自动的添加到配置文件当中,即使生效,无需重启服务
consul的多节点:一旦选举出了leader,后续的服务器都是follower,server的名称不能重复,唯一,但是可用在一个数据中心。