目录
1、Consul是什么
1.1概念
consul是 HashiCorp 公司推出的一个开源服务注册发现工具,核心功能包含:健康检查,多数据中心,key/value存储等。主要用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案相比,Consul的使用比较简单。consul是使用Go语言实现,所以具有可移植性,安装包仅仅是一个可执行文件,方便安装,与Docker等轻量级容器可无缝配合 。
1.2 Consul下载
consul官网地址:www.consul.io
consul介绍:Consul Documentation | Consul | HashiCorp Developer
consul下载地址:Install | Consul | HashiCorp Developer
可以根据自己平台选择下载不同平台的安装包,这里就选择下载windows版本的。
下载后是一个压缩文件,解压后是一个exe文件。命令行进入到该exe文件的文件夹下(文件路径不要有中文。)或者直接该文件夹下输入cmd命令回车。(如果不想每次都进入该目录可以将该路径配置进环境变量的path路径即可。)
1.3 Consul启动
启动方式有两种:
1)本地开发模式
consul agent -dev # 以开发模式启动,但UI无法正常显示
consul agent -dev -client 0.0.0.0 -ui # 以开发模式启动,UI可正常显示
2)集群模式
consul agent -service # 以服务器的模式启动(需要集群)
启动consul服务后,浏览器输入:http://localhost:8500,显示如下界面。说明consul启动成功。
1)service表示当前注册的服务。默认consul server启动的同时注册自己,所以一开始就有一个consul服务。
2)nodes表示consul的集群节点。
3)dc1表示数据中心名称,默认是dc1(datacenter的缩写),可以通过下述命令启动时修改默认的数据中心名称:
# 启动时自定义数据中心名称
consul agent -dev -client=0.0.0.0 --datacenter=xintu
综上,consul下载安装并且启动完成之后就可以开发对应的微服务,然后在consul中进行服务注册了。
2、Consul使用场景
1))docker 实例的注册与配置共享
2)coreos 实例的注册与配置共享
3)vitess 集群
4)SaaS 应用的配置共享
5)与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件
3、Consul优势
使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft. 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持. 支持健康检查. etcd 不提供此功能. 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议. 官方提供web管理界面, etcd 无此功能.
4、Consul架构及原理
4.1 整体架构图
Consul集群可以分布为: Leade节点、Follower和Candidate节点。Leader节点时集群的主节点,主要复制处理所有的写操作。而Follower节点属于集群的从节点,负责处理所有的写操作。Candidate节点时一个准备成为leader的节点,它会参与选举过程,以确定下一个Leader节点。
4.2 通讯机制
Consul集群中的节点通过RPC协议进行通讯。当一个节点需要向集群中的其他节点发送消息时,它会将消息发送到Leader节点。Leader节点会将消息广播到所有的Follower节点。当Follower节点接受到消息时,它会将消息存储到本地,并向Leader节点发送确认消息。
当Leader节点收到大多数Follower节点的确认消息时,它会认为消息已经被处理成功,并将结果返回给发送方。
4.3 健康检测
Consil集群中的节点之间还会定期进行心跳检测,以确保节点之间的连接正常。如果一个节点长时间没有收到其他节点的心跳消息,它会认为其他节点已经宕机,并将其从集群中移除。
4.4如何保证数据一致性
Consul一致性协议采用 Raft 算法,用来保证服务的高可用. Raft是一种分布式一致性算法,用于保证多个节点之间数据的一致性。Consul使用Raft算法包确保集群中所有节点都具有相同的状态。这意味这当一个节点发生故障时,其他节点可用接管它等待工作,以确保服务的连续性。
5、搭建Consul环境
5.1 本地Consul搭建
接着上一节内容,我们直接在原有项目新建一个module, 命名为:springcloud-clientconsul-discovery。
新建完成后,在该module的pom.xml文件中,添加依赖如下,
<!--引入consul依赖,用于服务注册发现-->
<!--Consul Discovery-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--引入健康检查的依赖,用于健康检查监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
添加启动类,代码如下,
package com.xintu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //代表这是服务注册中心的一个客户端,通用的服务注册注解 可以表示consul、zk、nacos 具体根据导入的依赖判断
public class SpringBootConsulClientApp {
public static void main(String[] args) {
SpringApplication.run(SpringBootConsulClientApp.class, args);
}
}
添加YML配置:
server:
port: 8085 # 服务端口
#向consul server 服务注册地址
spring:
application:
name: consulclient #指定服务名称
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
register-health-check: false #健康检查设置,默认是true,可以设置为false。但是同理不建议在生成环境关闭
执行启动类,打开consul管理界面,显示如下,
表示服务已经注册成功了。
总结:通过上述过程,则使用consul作为服务注册中心并且进行服务注册和服务发现的开发完成了。目前主流的服务注册中心有:eureka、nacos、consul、zookeeper。
5.2 集群Consul搭建
要想利用Consul提供的服务实现服务的注册与发现,我们需要搭建Consul Cluster 环境。
在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。
Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。
以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。
与本地安装配置相比较,主要流程基本类似。集群模式下,需要注意三点:
以Linux版本为例,安装参考官网即可。https://developer.hashicorp.com/consul/downloads。
可以直接使用命令安装,或者下载zip包均可。
5.2.1 安装Consul
命令安装:
#sudo yum install -y yum-utils shadow-utils
#sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
#sudo yum -y install consul
Zip包下载,
5.2.2 启动各 Consul Server节点
如果是zip方式,需要cd到consul.sh目录,以命令参数方式启动:
./consul agent -server -bootstrap-expect 2 -data-dir /etc/consul.d -node=节点名称 -bind=主机IP -datacenter=xintu-ui -client=0.0.0.0 &
各参数说明:
-server: 表示为consul服务节点。
-bootstrap-expext 2: 表示集群中至少有2台节点正常当前节点则可以正常工作。
-data-dir: 当前节点的数据存放位置。
-node: 表示当前节点名称。
-bind: 为当前容器环境的ip地址。
-datacenter:为节点的数据中心。
-client:为可以访问当前节点的ip信息。 #0.0.0.0 表示所有
&: 表示后台运行。
5.2.3 组成集群服务
前面各服务启动成功后,需要将所有节点组成一个集群模式。其中一台机器作为临时主节点,其余机器作为从节点。比如有192.168.17.128,192.168.17.129, 192.168.17.130三台机器。现在192.168.17.128作为主节点,129和130作为从节点。此时需要在129和130机器上,分别执行命令 ./consul join 192.168.17.128 ,意思是将该两台节点和128主机组成集群服务。 组成集群后,可以使用命令consul members 查集群成员信息。
5.3 集群模式-Client配置
5.3.1 启动Client
启动命令如下,
./consul agent -client=0.0.0.0 -data-dir /etc/consul.d -datacenter=dc-bind=192.168.17.1 -node=client-1
说明:这里的ip: 192.168.17.1。 server端都是在虚拟机上启动的服务,这里不能用本地的ip,需要用linux机器的 ip最后一位为1。不然本地客户端无法链接到server端的8300端口。
5.3.2 将Client加入到集群
Client启动完成后, 需要将该client加入到前面建的Server集群中,执行命令如下,
consul join 192.168.17.128.
然后,通过控制台页面查看集群状态,访问地址:http://192.168.17.128:8500/ui/。
5.4 验证集群高可用
可用将前面的Server节点分别进行摘除验证,看服务调用是否正常。在摘除部分节点后,发现服务依然是可用的。
以上!