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

发布于:2022-12-02 ⋅ 阅读:(569) ⋅ 点赞:(0)

一、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)各节点关系

服务端口

端口 作用
8300 RPC exchanges
8301 LAN GOSSIP
8302 WAN GOSSIP
8400 RPC exchanges by the CLI
8500 Used for HTTP API and web interface
8600 Used 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.不能实时获取服务信息的变化通知
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到