微服务(容器)注册与发现:是一种分布式的管理系统,定位服务的方法。
在传统架构当中,应用程序之间直连到已知服务,设备提供的网络:IP地址,基于tcp/ip,端口;在现代的服务部署,服务的动态性,数量增加,传统的基于IP+端口的形式已经不太适用。
服务注册以及发现:微服务的位置信息(ip+端口+健康状态)统一注册到一个中心化的服务注册表中,可以允许其他服务动态的查询和发现这些服务。
数据流程图
服务注册:当一个服务启动时,会把自己的元数据(ip 端口 服务名称 健康状态)注册到服务注册表中。这个注册表的服务(consul zookeeper),也可以在平台部署。
服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(ip+端口),这样的话可以直接在服务注册表中服务注册表中,直接获取我要的信息,不需要到静态配置查看了。
服务注册与发现和其他工具配合使用,负载均衡,健康检测,配置管理(一键同步)。微服务架构中非常重要的组件。
服务注册于发现的优点:
动态性 | 可以在运行时动态添加和移除服务,不需要额外的人工操作和配置。 |
弹性 | 一旦某个服务不可用,注册表可以及时更新,通知通知其他服务避免请求的失败。 |
可扩展 | 适应不断变化的服务数量。 |
服务方调用时,透明性 | 前端和后端实现解耦。 |
consul
consul:服务自动注册和发现的。
consul时HashiCrop公司开发的一套工具,主要用于服务发现与注册,配置管理,分布式的协调协调。
consul的主要特点:
1、服务自动注册和发现,位置信息(ip和端口+服务名称+健康状态)
2、健康检测,服务注册到consul,一旦加入系统的还有他的健康状态,定期发送一个心跳检查,如果服务挂了,consul会自动移除。
3、分布式锁: consul提供了一个分布式锁的功能,协调多个节点之间的操作,放在竞争条件和数据冲突。
每一个服务的发现和注册都是一个会话(session) |
微服务在注册到consul的时候,consul会和这个服务的会话创建一个锁,用锁来标识具体的服务器,会话和锁之间关联。 |
获取锁: 微服务2,建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已经有其他服务占用,会给分配一个新的锁(kv存储) |
释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系。删除与锁关联的键,实现资源的释放。 |
4、KV存储:key-value分布式键值对存储系统,存储配置信息、锁、服务的特性。应用程序可以使用consul的键值对信息来动态地获取配置信息。
5、多数据中心注册:可以部署在多个低于部署,可以数据中心的发现和注册功能。
6、DNS和HTTP API:通过域名解析定位服务位置。http api:通过api用于接口,可以调用consul的信息。服务信息,健康检查等等。
7、时间通知,如有关键信息可以随时通知。
查看集群server成员
curl 127.0.0.1:8500/v1/status/peers
集群 server-leader
curl 127.0.0.1:8500/v1/status/leader
注册的所有服务
curl 127.0.0.1:8500/v1/catalog/services
查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nginx
集群节点详细信息
curl 127.0.0.1:8500/v1/catalog/nodes
consul的部署和发现
consul服务器 | docker1 192.168.10.201 | consul docker-ce nginx 进制 consul-template (自动发现和自动配置) |
registrator服务器 | docker2 192.168.10.202 | 运行注册机制和微服务(容器) |
consul服务器···多节点 | docker3 192.168.10.204 | (加入到consul的集群中) |
192.168.10.201
mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd 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=192.168.10.201 -client=0.0.0.0 -node=consul-server01 &> /var/log/consul.log &
ss -antp | grep consul
consul agent: 启动 Consul Agent。-server: 指定该节点是 Consul 集群中的服务器节点。Consul 使用 Raft 算法来实现分布式一致性,服务器节点是集群的成员。-bootstrap: 表示该服务器节点是引导节点(bootstrap)。在集群的启动阶段,需要有一个引导节点,
它将启动 Raft 领导者选举过程。在生产环境中,通常只有一个服务器节点配置为引导节点。在引导完成后,其他服务器节点会加入集群。-ui: 启动 Consul 的用户界面(UI),使你可以通过浏览器访问 http://192.168.233.40:8500 来查看和管理 Consul 的状态和配置。-data-dir=/var/lib/consul-data: 指定 Consul 存储数据的目录路径。-bind=192.168.233.40: 指定 Consul 绑定的 IP 地址。该地址用于节点间的通信。-client=0.0.0.0: 允许所有 IP 地址的客户端连接到 Consul。这是一个开发或测试环境中的设置。
在生产环境中,通常会限制只允许特定 IP 地址的客户端连接。-node=consul-server01: 指定 Consul 节点的名称。每个节点在集群中都有唯一的名称。&> /var/log/consul.log: 将 Consul 的日志输出到 /var/log/consul.log 文件中。&: 在后台运行 Consul Agent。
启动consul后默认会监听5个端口:
8300: 用于Raft协议的端口。Consul使用Raft算法进行分布式一致性,这个端口用于处理复制、领导者选举等。8301: 用于LAN Gossip的端口。LAN Gossip是Consul中用于在局域网内进行节点间通信和信息传播的协议。8302: 用于WAN Gossip的端口。WAN Gossip用于在广域网(WAN)中进行节点间的通信和信息传播。8500: 用于Web UI的端口。Consul提供一个用户界面,可以通过这个端口访问,用于可视化地查看和管理Consul的集群状态。8600: 用于DNS查询的端口。Consul提供DNS接口,可以通过这个端口进行DNS查询,以获取节点和服务的信息。
192.168.10.202
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.10.202 \
consul://192.168.10.201:8500docker run -itd -p 81:80 --name test-1 -h test1 nginx
docker run -itd -p 82:80 --name test-2 -h test2 httpd
consul-template
192.168.10.201
consul operator raft list-peers
curl 127.0.0.1:8500/v1/catalog/services
配置template nginx模板文件
upstream http_backend {{{range service "nginx"}}server {{.Address}}:{{.Port}};{{end}}
}
server {listen 8000;server_name localhost 192.168.10.201;access_log /var/log/nginx/kgc.com-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;}
}
安装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 installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost//创建日志文件目录
mkdir /var/log/nginx//启动nginx
nginx4. 配置并启动 template
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/consul-template --consul-addr 192.168.10.201:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
创建容器
docker run -itd -p 84:80 --name test-4 -h test4 nginx
查看轮询
cat /usr/local/nginx/conf/vhost/test.conf
consul多节点
192.168.10.204
mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd consul/
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/local/bin/consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.204 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.10.201 &> /var/log/consul.log &
加入集群
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.10.202 \
consul://192.168.10.201:8500
实现与01同步