Spring Cloud Consul 服务治理与配置中心

Posted by 暮夏有五 on 2021-02-12
Estimated Reading Time 5 Minutes
Words 1.2k In Total
Viewed Times

Spring Cloud Consul 为 SpringBoot 应用提供了 Consul 的支持,Consul 既可以作为注册中心使用,也可以作为配置中心使用,本文将对其用法进行详细介绍。

Consul 简介


Consul 是 HashiCorp 公司推出的开源软件,提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案。

Spring Cloud Consul 具有如下特性:

  • 支持服务治理:Consul 作为注册中心时,微服务中的应用可以向 Consul 注册自己,并且可以从 Consul 获取其他应用信息;
  • 支持客户端负责均衡:包括 Ribbon 和 Spring Cloud LoadBalancer;
  • 支持Zuul:当 Zuul 作为网关时,可以从 Consul 中注册和发现应用;
  • 支持分布式配置管理:Consul 作为配置中心时,使用键值对来存储配置信息;
  • 支持控制总线:可以在整个微服务系统中通过 Control Bus 分发事件消息。

使用 Consul 作为注册中心


安装并运行 Consul

首先我们从官网下载 Consul,地址:www.consul.io/downloads.h…

img

下载完成后只有一个 exe 文件,双击运行;然后在命令行中输入以下命令可以查看版本号:

1
2
3
$ consul --version
Consul v1.6.1
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

使用开发模式启动:

1
$ consul agent -dev

通过以下地址可以访问 Consul 的首页:http://localhost:8500

img

创建应用注册到 Consul

我们通过改造 user-service 和 ribbon-service 来演示下服务注册与发现的功能,主要是将应用原来的 Eureka 注册中心支持改为 Consul 注册中心支持。

创建 consul-user-service 模块和 consul-ribbon-service 模块;

修改相关依赖,把原来的 Eureka 注册发现的依赖改为 Consul 的,并添加 Spring Boot Actuator 的依赖:

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

修改配置文件 application.yml,将 Eureka 的注册发现配置改为 Consul 的:

1
2
3
4
5
6
7
8
9
10
11
server:
port: 8206
spring:
application:
name: consul-user-service
cloud:
consul: #Consul服务注册发现配置
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}

运行两个 consul-user-service 和一个 consul-ribbon-service,在 Consul 页面上可以看到如下信息:

img

负载均衡功能

由于我们运行了两个 consul-user-service,而 consul-ribbon-service 默认会去调用它的接口,我们调用 consul-ribbon-service 的接口来演示下负载均衡功能。

多次调用接口:http://localhost:8308/user/1,可以发现两个 consul-user-service 的控制台交替打印如下信息:

1
2019-10-20 10:39:32.580  INFO 12428 --- [io-8206-exec-10] c.macro.cloud.controller.UserController  : 根据id获取用户信息,用户名称为:antonio

使用 Consul 作为配置中心


我们通过创建 consul-config-client 模块,并在 Consul 中添加配置信息来演示下配置管理的功能。

创建项目模块

创建 consul-config-client 模块,在 pom.xml 中添加相关依赖:

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

添加配置文件 application.yml,启用的是 dev 环境的配置:

1
2
3
spring:
profiles:
active: dev

添加配置文件 bootstrap.yml,主要是对 Consul 的配置功能进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 9101
spring:
application:
name: consul-config-client
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: consul-config-client
config:
enabled: true #是否启用配置中心功能
format: yaml #设置配置值的格式
prefix: config #设置配置所在目录
profile-separator: ':' #设置配置的分隔符
data-key: data #配置key的名字,由于Consul是K/V存储,配置存储在对应K的V中

创建 ConfigClientController,从 Consul 配置中心中获取配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
@RefreshScope
public class ConfigClientController {

@Value("${config.info}")
private String configInfo;

@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}

在 Consul 中添加配置

在 consul 中添加配置存储的 key 为:

1
config/consul-config-client:dev/data

在 consul 中添加配置存储的 value 为:

1
2
config:
info: "config info for dev"

存储信息截图如下:

img

启动 consul-config-client,调用接口查看配置信息:http://localhost:9101/configInfo

1
config info for dev

Consul 的动态刷新配置

我们只要修改下 Consul 中的配置信息,再次调用查看配置的接口,就会发现配置已经刷新。回想下在使用 Spring Cloud Config 的时候,我们需要调用接口,通过Spring Cloud Bus 才能刷新配置。Consul 使用其自带的 Control Bus 实现了一种事件传递机制,从而实现了动态刷新功能。

更多干货请移步:https://antoniopeng.com


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !