Consul 是 HashiCorp 公司提供一个服务网格解决方案,具有服务发现、配置管理登功能。本文主要介绍下 Consul 的基本概念。
1、Consul 的特点
服务发现(Service Discovery):客户端在 Consul 注册为服务,其他客户通过 Consul 获取服务的提供方;通过 DNS 或 HTTP 的方式,应用可以很容易的找到它所依赖的服务。
健康检查(Health Checking):Consul 客户端可以提供任意数量的运行状况检查,这些检查可以与给定服务相关联("Web 服务器是否返回 200 OK"),也可以与本地节点("内存利用率是否低于 90%")相关联。可以使用此信息来监视群集运行状况,服务发现组件可以使用此信息将流量从运行状况不佳的主机路由出去。
Key/Value 存储:应用可以将 Consul 的键/值存储用于任意目的,包括动态配置、功能标记、协调、领导者选举等;简单的 HTTP API 使其易于使用。
安全服务通信:Consul 可以为服务生成 TLS 证书,以建立 TLS 连接。意图可用于定义允许哪些服务进行通信。服务分割可以轻松管理,其意图可以实时更改,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心:Consul 支持开箱即用的多个数据中心;这意味着 Consul 的用户不必担心需要构建额外的抽象层来扩展到多个区域。
2、Consul 架构
上图中有两个 DataCenter,他们通过 Internet 互联;为了提高通信效率,只有 Server 节点才加入跨数据中心的通信。
在单个数据中心中,Consul 分为 Client 和 Server 两种节点(所有的节点都是 Agent),Server 节点保存数据,Client 负责健康检查及转发请求到 Server;Server 节点有一个 Leader 和多个 Follower,Leader 节点会将数据同步到 Follower,Server 的数量推荐是 3 到 5 个,在 Leader 挂掉的时候会启动选举机制产生一个新的 Leader。集群内的节点通过 gossip 协议维护成员关系,某个节点需了解集群内还有其他哪些节点,这些节点是 Client 还是 Server。单个数据中心的 gossip 协议同时使用 TCP 和 UDP 通信,并且都使用 8301端口。跨数据中心的 gossip 协议也同时使用 TCP 和 UDP 通信,端口使用 8302。
集群内数据的读写请求可以直接发到 Server,也可以通过 Client 转发到 Server,请求最终会到达 Leader 节点;在允许数据轻微陈旧的情况下,读请求也可以在普通的 Server 节点完成,集群内数据的读写和复制都是通过 TCP 的 8300 端口完成。 相关名词说明: Gossip:Gossip protocol 也叫 Epidemic Protocol,是基于流行病传播方式的节点或者进程之间信息交换的协议,在分布式系统中被广泛使用,比如我们可以使用 gossip 协议来确保网络中所有节点的数据一样。gossip protocol 最初是由施乐公司帕洛阿尔托研究中心(Palo Alto Research Center)的研究员艾伦·德默斯(Alan Demers)于 1987 年发明的。 Client:Client 是一个转发所有 RPC 请求到 server 的代理,client 是相对无状态的;client 唯一执行的后台活动是加入 LAN gossip 池,该活动使用很低的资源且仅消耗少量的网络带宽。 Server:Server 是一个有一组扩展功能的代理,这些功能包括参与 Raft 选举,维护集群状态,响应 RPC 查询,与其他数据中心交互 WAN gossip 和转发查询给 leader 或者远程数据中心。 DataCenter:数据中心为一个私有的,低延迟和高带宽的一个网络环境。 LAN Gossip:它包含所有位于同一个局域网或者数据中心的所有节点。 WAN Gossip:它只包含 Server;这些 Server 分布在不同的数据中心并且通常通过因特网或者广域网通信。 RPC:远程过程调用。3、Consul 使用场景
服务发现:consul 作为注册中心,服务地址被注册到 consul 中以后,可以使用 consul 提供的 dns、http 接口查询,consul支持health check。
服务隔离:consul 支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持 tls 证书分发,service-to-service加密。
配置管理:consul 提供 key-value 数据存储功能,并且能将变动迅速地通知出去,借助 Consul 可以实现配置共享。
4、Consul 服务发现原理
服务发现的脚本原理如下:
A、在服务器 Server1、Server2、Server3 上部署了 Consul Server,服务器 Server4 、Server5、Server6 上部署了 Consul Client,它们组成了一个 Consul 集群。
B、Service A、Service B、Service C 部署在 Server4 和 Server5 并注册到 Consul 上,其他的服务可以发现这三个服务;服务部署在两台 Server 上,避免了单点故障。
C、Service D 需要访问 Service B,首先访问本机的 Consul Client,Consul Client 会将请求转发到 Consul Server,Consul Server查询到 Service B 的信息返回;最终 Service D 拿到了 Service B 的所有部署的IP 和端口,然后就可以选择其中一个发起请求了。
参考:https://juejin.cn/post/6844904003764125703