Docker consul 容器的自动发现与注册
什么叫做微服务(容器)注册与发现
是一种分布式的管理系统,定位服务的方法 在传统架构中,应用程序之间直连到已知的服务,由设备提供的网络:IP地址,另一个是基于tcp/ip协议的端口 由于现代微服务部署,服务的动态性,数量增加了,传统的基于ip+端口的形式已经不太适用 服务注册已经发现;核心就是把微服务的位置信息(ip+端口+健康状况)统一注册到一个中心化的服务注册表 可以允许其他服务动态的查询和发现这些服务 |
服务注册 | 当一个服务启动时,会把自己的元数据(ip+端口+服务名称+健康状态(指的是服务是否在运行))主从到服务注册表中,这个注册表的服务(comsul,zookeeper),也可以在云平台部署 |
服务发现 | 其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(ip+端口),这样的好处是可以直接在服务注册表中,直接获取我要的信息,不需要到静态配置查看了 |
服务注册与发现的优点
动态性 | 可以在运动时动态添加和移除服务,不需要额外的人工操纵和配置 |
弹性 | 一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求失败 |
可扩展性 | 可以适应不断变化的服务数量 |
透明性 | 服务方调用时,透明性,前端和后端实现解耦 |
服务注册与发现机制和其它工具配合使用,负载均衡,健康检查,配置管理(一键同步)。 是微服务架构中非常重要的组件 |
Consul
Consul是HashiCrop公司开发的一套工具,用于实现服务发现与注册,配置管理,分布式系统协调 |
Consul的主要特点
1 | 服务发现与自动注册,位置信息(ip+端口+服务名称) |
2 | 健康检查,服务注册到consul,一并加入系统的还有他的健康状态,定期发送一个心跳检查,如果服务不存在,consul会自动移除 |
3 | 分布式锁:consul提供了一个分布式锁的功能,协调多个节点之间的操作,防止竞争和数据冲突 |
每一个服务的发现和注册都是一个会话session.
创建锁 | 微服务在注册到consul的时候,consul会和这个服务的会话创建一个锁,锁用来标识具体的服务器,会话和锁之间关联 |
获取锁 | 微服务2,建立会话,获取锁,如果申请的锁没有被使用,那么客户端会成功获取,如果已经存在,表示已有其他服务在占用,会给你分配一个新的锁(KV存储) |
释放锁 | 任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系,删除与锁关联得键,实现资源的释放 |
KV存储 | key-value分布式的键值对存储系统,存储配置信息,锁,特性。应用程序可以使用consul的键值对信息来动态的获取配置信息 |
多数据中心支持,consul可以在多个地域部署,可以实现数据中心之间的发现和注册功能 | |
DNS和HTTP API:Consul支持DNS接口,通过域名解析定位服务的位置,http api:API应用接口,可以调用consul的信息,服务信息,健康检查等等 | |
事件通知,如有关键信息可以随时获取通知 |
Consul部署和服务发现
Consul服务器 | docker1 192.168.233.11 consul docker-ce nginx二进制部署 consul-template(自动发现和自动配置) |
Registrator | 提供微服务 192.168.233.12 运行注册机制和微服务(容器服务) |
Consul服务器 | 多节点服务器:多节点 docker3 192.168.233.13 (加入到consul的集群中) |
[root@docker1 ~]# systemctl stop firewalld.service
[root@docker1 ~]# setenforce 0
[root@docker1 ~]# cd /opt
[root@docker1 opt]# mkdir consul
[root@docker1 opt]# cp consul_0.9.2_linux_amd64.zip consul
[root@docker1 opt]# cd consul/
[root@docker1 consul]# unzip consul_0.9.2_linux_amd64.zip
[root@docker1 consul]# ls
consul consul_0.9.2_linux_amd64.zip
[root@docker1 consul]# mv consul /usr/local/bin/
[root@docker1 consul]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.233.11 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 23564
[root@docker1 consul]# netstat -antp | grep consul
[root@docker1 consul]# consul members
[root@docker1 consul]# consul operator raft list-peers
[root@docker1 consul]# curl 127.0.0.1:8500/v1/status/peers
[root@docker1 consul]# curl 127.0.0.1:8500/v1/status/leader
[root@docker1 consul]# curl 127.0.0.1:8500/v1/catalog/nodes
[root@docker1 consul]# curl 127.0.0.1:8500/v1/catalog/services
[root@docker1 consul]# yum -y install pcre-devel zlib-devel gcc gcc-c++ make
[root@docker1 nginx-1.22.0]# vim nginx.ctmpl
upstream test1 {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 8000;
server_name localhost 192.168.233.11;
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://test1;
}
}