Consul简介
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
Consul特性
-
服务注册/发现
为什么微服务架构下就需要做服务注册和服务发现呢?微服务的目标就是要将原来大一统的系统架构,拆分成细粒度的按功能职责分成的小系统,这样就会出现很多小的系统,部署的节点也会随之增加。试想一下,如果没有一个统一的服务组件来管理各系统间的列表,微服务架构是很难落地实现的。
Consul提供的服务注册/发现功能在数据强一致性和分区容错性上都有非常好的保证,但在集群可用性下就会稍微差一些(相比Euerka来说)。 -
数据强一致性保证
Consul采用了一致性算法Raft来保证服务列表数据在数据中心中各Server下的强一致性,这样能保证同一个数据中心下不管某一台Server Down了,请求从其他Server中同样也能获取的最新的服务列表数据。数据强一致性带来的副作用是当数据在同步或者Server在选举Leader过程中,会出现集群不可用。 -
多数据中心
Consul支持多数据中心(Data Center),多个数据中心之间通过Gossip协议进行数据同步。多数据中心的好处是当某个数据中心出现故障时,其他数据中心可以继续提供服务,提升了可用性。 -
健康检查
Consul支持基本硬件资源方面的检查,如:CPU、内存、硬盘等 -
Key/Value存储
Consul支持Key/Value存储功能,可以将Consul作为配置中心使用,可以将一些公共配置信息配置到Consul,然后通过Consul提供的 HTTP API来获取对应Key的Value。
调用过程
1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port;
2、Consul 接收到 Producer 的注册后,每隔 10s(默认)会向 Producer 发送一个健康检查的请求,检验 Producer 是否健康;
3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address;
4、该临时表每隔 10s 会更新,只包含有通过了健康检查的 Producer。
Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中,为我们的基础设施提供服务发现和服务配置的工具。
安装与启动
打开
Consul
官网根据不同的操作系统选择最新的 Consul 版本,我们这里以 macOS 操作系统为例。
cd到安装目录输入
./consul agent -dev
会以开发者模式启动。输入:
localhost:8500
就可以看到时consul管理界面了。
consul管理界面默认连接为本地机器127.0.0.1,可以在启动时输入:
./consul agent -dev -client 0.0.0.0 -ui
其它机器也可以访问管理页面。
配置文件
pom文件添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
配置文件根据需要添加:
spring:
application:
name: consul
cloud:
consul:
#配置consul服务器的host
host: localhost
#配置端口
port: 8500
config:
#配置默认文件名
default-context: ${spring.application.name}
#是否启用consul配置
enabled: true
#配置文件格式
format: YAML
#配置基本文件,默认值config
prefix: config
#配置文件名,默认data
data-key: data
discovery:
#是否启用服务发现
enabled: true
#配置健康检查路径
health-check-path: /actuator/health
#配置健康检查时间间隔
health-check-interval: 15s
#配置实例id
instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
#配置服务注册
register: true
deregister: true
#表示注册时使用ip而不是hostname
prefer-ip-address: true
#表示指定访问服务IP
ip-address: IP
#健康检查失败多长时间取消注册
health-check-critical-timeout: 30s
服务强制下线
有时服务没开启心跳监测则无法下线,目前不清楚原因,如有解决方法请留言给小编,万分感谢!
PUT请求:ip:8500/v1/agent/service/deregister/服务实例Id(配置文件中instance-id)
不同版本服务实例Id呈现方式不一样!!!
版本一:
版本二: