目录
1、Consul是什么
1.1概念
1.2 Consul下载
1.3 Consul启动
2、Consul使用场景
3、Consul优势
4、Consul架构及原理
4.1 整体架构图
4.2 通讯机制
4.3 健康检测
4.4如何保证数据一致性
5、搭建Consul环境
5.1 本地Consul搭建
5.2 集群Consul搭建
5.2.1 安装Consul
5.2.2 启动各 Consul Server节点
5.2.3 组成集群服务
5.3 集群模式-Client配置
5.3.1 启动Client
5.3.2 将Client加入到集群
5.4 验证集群高可用
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节点分别进行摘除验证,看服务调用是否正常。在摘除部分节点后,发现服务依然是可用的。
以上!