SpringCloud - Consul 组件


Consul 介绍

Consul 是一个分布式高可用的系统,它包含多个组件,但作为一个整体在微服务架构中提供服务发现和服务配置的工具。Spring Cloud Consul 项目是针对 Consul 的服务治理实现。

Consul 工作原理

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
该临时表每隔 10s 会更新,只包含有通过了健康检查的 Producer。

pom 文件


    org.springframework.cloud
    spring-cloud-starter-consul-discovery

yml 文件

spring:
  application:
    name: my-spring-cloud-consul
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        enabled: true
        heartbeat:
          enabled: true

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8006.class,args);
    }
}

CAP原则

在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
可用性(A):保证每个请求不管成功或者失败都有响应。
分区容忍性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。
CAP 原则的精髓就是要么 AP,要么 CP,要么 AC,但是不存在CAP。

Eureka 对比

Consul 强一致性(C)

服务注册相比 Eureka 会稍慢一些。因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功。raft 协议:Raft Leader 挂掉时,重新选举期间整个 Consul 不可用。保证了强一致性但牺牲了高可用性。

Eureka 高可用性(A)

服务注册相对要快,因为不需要等注册信息复制到其他节点,也不保证注册信息是否复制成功。当数据出现不一致时,虽然 A,B 上的注册信息不完全相同,但每个 Eureka 节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求 A 查不到,但请求 B 就能查到。如此保证了可用性但牺牲了一致性。

其他

eureka 就是个 servlet 程序,跑在 servlet 容器中; Consul 则是 go 编写而成且实现了服务端的均衡负载功能。