简介

之前公司一直用的是Eureka 1.X版本,但是自从SpringBoot升级到2.X版本后Eureka团队对外宣布不再开源且Eureka 2.X版本不在维护,这就一下子懵逼了,开始寻找Eureka的替代方案,最终选择使用Consul进行服务发现以及服务管理。

网上有很多关于Consul的介绍和对比,我这里也不献丑了,大家搜索的时候可能会经常看到这么一个表格,此表格采摘自:https://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/

FeatureConsulzookeeperetcdeuerka
服务健康检查服务状态,内存,硬盘等(弱)长连接,keepalive连接心跳可配支持
多数据中心支持
kv存储服务支持支持支持
一致性raftpaxosraft
capcacpcpap
使用接口(多语言能力)支持http和dns客户端http/grpchttp(sidecar)
watch支持全量/支持long polling支持支持 long polling支持 long polling/大部分增量
自身监控metricsmetricsmetrics
安全acl /httpsaclhttps支持(弱)
spring cloud集成已支持已支持已支持已支持

下载并配置Consul

我这里是直接使用的虚拟机进行配置Consul,系统是CentOS 7,Consul的安装和配置其实网上也是有一堆教程,这里简单的介绍一下,Consul的下载地址(https://www.consul.io/downloads.html),根据需要选择不同的包:

下载Consul的ZIP包以及使用unzip进行解压,这里简单贴几个命令:

$ wget https://releases.hashicorp.com/consul/1.2.0/consul_1.2.0_linux_amd64.zip
$ yum install unzip
$ unzip consul_0.7.2_linux_amd64.zip
$ mv consul /usr/local/bin/consul

到此,就可以在控制台中输入consul,然后看到有如下打印结果,即代表正常:

开始配置,consul默认有如下几种Mode:

  1. dev ,快捷配置,一般用于调试模式
  2. server,服务器
  3. client,客户端

学习Consul的时候,会有很多教程可能为了快速的入门,所以在配置Consul的时候,直接使用了dev模式,我个人觉得使用这个模式没什么意思,因为使用这个dev效果就跟单机模式是一样的,我们这里是学习分布式架构的,所以不采用。

剩下的还有server模式以及client模式,server模式好理解,在我们搭建的集群中,都是使用此模式。可是client模式主要是用来做什么呢?先看一眼下面的图片:

 

上面的图片大致的意思就是有一个server集群,然后如果我们的服务想要加入server集群,就必须要通过client来进行rpc调用。(这个是我的理解,大家可以进行补充)

大致理解了这么一个结构之后,我们开始进行集群的配置,我这里通过虚拟机进行模拟,有如下几台机器:

  1. 192.168.125.118     server1(集群服务器)
  2. 192.168.125.121    server2(集群服务器)
  3. 192.168.125.120    server3(集群服务器)
  4. 192.168.125.119    client(客户端)

三个做集群服务器,还有一个是客户端,集群服务器是由一个CentOS的虚拟机以及其两个拷贝组成,客户端我是在我的笔记本上装了一个Ubuntu的操作系统来实现的。

大致结构了解了之后,我们开始进行配置:

集群服务器的配置分别为:

$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118
$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server2 -client=0.0.0.0 -bind=192.168.125.121 
$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server3 -client=0.0.0.0 -bind=192.168.125.120

简单说一下几个配置:

  • agent                      Consul的核心命令,主要作用有维护成员信息、运行状态检测、声明服务以及处理请求等
  • -server                    就是代表server模式
  • -ui                           代表开启web 控制台
  • -bootstrap-expect        代表想要创建的集群数目,官方建议3或者5
  • -data-dir                       数据存储目录
  • -node                           代表当前node的名称
  • -client                          应该是一个客户端服务注册的地址,可以和当前server的一致也可以是其他主机地址,系统默认是127.0.0.1
  • -bind                            集群通讯地址

上述命令执行完成之后,开始将这些分散的服务器组成集群,命令如下,分别在192.168.125.121和192.168.125.120机器上执行:

$ consul join 168.168.125.118

这里我执行了这个命令之后,得到报错信息,信息大致如下:

Failed to join 192.168.125.118:dial tcp 192.168.125.118:8301:connect:no route to host(这里大致文字描述一下,方便搜索)

 查询了一下,之所以出现这个情况是因为CentOS的防火墙,将8301端口加入防火墙就好了,命令大致如下:

$ firewall-cmd --zone=public --add-port=8301/tcp --permanent
$ firewall-cmd --reload    /*必须添加,否则重启之后会失效*/

再次执行加入集群命令,出现以下问题:

consul: Failed to confirm peer status for server2: rpc error getting client: failed to get conn: dial tcp 192.168.125.120:0->192.168.125.121:8300: connect: no route to host. Retrying in 1s...

产生这个的原因和上面的一致,加入集群需要和8300端口进行通讯,所以再次将8300端口加入防火墙,这里再说一下,再把8500端口也加入防火墙,因为这个端口是web控制台使用的。

再次执行加入集群命令,再次报错,因为是虚拟机,而且我是克隆的,后面发现在执行这些命令之后,会有如下提示:

* Failed to join 192.168.125.118: Member 'server1' has conflicting node ID 'b76ff298-accd-05ff-8c64-5d79d866dfa9' with this agent's ID

通过查询,网上给出的两个解决办法分别如下:

一是在启动agent的时候加入-disable-host-node-id参数,禁止生成node-id。类似这样:

$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118 -disable-host-node-id

二是可以用-node-id生成一个新的node-id,类似这样:

$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118 -node-id=$(uuidgen | awk '{print tolower($0)}')

上面两种方法我都试过,但是都不好使,应该是因为这个node-id已经存在于数据存储目录(即/tmp/consul),名字就叫node-id,使用vi或者vim打开之后可以看到一个guid格式的信息,这里保存的就是node ID的信息,无奈,我只能删除这个文件,然后重新启动命令,得到正常的反馈信息。

至此服务器集群搭建以及配置完成,打开WEB界面如下:

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐