🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **consul原理与实战** ### **1. consul简介:** >[] consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与 发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其 他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要 运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以 保证数据安全,同时保证server-leader的选举能够正确的进行。 **类似的工具还有:ZooKeeper,etcd等等。** ***** ### **2. 为什么使用服务发现:** * 防止硬编码、容灾、水平扩缩容、提高运维效率等等,只要你想使用服务发现总能找到合适的理由。 * 一般的说法是因为使用微服务架构。传统的单体架构不够灵活不能很好的适应变化,从而向微服务架构 进行转换。 * 而伴随着大量服务的出现,管理运维十分不便,于是开始搞一些自动化的策略,服务发现应运而生。所 以如果需要使用服务发现,你应该有一些对服务治理的痛点。 * 但是引入服务发现就可能引入一些技术栈,增加系统总体的复杂度,如果你只有很少的几个服务,比如 10 个以下,并且业务不怎么变化,吞吐量预计也很稳定,可能就没有必要使用服务发现。 ***** ### **3. consul工作原理** 掌握原理前,需了解下consul的组成结构,即多数据中心 ![](https://img.kancloud.cn/e9/0c/e90c5c7f95e5e3281b2bc055d57980f0_625x629.png) **集群中的特性功能:** * 节点角色:leader(领导者)、Follower(跟随者) * consul节点身份:server、client * Agent:即节点内包含的一个后台处理程序 * 健康检查:由client的Agent来进行健康检查的功能 首先 Consul 支持多数据中心,在上图中有两个 DataCenter,他们通过 Internet 互联,同时请注意为了提高通信效率,只有 Server 节点才加入跨数据中心的通信。 ***** 在单个数据中心中,Consul 分为 Client 和 Server 两种节点(所有的节点也被称为 Agent),Server 节点保存数据,Client 负责健康检查及转发数据请求到 Server。 ***** Server 节点有一个 Leader 和多个 Follower,Leader 节点会将数据同步到 Follower,Server 的数量推荐是 3 个或者 5 个,在 Leader 挂掉的时候会启动选举机制产生一个新的 Leader。 ***** 集群内的 Consul 节点通过 gossip 协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是 Client 还是 Server。 ***** 单个数据中心的流言协议同时使用 TCP 和 UDP 通信,并且都使用 8301 端口。跨数据中心的流言协议也同时使用 TCP 和 UDP 通信,端口使用 8302。 ***** 集群内数据的读写请求既可以直接发到 Server,也可以通过 Client 使用 RPC 转发到 Server,请求最终会到达 Leader 节点。 ***** 在允许数据轻微陈旧的情况下,读请求也可以在普通的 Server 节点完成,集群内数据的读写和复制都是通过 TCP 的 8300 端口完成。 ***** ### **4. consul服务发现原理** ![](https://img.kancloud.cn/95/aa/95aa5e5536abdbd149fe02a258c1ec74_766x433.png) 首先需要有一个正常的 Consul 集群,有 Server,有 Leader。这里在服务器 Server1、Server2、Server3 上分别部署了 Consul Server。 ***** 假设他们选举了 Server2 上的 Consul Server 节点为 Leader。这些服务器上最好只部署 Consul 程序,以尽量维护 Consul Server 的稳定。 ***** 然后在服务器 Server4 和 Server5 上通过 Consul Client 分别注册 Service A、B、C,这里每个 Service 分别部署在了两个服务器上,这样可以避免 Service 的单点问题。 ***** 服务注册到 Consul 可以通过 HTTP API(8500 端口)的方式,也可以通过 Consul 配置文件的方式。 ***** Consul Client 可以认为是无状态的,它将注册信息通过 RPC 转发到 Consul Server,服务信息保存在 Server 的各个节点中,并且通过 Raft 实现了强一致性。 ***** 最后在服务器 Server6 中 Program D 需要访问 Service B,这时候 Program D 首先访问本机 Consul Client 提供的 HTTP API,本机 Client 会将请求转发到 Consul Server。 ***** Consul Server 查询到 Service B 当前的信息返回,最终 Program D 拿到了 Service B 的所有部署的 IP 和端口,然后就可以选择 Service B 的其中一个部署并向其发起请求了。 ***** 如果服务发现采用的是 DNS 方式,则 Program D 中直接使用 Service B 的服务发现域名,域名解析请求首先到达本机 DNS 代理,然后转发到本机 Consul Client,本机 Client 会将请求转发到 Consul Server。 ***** Consul Server 查询到 Service B 当前的信息返回,最终 Program D 拿到了 Service B 的某个部署的 IP 和端口。