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

news/2024/7/7 19:45:16

目录

  • 一、Consul原理与介绍
    • 1.介绍
    • 2.实现原理
      • 2.1serf
      • 2.2Raft
    • 3.consul agent参数
  • 三、Docker搭建集群版的Consul
  • 四、springcloud的接入方式
    • 1.依赖引入
    • 2.配置
  • 五、优缺点
    • 1.优点
    • 2.缺点

一、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.不能实时获取服务信息的变化通知

http://lihuaxi.xjx100.cn/news/51958.html

相关文章

C++中const关键字的用法

1 如果用const修饰一个类的成员方法&#xff0c;这个方法就不能修改这个类的成员变量&#xff0c;也不能调用这个类的非const的成员方法。如下&#xff1a; class A05 { public:void run() const {i;cout << "index:" << i << endl;}private:int …

qmake language

qmake language 变量 qmake language $() $$() $$[] $${} 区别&#xff08;属性property、变量variable、环境变量evironment variable&#xff09;_丘上人的博客-CSDN博客 qmake language 内建关键字 qmake language variable true false test function host_build_丘上人的…

JAVA计算机毕业设计毕业生就业信息管理系统Mybatis+系统+数据库+调试部署

JAVA计算机毕业设计毕业生就业信息管理系统Mybatis系统数据库调试部署 JAVA计算机毕业设计毕业生就业信息管理系统Mybatis系统数据库调试部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技…

python做题遇到的format用法

“{ }”.format()** print(“三角形的周长为&#xff1a;{:.1f}”.format(d)) print(‘{} * {} {:<2}’.format(i,j, ij), end " “) print(”{}{}{:<2}“.format (i, k, ik), end‘\t’) print("{0}{1}{2}”.format(i, j, i * j), end‘\t’) str.format(’…

数据规范化与数据离散化

文章目录一、数据规范化1、小数定标规范化2、最小—最大规范化3、零-均值规范化&#xff08;z-score规范化&#xff09;二、数据离散化一、数据规范化 数据规范化&#xff08;归一化&#xff09;处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲&#xff0c;数值…

Linux外壳程序编程 shell编程 引号详解

shell是命令语言、命令解释程序及程序设计语言的统称&#xff1b; shell是一个命令语言解释器&#xff0c;它拥有自己内建的shell命令&#xff1b; Shell&#xff08;Bash&#xff09;单引号、双引号和反引号用法详解; 尽量使用 $(命令) 的方式来引用命令的输出&#xff0c;…

10.1国庆作业(cortexA7核LED灯实验)

文章目录作业内容思路分析1. 分析RCC章节2. 分析GPIO章节代码部分gpio.hgpio.cmain.c作业内容 实现cortex-A7核LED灯的点亮与熄灭 思路分析 1. 分析RCC章节 设置GPIOE控制器使能&#xff1a;RCC_MP_AHB4ENSETR[4] 1 2. 分析GPIO章节 设置GPIO模式寄存器为输出模式&#…

一、信息收集大全

渗透人员需要使用各种公开资源尽可能地获取测试目标的相关信息。他们搜集信息的互联网渠道主要有&#xff1a;论坛/公告板/新闻组/媒体文章/博客/社交网络/github/其他商业或非商业性的网站。此外&#xff0c;他们也可以借助各种搜索引擎中获取相关数据&#xff0c;如谷歌、雅虎…