consul原理简介
服务发现和治理
在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性
![97d30c24391186f88bddc1e7a7cf99cc.png](https://i-blog.csdnimg.cn/blog_migrate/10bbdaa75573becd1e61a702f0c711ac.jpeg)
- 服务发现以及注册:
当服务Producer 启动时,会将自己的Ip/host等信息通过发送请求告知 Consul,Consul 接收到 Producer 的注册信息后,每隔一段时间会向 Producer 发送一个健康检查的请求,检验Producer是否健康。
- 服务调用:
当 Consumer 请求Product时,会先从 Consul 中拿到存储Product服务的 IP 和 Port 的临时表(temp table),从temp table表中任选一个· Producer 的 IP 和 Port, 然后根据这个IP和Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔一段时间更新
consule 核心 agent组件
Agent是一个独立的程序,通过守护进程的方式,运行在consul集群中的每个节点上。每个Consul agent维护它自己的服务集合以及检查注册和健康信息。agent负责执行自己的健康检查和更新本地状态 其中,Agent 根据节点的性质,分为: Agent Server 和 Agent Client
- Agent Client
client将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
- Agent Server
server 保存client的注册信息,集群的配置信息, 维护集群高可用, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个,通过 Raft 算法来保证一致性。
概念简介
- CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。简单的说,client 处理健康检查,注册服务等,但是这个注册只是转发到server中,如果有成千上万的服务,分别启动多个client,可以减少server 压力
- SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
- SERVER-LEADER 中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
consul 通信接口
- RPC
用于内部通讯Gossip/日志分发/选主等
- HTTP API
服务发现/健康检查/KV存储等几乎所有功能, 默认端口为8500
- 2.3 Consul Commands (CLI)
consul命令行工具可以与consul agent进行连接,提供部分consul的功能。
实际上Consul CLI 默认就是调用的HTTP API来与consul集群进行通讯。
- 2.4 DNS
仅用于服务查询
例如: dig @127.0.0.1 -p 8600 web.service.consul
我们可以通过cosul提供的DNS接口来获取当前的服务“web”对应的可用节点
Consul 内部端口使用汇总
![fd01dbe82d780cf4d13cb1b171feab00.png](https://i-blog.csdnimg.cn/blog_migrate/5873e90c18cc9a5f491bb59cc1af9239.jpeg)
Consul 请求调用链路
![a94ec3edfe2e976cbdc4801fcd3d6247.png](https://i-blog.csdnimg.cn/blog_migrate/187b0331d9fcaff41bf123cb6996d7e3.jpeg)
consul 去中心化思想实现
consul 使用了基于gossip协议的Serf实现,Serf是一个服务发现,编配工具,它去中心化,不像集中式结构那样统一分配管理; Serf提供成员关系,纠错检查,广播等功能。gossip协议主要是基于UDP,实现任意node-to-node间的通信。Consul正是使用serf 提供的gossip协议来管理成员和广播消息到集群。
gossip 协议(gossip protocol)是基于流行病传播方式的节点或者进程之间信息交换的协议,来确保网络中所有节点的数据一样。其中节点间的交互方式主要以下有三种:
- Push:发起信息的节点 A 随机选择联系节点 B,并向B发送自己的信息,节点 B 在收到信息后,更新比自己新的数据,一般拥有新信息的节点才会作为发起节点。
- Pull:发起信息的节点 A 随机选择联系节点 B,并从对方获取信息。一般无新信息的节点才会作为发起节点。
- Push&Pull:发起信息的节点 A 向选择的节点 B 发送信息,同时从对方获取数据,用于更新自己的本地数据。
综述consul内部原理
![bfbfe8a2bbab1ead14d20f981dd90cd6.png](https://i-blog.csdnimg.cn/blog_migrate/23216fb74f460c207f17e8055baca856.jpeg)
1,服务器 Server1、Server2、Server3 上分别部署了 Consul Server, 组成了Consule集群,通过raft选举算法, server2成为leader节点。
2,服务器 Server4 和 Server5 上通过 Consul Client 分别注册 Service A、B、C,(服务A,B,C注册到 Consul 可以通过 HTTP API(8500 端口)的方式,也可以通过 Consul 配置文件的方式。)
3,Consul Client将注册信息通过 RPC 转发到 Consul Server,服务信息保存在 Server 的各个节点中,并且通过 Raft 实现了强一致性。
4,服务器 Server6 中 Program D 要访问 Service B,此时 Program D 先访问本机 Consul Client 提供的 HTTP API,Consul Client 会将请求转发到 Consul Server。Consul Server 查询到 Service B 并返回,最终 Program D 拿到了 Service B 的所有部署的 IP 和端口,根据负载均衡策略,选择Service B 的其中一个并向其发起请求。
如果服务发现采用的是 DNS 方式,则 Program D 中使用 Service B 的服务发现域名,域名解析请求首先到达本机 DNS 代理,然后转发到本机 Consul Client,consul Client 会将请求转发到 Consul Server。随后的流程和上述一直。
consul环境搭建
consul 安装
下载页面
https://www.consul.io/downloads.html
![abd55c0cd0eb306b562ad4e1994b6d8d.png](https://i-blog.csdnimg.cn/blog_migrate/a706ae19e6ed029fe079ffe09e58a91a.jpeg)
mac 下载版本
https://releases.hashicorp.com/consul/1.7.3/consul_1.7.3_darwin_amd64.zip
创建文件夹存放consul可执行文件
/Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin
![79fd6aab2b7e293451d2652a651df983.png](https://i-blog.csdnimg.cn/blog_migrate/fa26e4e09d94a5dd5e0830ad53c8916f.jpeg)
配置环境变量
sudo vim /etc/paths.d/user_mengfanxiao
![f701af82e6dedc388c436c4e32fdea0b.png](https://i-blog.csdnimg.cn/blog_migrate/405752373d7d510888b5a572f81b49a8.jpeg)
source /etc/profile
启动参数说明
- -dev 开发者模式 该节点的启动不能用于生产环境,因为该模式下不会持久化任何状态 该启动模式仅仅是为了快速便捷的启动单节点consul
- -ui 启动自有主机的界面
- -bootstrap-expect 1 集群节点,表示等待多少个节点再启动,这里是1个,一个就启动
- -bind=127.0.0.1 绑定IP ,本机IP地址,内网IP
- -advertise-wan=10.23.123.12 绑定外网ip
- -node=node1 节点名称,如果没有,默认是主机名
- -server 设置为服务端
- -data-dir /tmp/consul 数据存储目录为 /tmp/consul
- -datacenter=dc1 数据中心
启动
- agent可以运行在server或者client模式
consul agent -dev -server -bootstrap-expect 1 -data-dir /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/data -node=node1
![317cffb07cf069c1d12066b4641fc22e.png](https://i-blog.csdnimg.cn/blog_migrate/674d3bb787862edb6d87241b9c3e41c8.jpeg)
- 查看成员
consul members
![379d7c79040ab9b81bf868e80afdfc47.png](https://i-blog.csdnimg.cn/blog_migrate/a458469935893973074e0bbfa5e37743.png)
- 创建服务
mkdir -p /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d
1⃣️ 创建一个web服务
echo '{"service": {"name": "web", "tags": ["rails"], "port": 801}}' >/Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/web.json
2⃣️ 创建一个service2服务
echo '{"service": {"name": "service2", "tags": ["rails"], "port": 802}}' >/Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/service2.json
- 先关闭之前的代理
![46f7eb5afcecc765c956ca0eee42aa3a.png](https://i-blog.csdnimg.cn/blog_migrate/fe1beb9398dbefcaa79e1e5f45cbf1d3.png)
- 启动代理
consul agent -dev -config-dir /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/
![795c4ff677b8f23f339e2493d3971d03.png](https://i-blog.csdnimg.cn/blog_migrate/da42dc65be1becf7e6366764262b6424.jpeg)
- 通过DNS查询服务
服务的DNS名称是 NAME.service.consul 服务名称为service2、web
1⃣️ Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具
![109c0a5fbd88ddc45b30dfd80e12e489.png](https://i-blog.csdnimg.cn/blog_migrate/d7b6193c9160afb59764341ffbd2e23e.jpeg)
2⃣️
dig @127.0.0.1 -p 8600 service2.service.consul
![10727001bee0eee9c142280ab8f43d9a.png](https://i-blog.csdnimg.cn/blog_migrate/a659f848e22ccfe067ff693186ef0f04.jpeg)
- Http查询
curl http://localhost:8500/v1/catalog/service/service2
![86ddba132e8180afb5b32cf197f3a3f5.png](https://i-blog.csdnimg.cn/blog_migrate/8051df9feef6c746d36b27b493afe754.jpeg)
- 查询健康
curl 'http://localhost:8500/v1/health/service/service2?passing'
![f3997793b2de446fca82108c94ebc9d4.png](https://i-blog.csdnimg.cn/blog_migrate/2ce41b1f49b6e0b2e3bd3330d7c60e75.jpeg)
Consul Web界面
- 加入 -ui 参数, 启动自有主机的界面
consul agent -dev -ui -config-dir /Users/mengfanxiao/Documents/third_software/spring-cloud/consul/bin/consul.d/
![e0a085c3699753d8e3947f58a231134e.png](https://i-blog.csdnimg.cn/blog_migrate/4699052c8cdca585a2b460a840751c08.jpeg)
- 在浏览器访问 http://localhost:8500/ui
![85e0927bacdcee83fd591ebb434d7b31.png](https://i-blog.csdnimg.cn/blog_migrate/8b7b58caa41080a760ff75557c26bb63.jpeg)
Docker consul安装
consul 服务发现 集群 docker 版
下载镜像
docker pull consul
![52df96f6413c9c3482f050ae1145567f.png](https://i-blog.csdnimg.cn/blog_migrate/1c0df259c838d71581a7e7de15320e96.jpeg)
consul 服务端
- 服务端node1
docker run -d --name node1 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -node=node1 -bootstrap-expect=2
- 查看node1的ip
JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"
- 服务端node2
docker run -d --name node2 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -node=node2 -join $JOIN_IP
- 服务端node3
docker run -d --name node3 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -node=node3 -join $JOIN_IP
consul客户端
- 客户端node4
docker run -d --name node4 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -node=node4 -join $JOIN_IP
- 客户端node11 带ui
docker run -d --name node11 -p 8400:8400 -p 8500:8500 -p 8600:53/udp -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -ui -node=node11 -client=0.0.0.0 -join $JOIN_IP
![fe7b3844ffe42417152e6a5072c8de63.png](https://i-blog.csdnimg.cn/blog_migrate/24a06902b6940b4dc122b162bbe32875.jpeg)
- 上述操作的执行情况
![4ac571274838c40dd8108e7574b75861.png](https://i-blog.csdnimg.cn/blog_migrate/9b79f1bff1d6c3494f7a811513fcb6c7.jpeg)
- 把节点加入集群
在创建docker容器时忘记加入-join $JOIN_IP这个参数了,那么就可以用以下方法加入集群
1⃣️
docker exec node20 consul join $JOIN_IP
node20 要改为 你需要加的那个容器节点名字
2⃣️ 或者进入该容器内部执行
consul join $JOIN_IP
- 查看节点
docker exec node1 consul members
![118e34ac121227804d4e9cd86866e9e1.png](https://i-blog.csdnimg.cn/blog_migrate/1cb2b91655996569427d97a2a1f1ec9b.png)
参考文献
https://blog.csdn.net/fenglailea/article/details/79093848 https://blog.csdn.net/fenglailea/article/details/79098246 https://blog.csdn.net/jiangqingyao/article/details/92856466