注册中心系列二:Consul的接入与使用

一、Consul原理与介绍

1.介绍

consul主要有server和client两种组件组成。

server负责核心数据的存储和处理请求,server可以部署多个实例(通常推荐3-5个),server只有一个实例是leader实例,就是主节点,主节点是自动选举产生的,主节点负责处理数据的写入处理,同时将数据同步至其他server节点

client负责跟server通信,处理转发服务注册、服务发现请求到server节点,client还负责服务的健康检查,client节点也可以部署多个实例,甚至每个微服务节点都部署一个client实例。

在这里插入图片描述

Server节点

  • 参与共识仲裁(raft)
  • 存储群集状态(日志存储)
  • 处理查询
  • 维护与周边(LAN/WAN)各节点关系

Agent节点

  • 负责通过该节点注册到consul的微服务的健康检查
  • 将客户端注册请求以及查询转化为对server的RPC请求
  • 维护与周边(LAN/WAN)各节点关系

服务端口

端口作用
8300RPC exchanges
8301LAN GOSSIP
8302WAN GOSSIP
8400RPC exchanges by the CLI
8500Used for HTTP API and web interface
8600Used for DNS server

纵观consul的实现,其核心在于两点:

  1. 集群内节点间信息的高效同步机制,其保障了拓扑变动以及控制信号的及时传递;
  2. server集群内日志存储的强一致性。

它们主要基于以下两个协议来实现:

  • 使用gossip协议在集群内传播信息
  • 使用raft协议来保障日志的一致性

2.实现原理

2.1serf

Serf是hashicorp开源的去中心化成员管理、失败检测和服务编排工具,具有轻量级高可用分区容错的特点。Serf底层采用gossip协议,通过在集群中广播消息,从而实现了集群中节点下线自动感知。Serf 在每个主要平台上运行:Linux、Mac OS X 和 Windows。它非常轻量级:它使用 5 到 10 MB 的常驻内存,并且主要使用不频繁的 UDP 消息进行通信

由于gossip协议实现了最终一致性,所以Serf是一个AP系统。Serf可应用于负载均衡器、Memcached或者Redis集群管理、DNS记录更新等场景。

Serf 使用高效的gossip协议 来解决三个主要问题:

  • Membership:Serf 维护集群成员列表,并且能够在成员更改时执行自定义处理程序脚本。例如,Serf 可以维护负载均衡器的 Web 服务器列表,并在节点上线或离线时通知负载均衡器。
  • 故障检测和恢复:Serf 在几秒钟内自动检测故障节点,通知集群的其余部分,并执行处理程序脚本允许您处理这些事件。Serf 将通过定期重新连接来尝试恢复故障节点。
  • 自定义事件传播:Serf 可以向集群广播自定义事件和查询。这些可用于触发部署、传播配置等。事件只是即发即弃的广播,Serf 在面对离线节点或网络分区时尽最大努力传递消息。查询提供了一个简单的实时请求/响应机制。

2.2Raft

节点状态变更

  1. 在节点数达到bootstrap-expect的数时,开始启用raft选举
  2. 在节点数超过bootstrap-expect数时,其他节点为follower
  3. 在leader被干掉后,raft如果判断到节点数依然大于等于bootstrap-expect时,重新选举
  4. 逐一干掉节点,当节点数少于bootstrap-expect时,raft协议不再选举,将维持先前的状态。

3.consul agent参数

-advertise        通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap        用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
-bootstrap-expect 在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
-bind             该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-client           consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-config-file      明确的指定要加载哪个配置文件
-config-dir       配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir         提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-dc               该标记控制agent允许的datacenter的名称,默认是dc1
-encrypt          指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
-join             加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。
-retry-join       和join类似,但是允许你在第一次失败后进行尝试。
-retry-interval   两次join之间的时间间隔,默认是30s
-retry-max        尝试重复join的次数,默认是0,也就是无限次尝试
-log-level        consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
-node             节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-protocol         consul使用的协议版本
-rejoin           使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-server           定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
-syslog           开启系统日志功能,只在linux/osx上生效
-ui-dir           提供存放web ui资源的路径,该目录必须是可读的
-pid-file         提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent

三、Docker搭建集群版的Consul

docker-compose.yml内容如下,将搭建三个节点作为服务,一个节点提供界面与客户端对接入口

version: '3'

services:

  consul1:
    image: consul
    container_name: consul_node1
    command: agent -server -bootstrap-expect=3 -node=consul_node1 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1
    networks:
      - mynet

  consul2:
    image: consul
    container_name: consul_node2
    command: agent -server -retry-join=consul_node1 -node=consul_node2 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1
    depends_on:
      - consul1
    networks:
      - mynet

  consul3:
    image: consul
    container_name: consul_node3
    command: agent -server -retry-join=consul_node1 -node=consul_node3 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1
    depends_on:
      - consul1
    networks:
      - mynet

  consul4:
    image: consul
    container_name: consul_node4
    command: agent -retry-join=consul_node1 -node=consul_node4 -bind=0.0.0.0 -client=0.0.0.0 -datacenter=dc1 -ui
    ports:
    - 8500:8500
    depends_on:
      - consul2
      - consul3
    networks:
      - mynet

networks:
  mynet:
    driver: bridge

运行

docker-compose up -d

四、springcloud的接入方式

1.依赖引入

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>

2.配置

spring:
  application:
    name: springcloud-demo
  cloud:
    consul:
      discovery:
        enabled: true
      host: 127.0.0.1
      port: 8500

五、优缺点

1.优点

  • 1.简单易用,不需要集成sdk
  • 2.自带健康检查
  • 3.支持多数据中心
  • 4.提供web管理界面

2.缺点

  • 1.不能实时获取服务信息的变化通知

版权声明:本文为qq_44625080原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。