consul 简介
- Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。
consul 优势
-
使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接。相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。
-
支持多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。
-
支持健康检查。 etcd 不提供此功能。
-
支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
-
官方提供 Web 管理界面, etcd 无此功能。
-
Consul 保持了 CAP 中的 CP,保持了强一致性和分区容错性。
-
Consul 支持 Http\gRPC\DNS 多种访问方式。
下载
下载地址:https://www.consul.io/downloads.html
下载完成后,解压是一个exe。
启动命令:consul agent -dev
为了方便使用,创建一个bat文件,内容如下:
consul agent -dev
pause
启动后如图:
consul默认端口是8500,因此在浏览器输入http://localhost:8500 出现如下界面,则表示consul启动成功:
创建一个项目,我们来实现服务注册
这里用的boot版本2.1.2.RELEASE 如果低于2.0会发生与cloud报错
org.springframework.cloudspring-cloud-starter-consul-discovery2.1.2.RELEASEorg.springframework.cloudspring-cloud-starter-consul-config2.1.2.RELEASEorg.springframework.bootspring-boot-starter-actuatororg.springframework.cloudspring-cloud-commons2.1.1.RELEASE
启动类上添加 @EnableDiscoveryClient
@EnableDiscoveryClient 与@EnableEurekaClient区别1.@EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现;适合于consul、zookeeper注册中心
2.@EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用;
properties 配置
spring.application.name=spring-cloud-consul-client
server.port=8501
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
#注册到consul的服务名称
spring.cloud.consul.discovery.serviceName=service-producer
此时发现注册成功,但是会发现健康监测发生 ×1
添加健康监测 ,创建一个方法
配置文件
# 健康监测
spring.cloud.consul.discovery.health-check-path=/health
spring.cloud.consul.discovery.health-check-interval=15s
consul 中心注册原理
- 当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port
- Consul 接收到 Producer 的注册后,每隔10s(默认)会向 Producer 发送一个健康检查的请求,检验Producer是否健康
- 当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address
- 该临时表每隔10s会更新,只包含有通过了健康检查的 Producer