Consul 开发随笔

Consul 的概念

Consul 简单介绍

  • Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司使用 Go 语言开发,基于 Mozilla Public License 2.0 的协议进行开源。Consul 支持健康检查,并允许 HTTP 、gRPC 和 DNS 协议调用 API 存储键值对。
  • 一致性协议采用 Raft 算法,用来保证服务的高可用。使用 GOSSIP 协议管理成员和广播消息,并且支持 ACL 访问控制。
  • 命令行超级好用的虚拟机管理软件 Vgrant 也是 HashiCorp 公司开发的产品。

Consul 集群概念

  • Client:表示 Consul 客户端模式,是 Consul 节点的一种模式,所有注册到 Client 节点的服务会被转发到 Server 。本身无状态不持久化如何数据。Client 通过 HTTP、DNS、GRPC 接口请求转发给局域网内的服务端集群。
  • Server:表示 Consul 的服务端模式, Server 功能和 Client 都一样,不同的是 Server 持久化数据到本地。在局域网内与本地 Client 通讯,通过广域网与其他数据中心通讯。每个数据中心的 Server 数量推荐为 3 个或是 5 个。
  • Server-Leader:表示这个 Server 是它们的老大,它和其它 Server 不一样的一点是,它需要负责同步注册的信息给其它的 Server 节点,同时也要负责各个节点的健康监测。如果 Leader 宕机了,通数据中心的所有 Server 内部会使用 Raft 算法来在其中选取一个 Leader。
  • Agent:Agent 是 Consul 的核心进程,Agent 负责维护成员关系信息、注册服务、健康检查、响应查询等。Consul 集群的每一个节点都必须运行 Agent 进程。

Client 模式与 Server 模式

在 Consul 中,Client 模式和 Server 模式是两种不同的运行模式,每种模式在 Consul 集群中承担的角色和职责不同。以下是它们的区别:

  • 角色与职责

    • Server 模式:

      • 核心功能:Consul 服务器节点是集群的核心,负责存储集群状态数据、维护服务目录、处理数据查询和写入请求、选举领导者、以及处理其他控制平面操作。
      • 数据存储:服务器节点持久化存储所有的服务注册信息、健康检查状态、KV 存储数据等。
      • 选举与一致性:多个服务器节点之间通过 Raft 协议来选举领导者(Leader),并且通过复制日志的方式确保数据的一致性和高可用性。
      • 数量要求:建议至少有 3 个服务器节点(生产环境下建议 5 个),以确保故障时仍能维持集群的高可用性。
    • Client 模式:

      • 核心功能:客户端节点负责代理应用程序的请求,将它们转发给服务器节点处理。客户端不会持久化存储集群状态数据。
      • 轻量级:客户端节点不参与选举和数据一致性操作,因此占用的资源较少。它主要用于收集本地服务的健康检查结果,并向服务器节点发送这些数据。
      • 网络代理:客户端节点可以作为网络代理,帮助服务发现和服务请求的转发,从而在不同服务之间提供负载均衡和服务路由。
  • 数据存储

    • Server 模式:服务器节点持久化存储集群的状态数据,例如服务注册信息、健康检查结果、KV 存储等。
    • Client 模式:客户端节点不存储任何持久化数据,只将数据发送给服务器节点。
  • 通信与代理

    • Server 模式:服务器节点可以直接处理来自客户端节点的请求,并负责将请求结果返回给客户端。
    • Client 模式:客户端节点负责接收本地服务的请求,并将这些请求转发给服务器节点处理,然后将结果返回给应用程序。
  • 高可用性

    • Server 模式:为了保证高可用性,集群中应至少配置 3 个服务器节点(建议 5 个),这样即使有一个或两个节点发生故障,集群仍然可以正常工作。
    • Client 模式:客户端节点可以是任意数量,增加客户端节点不会对集群的高可用性产生影响。客户端节点失败不会影响集群整体的运行。
  • 工作负载

    • Server 模式:因为需要参与一致性协议(如 Raft)并处理数据存储、复制等操作,服务器节点的负载通常较高。
    • Client 模式:客户端节点的工作负载较低,因为它们只需处理本地请求的转发和健康检查数据的收集。
  • 部署建议

    • Server 模式:服务器节点通常部署在稳定且高性能的机器上,建议将它们分散在不同的可用区或数据中心,以提高容灾能力。
    • Client 模式:客户端节点可以部署在每个应用服务所在的机器上,以便就近收集健康检查信息并进行服务发现。

总结

  • Server 节点(使用 Server 模式)是 Consul 集群的核心,负责处理集群状态和一致性、参与选举、存储所有数据。
  • Client 节点(使用 Client 模式)则是轻量级的代理,负责转发请求,不存储数据,只用于连接和与服务器节点交互。

Consul 注册中心

常见使用问题

服务在 UI 界面总是显示红叉

在使用 Spring Cloud Consul 的高版本时(比如 spring-cloud-starter-consul-discovery:4.1.0),微服务应用注册到 Consul 中后,一直显示红叉(All service checks failing)错误,如下图所示:

这是因为 Consul 的心跳机制没有打开,所以健康检查总是报红。解决方法是在微服务应用的配置文件中添加以下内容,打开心跳机制:

1
2
3
4
5
spring:
consul:
discovery:
heartbeat:
enabled: true

Consul 配置中心