前言 常见的注册中心有zookeeper 、eureka、consul、etcd。 从生态发展、便利性、语言无关性等角度来综合考量,选择consul,多数据中心支持,支持k-v能力,可扩展为配置中心。 github地址:https://github.com/hashicorp/consul consul官网:https://learn.hashicorp.com/consul consul特性 consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性: service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。 health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。 key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。 multi-datacenter:无需复杂的配置,即可支持任意数量的区域。 Consul架构 Consul的微服务一般都是集群,集群由一个个的Consul节点组成,在这些Consul节点里面,分为两种角色,Server 以及 Client。 consul节点在启动时可以定义自身角色,client、server两种。 client节点只负责转发外部请求,所有注册到当前节点的服务会被转发到server节点,向server节点进行键值对的读/写,本身是不持久化这些信息,是无状态的; server节点的职责是使用raft协议保证数据一致性,响应客户端的请求,维护集群状态,与其他数据中心交互,另外所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。 节点之间通过gossip广播协议(谣言协议),进行节点之间的数据交互,最终大家达到一致。 consul概念 Agent: Consul集群中长时间运行的守护进程,以consul agent 命令开始启动. 在客户端和服务端模式下都可以运行,可以运行DNS或者HTTP接口, 它的主要作用是运行时检查和保持服务同步。 Client: 客户端, 无状态, 以一个极小的消耗将接口请求转发给局域网内的服务端集群. Server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯. 每个数据中心的 server 数量推荐为 3 个或是 5 个. Datacenter: 数据中心,多数据中心联合工作保证数据存储安全快捷 Consensus: 一致性协议使用的是Raft Protocol RPC: 远程程序通信 Gossip: 基于 Serf 实现的 gossip 协议,负责成员、失败探测、事件广播等。通过 UDP 实现各个节点之间的消息。分为 LAN 上的和 WAN 上的两种情形。 consul安装及测试安装 linux下安装 (1)进入consul官网找到自己开发平台对应的安装包下载https://www.consul.io/downloads.html 或者wget https://releases.hashicorp.com/consul/1.5.1/consul_1.5.1_linux_amd64.zip (2)下载完后,解压,得到一个可执行文件consul (3)将这个文件移动到全局变量环境中   $ sudo mv consul /usr/local/bin/ (4)验证是否安装成功$ consul window下安装 (1)进入consul官网找到自己开发平台对应的安装包下载https://www.consul.io/downloads.html (2)下载完后,解压,得到一个可执行文件consul (3)将这个文件移动到全局变量环境中 (4)启动consul命令: consul agent -dev -ui -node=cy-dev:该模式不能用于生产环境,因为该模式下不会持久化任何状态,该启动模式仅仅是为了快速便捷的启动单节点consul,-node结点名为cy,-ui可以用界面访问,默认能访问。 测试地址http://localhost:8500 节点名称:这是代理的唯一名称。默认情况下,这是机器的主机名,但您可以使用该-node标志对其进行自定义 。 数据中心:这是配置代理运行的数据中心。每个节点都必须设置其它向数据中心报告。-datacenter 标志可用于设置数据中心。对于单DC配置,代理将默认为“dc1”。 服务器:这表明代理是以服务器还是客户端模式运行。Server: false (bootstrap: false),表示不是以服务器模式运行,事实上-dev是开发服务器模式。 客户端地址:这是用于代理的客户端接口的地址。这包括HTTP和DNS接口的端口。默认情况下,它只绑定到localhost。 群集地址:这是用于集群中的Consul代理之间通信的地址和端口集。并非所有集群中的Consul代理都必须使用相同的端口,但该地址必须可供所有其他节点访问。 consul agent常用命令解读 Consul集群 节点或五个server节点组一个集群,为什么是单数,因为集群需要选举一个leader来保证数据一致性。票数要超过半数以上才能选举为leader。 基本的命令为: consul agent -server -bind=10.0.xx.55 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1 复制代码 -server 表示是以服务端身份启动 -bind 表示绑定到哪个ip(有些服务器会绑定多块网卡,可以通过bind参数强制指定绑定的ip) -client 指定客户端访问的ip(consul有丰富的api接口,这里的客户端指浏览器或调用方),0.0.0.0表示不限客户端ip -bootstrap-expect=3 表示server集群最低节点数为3,低于这个值将工作不正常(注:类似zookeeper一样,通常集群数为奇数,方便选举,consul采用的是raft算法) -data-dir 表示指定数据的存放目录(该目录必须存在) -node 表示节点在web ui中显示的名称 -config-dir 配置文件目录,里面所有以.json结尾的文件都会被加载 复制代码 启动成功后,终端窗口不要关闭,可以在浏览器里,访问下,类似 http://10.0.xx.55:8500/,正常的话,应该会看到一行文字:Consul Agent。 为了防止终端关闭后,consul退出,可以在刚才命令上,加点东西,将其转入后台运行。类似: nohup xxx > /dev/null 2>&1 & 现在我们使用四台机器创建集群: 10.0.xx.55、10.0.xx.203、10.0.xx.204、10.0.xx.205 1.启动server端 复制代码 nohup consul agent -server -bind=10.0.xx.55 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1 > /dev/null 2>&1 & nohup consul agent -server -bind=10.0.xx.203 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server2 > /dev/null 2>&1 & nohup consul agent -server -bind=10.0.xx.204 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server3 > /dev/null 2>&1 & 复制代码 注意更改bind参数的ip,以及node参数里的节点名称 2.启动client端 几乎完全一样,只是把-server 去掉,在10.0.xx.205上运行: 复制代码 nohup consul agent -client=0.0.0.0 -data-dir=/data/application/consul_data/ -node=client1 -config-dir /etc/consul.d -ui > /dev/null 2>&1 & 复制代码 3.组建cluster 现在我们有了3个server node + 1个client node,但是这4个节点都是相互独立的,可以在任一节点上运行: consul members 可以看到,只有自身节点的信息。 要让自己加入集群,可以运行以下命令(假设:其它3个节点,都加入10.0.xx.205) consul join 10.0.xx.205 成功后,会输出: Successfully joined cluster by contacting 1 nodes. 其它2个节点(指:10.0.xx.205之外的节点)上类似上述操作,都加入集群中,完成后,可以再次验证 可以看到4台节点的信息都有了。 tips: 如果反过来,要将1个节点从集群中撤掉,可以在该节点上运行consul leave 即可。 服务注册/反注册 搭建好conusl集群后,用户或者程序就能到consul中去查询或者注册服务。 可以通过提供服务定义文件或者调用HTTP API来注册一个服务。 1.服务定义文件 在10.0.xx.205的/etc/consul.d/目录下创建一个web.json文件,内容如下: 复制代码 { "ID": "nginx1", "Name": "nginx", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 80, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": “12h", "HTTP": "http://localhost:5000/health", "Interval": "1s" } } 复制代码 2.调用HTTP API postman(或其它rest api工具、curl都行),向 http://10.0.xx.205:8500/v1/agent/service/register ,发送以下json,http method指定为PUT, Content-Type指定为application/json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 { "ID": "nginx1", "Name": "nginx", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 80, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": “12h", "HTTP": "http://localhost:5000/health", "Interval": "1s" } } 最常用的命令和接口api refer: https://cloud.tencent.com/developer/article/1033169 https://www.cnblogs.com/yjmyzz/p/replace-eureka-with-consul.htmlhttps://www.cnblogs.com/-wenli/p/11966787.html