目录
是一种分布式管理系统,定位服务的方法,在传统架构中,应用程序之间直连到已知的服务,设备提供的网络:IP地址,基于tcp/ip:端口
由于现代微服务部署,服务的动态性,数量增加了,传统的基于IP+端口的形式已经不太适用
服务注册以及发现:微服务的位置信息(IP+端口+健康状态)统一注册到一个中心化的服务注册表中,可以允许其他服务动态的查询和发现这些服务
1、服务注册:当一个服务启动时,会把自己的元数据(IP端口 服务名称 健康状态)统一注册到服务注册表中,这个注册表的服务(consul,zookeeper),也可以在云平台部署
2、服务发现:其他服务需要和这个服务通信时,只需要向注册表位置信息(IP+端口),这样的话可以直接在服务注册表中,直接获取我要的信息,不需要到静态配置查看了
1、动态性,可以在运动时动态添加和移除服务,不需额外的人工操作和配置
2、弹性:一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求的失败
3、可扩展:适应不断变化的服务数量
4、服务方调用时,透明性,前端和后端实现解耦
服务注册与发现机制和其他的工具配合使用,负载均衡,健康检查,配置管理(一键同步)
consul是HashiCrop公司开启的一套工具,用于实现服务与注册,配置管理,分布式的系统协调
1、服务发现与自动注册,位置信息(IP+端口+服务名称)
2、健康检查,服务注册到consul,一并加入系统的还有他的健康状态,定期发送一个心跳检查,如果服务挂了,consul会自动移除
3、分布式锁 consul提供了一个分布式锁的功能,协调多个节点之间的操作,防止竞争条件和数据冲突
1、每一个服务的发现和注册都是一个会话session
创建锁 微服务在注册到consul的时候,consul会和这个服务的会话创建一个锁,锁用来标识具体的服务器,会话和锁之间关联
获取锁:微服务2,建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他的服务在占用,会给你分配一个新的锁(KV存储)
释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系,删除与锁关联的键,实现资源的释放
4、KV存储 key-value分布式的键值对存储系统,存储配置信息,锁,特性,应用程序可以使用consul 的键值对信息来动态的获取配置信息
5、多数据中心支持,consul可以在多个地域,可以数据中心之间的发现和注册功能
6、DNS和Http API Consul支持DNS接口,通过域名解析定位服务的位置,Http api 通过api应用接口,可以调用Consul的信息,服务信息,健康检查等等
7、事件信息,如有关键信息可以随时获取通知
Consul服务器:docker1 20.0.0.31 组件 Consul docker-ce nginx二进制 Consul-temple(自动发现和自动配置)
registrator服务器:docker2 20.0.0.32 运行注册机制和微服务(容器)
Consul服务器:多节点 docker3 20.0.0.33 加入到Consul的集群中
所有服务关闭防火墙和安全机制
把Consul包拖到opt目录下
mkdir consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd /opt/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.31 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
consul agent 开启监听服务
-server 指定集群当中的服务器节点,consul的RAFT算法实现分布式结构中节点的一致性,集群当中的成员,直接成为集群的leader,后续加入的服务器都是follower
-bootstrap 表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导,加入集群
-ui 启动图形化界面
-data-dir=/var/lib/consul-data consul存储数据的路径
-bind=20.0.0.31 服务端绑定的IP地址,节点当中通信
-client=0.0.0.0 客户端的地址,所有主机都可以和server建立通信(生产中是指定的服务器)
-node=consul-server01 指定consul节点的名称,在集群当中consul节点名称都是唯一的,不可以重复的
& >/var/log/consu.log 混合重定向输出到consul.log
& 后台运行
netstat -antp | grep 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
查看集群的领导者
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
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.32 \
consul://20.0.0.31:8500
/var/run/docker.sock:/tmp/docker.sock \
docker.sock的是docker守护进程的UNIX的套接字文件,把它映射到容器中,registrator容器可以监听dockerdev所有事件,并且完成自动注册服务
--ip=20.0.0.32 注册在consul的IP地址
consul://20.0.0.31:8500 所有发现的服务都注册到指定server节点
docker run -itd -p 81:80 --name tets-1 -h test1 nginx
docker run -itd -p 82:80 --name tets-2 -h test2 httpd
页面访问
consul-template
是hashiCrop 公司开发的一个工具,用于consul集成,自动更新配置文件,实现配置配置管理的自动化
1、动态的配置更新 consul-template监控当中key-vlaue的键值对,键值对发生变化,会自动更新配置文件,无需重启服务
2、支持多种后端的模版:nginx配置,ETCD等等
docker1
cd /opt/consul
vim nginx.ctmpl
upstream test1 {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 8000;
server_name localhost 20.0.0.31;
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://http_backend;
}
}
在这个配置当中, {{range service "nginx"}} test1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务
server {{.Address}}:{{.Port}}; 将发现和注册的nginx服务的IP地址和端口,添加到test1的upstream的方法当中
安装依赖环境
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
把nginx的源码包拖到opt目录下
解压
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
重启服务
查看端口
cd /usr/local/nginx/conf
vim nginx.conf
18行
include vhost/*.conf;
nginx -t
mkdir /usr/local/nginx/conf/vhost
mkdir /var/log/nginx
nginx -s stop
netstat -antp | grep 80
nignx
netstat -antp | grep 80
把源码拖到opt目录下
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
mv consul-template /uar/local/bin
consul-template --consul-addr 20.0.0.31: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.31: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 只要集群中服务发生变化,可以随时更新到配置当中
consul是一个中间件 nginx服务通过consul-template获取模版,方向代理,consul-template---consul来获取注册表服务的IP和端口,然后nginx调用发现的服务来实现负载均衡
docker2?
docker1
cat /usr/local/nginx/conf/vhost/test.conf
把Consul包拖到opt目录下
mkdir consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd /opt/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=20.0.0.33 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.31 &> /var/log/consul.log &
-enable-script-checks=true \ 设置检查服务为可用,他也可以发现源集群当中的服务
-datacenter=dc1 加入到31的数据中心
-join 20.0.0.31 加入到已有的集群当中去
页面访问
docker3 同步docker1
docker2
docker run -d \
> --name=registrator1 \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> --ip=20.0.0.32 \
> consul://20.0.0.33:8500