服务注册与发现-Consul(一)

  目前常见的服务注册中心有:Netflix Eureka、Alibaba Nacos、HashCorp Consul、Apache Zookeeper,还有一些例如 CoreOS Etcd、 CNCF CoreDNS 这些可能知道的人比较少。他们之间的技术选型可以参考下表:

特性EurekaNacosConsulZookeeper
CAPAPCP + APCPCP
健康检查Client BeatTCP/HTTP/MYSQL/Client BeatTCP/HTTP/gRPC/Cmhttps://www.consul.io/dKeep Alive
雪崩保护
自动注销实例支持支持不支持不支持
访问协议HTTPHTTP/DNSHTTP/DNSTCP
监听支持支持支持支持支持
多数据中心支持支持支持不支持
跨注册中心同步不支持支持支持不支持
SpringCloud集成支持支持支持支持

  本文主要介绍HashCorp Consul的使用部署,在后面的博文会介绍其他几个的使用。

Consul 介绍

  Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置,与其他分布式服务注册与发现方案相比较,Consul 方案更加 “一站式”,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key/Value储存、多数据中心方案,不需要再依赖其他的工具,使用起来较为简单。
  Consul 是使用Go语言编写,因此具有天然可移植性,支持Linux、Windows、macOS,安装包仅包含一个可执行文件,方便部署,与Docker 等轻量级容器可实现无缝配合。

Consul 特性
  • Raft算法
  • 服务发现
  • 健康检查
  • Key/Value储存
  • 多数据中心
  • 支持http和dns协议接口
  • 官方提供web管理界面
Consul 角色
  • dev:开发模式,本地开发时,可以通过 -dev开发模式简单运行,实现服务的注册发现流程;开发完成需要上线时就需要使用下面两种
  • client:客户端,无状态,将HTTP和DNS接口请求转发给局域网内的服务端集群
  • server:服务端,保存配置信息,高可用集群,每个数据中心的server推荐为3或5个
    在这里插入图片描述
Consul 工作原理

在这里插入图片描述
  服务注册与发现: 当服务Producer启动时,会将自己的 IP/HOST 等信息通过发送请求告知Consul,Consul接收到Producer的注册信息后,每隔10s(默认)会向Producer发送一个健康检查的请求,检验Producer是否健康
  服务调用: 当Consumer请求Producer时,会先从Consul中拿到储存Producer服务IP和Port的临时表(temp_table),从temp_table表中任选一个Producer的IP和Port,然后根据这个IP和Port发送访问请求;temp_table表只包含通过了健康检查的Producer信息,并且每隔10s(默认)更新

Consul 的安装

  Consul是用Go语言编写的第三方工具,需要单独安装使用,下载地址:https://www.consul.io/downloads。Consul支持Windows、macOS、Linux,可以根据自己的需求进行下载使用。

  • Windows 安装
       下载Windows的包,解压出来只有一个.exe的执行文件
    在这里插入图片描述
# 启动Consul  -dev开发模式启动  -client可以访问的IP,0.0.0.0 表示都可以访问
consul agent -dev -client=0.0.0.0
  • Centos 安装
# 通过yum源安装
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul
# 启动consul
consul agent -dev -client=0.0.0.0

# 通过二进制文件安装
# 下载
wget https://releases.hashicorp.com/consul/1.11.4/consul_1.11.4_linux_amd64.zip
# 解压
unzip consul_1.11.4_linux_amd64.zip
# 启动consul
./consul agent -dev -client=0.0.0.0

  启动后,可以通过 ip:8500访问web控制台,默认是8500端口
在这里插入图片描述

SpringBoot 实例
  • 导入jar包
      演示demo就没有分模块去测试,直接一个项目
<dependencies>
    <!--  consul -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <!-- actuator 健康监控 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  • 配置Consul
server:
  port: 8081
spring:
  application:
    name: consul-demo
  cloud:
    consul:
      host: 127.0.0.1  # consul 注册中心地址
      port: 8500   # consul 注册中心端口
      enabled: true # 是否使用consul
      # 服务提供者信息
      discovery:
        register: true # 是否需要注册
        instance-id: ${spring.application.name}-01  # 注册实例ID, 保证唯一
        service-name: ${spring.application.name} # 服务名称
        port: ${server.port} # 服务端口
        prefer-ip-address: true # 是否使用IP地址注册
        ip-address: ${spring.cloud.client.ip-address} # 服务请求IP
  • 启动测试
      启动后,在Consul web控制台就可以看到注册的服务了
    在这里插入图片描述
Consul 集群

在这里插入图片描述
  上图是一个简单的Consul Cluster 架构,Consul Cluster 有 server 和 client 两种角色,不管是server还是client,统称为Agent,Consul Cluster 是相对无状态的,只负责转发RPC到server,资源开销小。server是一个由一组扩展功能的代理,这些功能包括参与Raft选举、维护集群状态,响应RPC查询,与其他数据中心交互WAN Gossip和转发查询给leader或者远程数据中心。

  每个数据中心,client和server是混合的,一般建议有3~5台server,这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢,server之间会选举一个leader。然而并不限制client的数量,一般建议一个服务对应一个client,他们可以很容易扩展到数千数万台。在开发时我们绑定一组服务注册中心的客户端即可。

1. 环境准备
  本次搭建的 Consul 集群包含三个server端,一个client端,server使用centos7系统搭建,安装方法见上文,client端暂时用Windows系统进行测试,配置如下

服务器IPConsul类型Node节点系统
192.168.0.114serverserver-01centos7
192.168.0.115serverserver-02centos7
192.168.0.116serverserver-03centos7
192.168.0.108clientclient-01Windows10

2. 安装
  安装方法就不用多少了,在上问已经写了Windows和Linux的安装方法

3. 启动客户端和服务端

  1). 启动注册中心服务端

# 节点1 server-01
./consul agent -server -bind=192.168.0.114 -client=0.0.0.0 -ui -bootstrap-expect=3 -data-dir=/home/data/ -node=server-01
# 节点2 server-02
./consul agent -server -bind=192.168.0.115 -client=0.0.0.0 -ui -bootstrap-expect=3 -data-dir=/home/data/ -node=server-02
# 节点3 server-03
./consul agent -server -bind=192.168.0.116 -client=0.0.0.0 -ui -bootstrap-expect=3 -data-dir=/home/data/ -node=server-03

参数说明:

  • -server 以服务端身份启动(注册中心)
  • -bind 表示绑定到哪个IP
  • -client 指定客户端访问的IP,0.0.0.0 表示不限制客户端IP
  • -ui 开启web界面访问
  • -bootstrap-expect=3 表示server集群最低节点数3,低于这个值将工作不正常
  • -data-dir 指定数据存放的路径,该目录必须存在,需提前创建好
  • -node 表示节点在web ui显示的名称

  2). 启动注册中心客户端

consul agent -client=0.0.0.0 -bind=192.168.0.108 -data-dir=H:\software\consul_1.11.4\data -node=client-01

  3). 关联集群
  首选你需要自己选定leader,然后在其他的节点执行join命令

# 在其他的节点,包括server 和 client 执行下面的命令添加到 leader 中
# Linux 下
./consul join 192.168.0.114
# Windows下
consul join 192.168.0.114

  4). 查看集群状态
  可以在任意一台服务器输入以下命令可查看集群所有节点的信息

./consul members

在这里插入图片描述
  或者也可以在web界面查看所有的节点
在这里插入图片描述

测试

  Consul的集群使用是通过client进行代理转发server端的,是不需要配置server端地址的。微服务的请求先到client,client接收然后转发到server,后期在使用增加微服务时,只需要扩展client端就行了。注意:如果直接配置连接server端会抛出异常。测试代码可以直接使用上文的代码。
在这里插入图片描述
源码地址:https://gitee.com/peachtec/hxz-study

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

華小灼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值