Consul
Consul 是由Go 语言编写开发的分布式服务注册和发现方案
特点:
- 支持健康检查、多数据中心、安全服务通信以及k-v存储
- 基于Raft 共识算法,保证强一致性、可用性
- 与docker 完美兼容
Consul 的使用
服务端:
- Consul 自带提供了服务端,下载安装地址
- 启动服务端
- Linux下启动:
nohup consul agent -dev
- Windows下启动:
consul.exe agent -config-file config.conf
- Linux下启动:
- 启动后可以访问Consul 的web-ui:http://127.0.0.1:8500
客户端:
- pom 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- yaml 配置文件:
spring:
cloud:
consul:
host: 127.0.0.1
port: 8500 #consul启动端口默认为8500
discovery:
healthCheckPaht: /actuator/health #健康检查路径
healthCheckInterval: 15s #健康检查频率
hostname: 127.0.0.1 #注册服务所在IP
port: ${server.port} #注册服务所在端口
service-name: ${spring.application.name} #注册服务名
register-health-check: true
- 启动类加上注解
@EnableDiscoveryClient
CAP 定理
一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)三者不可同时满足
理解:
分布式系统中,由于部分节点间网络故障,导致部分节点不连通的情况,就叫网络分区。
访问的节点在一个分区,而请求的数据在另一个分区,所以分区容忍性较差。
为了解决这个问题,可以把数据复制传播到其他节点,保持数据一致性。但同时,数据复制也需要时间,此前访问节点不可用,也就是牺牲了系统可用性。
Consul vs Eureka
- Eureka 服务注册较快,Consul 的Raft 协议要求过半数节点都写入成功才认为注册成功
- Consul 的leader 挂掉时,重新选举期间节点不可用,保证了强一致性但牺牲了可用性
- Eureka 保证可用性,但只有最终一致性
- Eureka 是个servlet 程序,Consul 则是由go 编写成的独立应用