Consul原理及配置

  • Post author:
  • Post category:其他




Consul简介

Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。



Consul特性

  • 服务注册/发现

    为什么微服务架构下就需要做服务注册和服务发现呢?微服务的目标就是要将原来大一统的系统架构,拆分成细粒度的按功能职责分成的小系统,这样就会出现很多小的系统,部署的节点也会随之增加。试想一下,如果没有一个统一的服务组件来管理各系统间的列表,微服务架构是很难落地实现的。

    Consul提供的服务注册/发现功能在数据强一致性和分区容错性上都有非常好的保证,但在集群可用性下就会稍微差一些(相比Euerka来说)。

  • 数据强一致性保证

    Consul采用了一致性算法Raft来保证服务列表数据在数据中心中各Server下的强一致性,这样能保证同一个数据中心下不管某一台Server Down了,请求从其他Server中同样也能获取的最新的服务列表数据。数据强一致性带来的副作用是当数据在同步或者Server在选举Leader过程中,会出现集群不可用。

  • 多数据中心

    Consul支持多数据中心(Data Center),多个数据中心之间通过Gossip协议进行数据同步。多数据中心的好处是当某个数据中心出现故障时,其他数据中心可以继续提供服务,提升了可用性。

  • 健康检查

    Consul支持基本硬件资源方面的检查,如:CPU、内存、硬盘等

  • Key/Value存储

    Consul支持Key/Value存储功能,可以将Consul作为配置中心使用,可以将一些公共配置信息配置到Consul,然后通过Consul提供的 HTTP API来获取对应Key的Value。

    在这里插入图片描述



调用过程

1、当 Producer 启动的时候,会向 Consul 发送一个 post 请求,告诉 Consul 自己的 IP 和 Port;

2、Consul 接收到 Producer 的注册后,每隔 10s(默认)会向 Producer 发送一个健康检查的请求,检验 Producer 是否健康;

3、当 Consumer 发送 GET 方式请求 /api/address 到 Producer 时,会先从 Consul 中拿到一个存储服务 IP 和 Port 的临时表,从表中拿到 Producer 的 IP 和 Port 后再发送 GET 方式请求 /api/address;

4、该临时表每隔 10s 会更新,只包含有通过了健康检查的 Producer。

Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中,为我们的基础设施提供服务发现和服务配置的工具。

在这里插入图片描述



安装与启动

打开

Consul

官网根据不同的操作系统选择最新的 Consul 版本,我们这里以 macOS 操作系统为例。

cd到安装目录输入

./consul agent -dev

会以开发者模式启动。输入:

localhost:8500

就可以看到时consul管理界面了。

consul管理界面默认连接为本地机器127.0.0.1,可以在启动时输入:

./consul agent -dev -client 0.0.0.0 -ui

其它机器也可以访问管理页面。



配置文件

pom文件添加:

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

配置文件根据需要添加:


spring:
  application:
    name: consul
  cloud:
    consul:
      #配置consul服务器的host
      host: localhost
      #配置端口
      port: 8500
      config:
        #配置默认文件名
        default-context: ${spring.application.name}
        #是否启用consul配置
        enabled: true
        #配置文件格式
        format: YAML
        #配置基本文件,默认值config
        prefix: config
        #配置文件名,默认data
        data-key: data
      discovery:
        #是否启用服务发现
        enabled: true
        #配置健康检查路径
        health-check-path: /actuator/health
        #配置健康检查时间间隔
        health-check-interval: 15s
        #配置实例id
        instance-id: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
        #配置服务注册
        register: true
        deregister: true
        #表示注册时使用ip而不是hostname
        prefer-ip-address: true
        #表示指定访问服务IP
        ip-address: IP
        #健康检查失败多长时间取消注册
        health-check-critical-timeout: 30s




服务强制下线

有时服务没开启心跳监测则无法下线,目前不清楚原因,如有解决方法请留言给小编,万分感谢!

PUT请求:ip:8500/v1/agent/service/deregister/服务实例Id(配置文件中instance-id)

不同版本服务实例Id呈现方式不一样!!!

版本一:

在这里插入图片描述

版本二:

在这里插入图片描述



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