微服务组件-配置中心

微服务组件 - 配置中心

一、什么是配置中心(Config)

1、配置中心简述

对于传统的单体应用而言, 我们使用的配置文件可以管理整个系统。比如,SpringBoot中的application.yml文件可以管理整个SpringBoot项目。

但是在微服务架构中,我们将整个应用分成多个微小的服务,每一个服务可以看成一个单体应用,就可以通过配置文件来管理。这样如果系统拥有几十个服务,那么配置文件太多了,甚至为了使系统变的高可用,会大规模集群部署服务应用,如果要手动修改是非常麻烦,而且还不易维护。

2、配置中心的好处

  1. 集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。

  2. 不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。

  3. 运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等

  4. 配置修改后可自动更新。如配置内容发生变化,微服务可以自动更新配置

3、简述配置中心开发

配置中心分成服务端和客户端两个部分。

  • 服务端

    服务端是一个独立的微服务应用。用来连接配置仓库并为客户端提供获取配置信息等访问接口

  • 客户端

    客户端是微服务架构中的各个微服务应用,它们通过服务端来管理应用资源与业务相关的配置内容

    并在启动时从服务端获取和加载配置信息。

开发模型

二、配置中心开发

1、Config 服务端开发

1.1、引入依赖
1
2
3
4
5
<!--引入统一配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
1.2、创建仓库

在Gitee上创建一个仓库–configserver。

新建文件

配置文件

1.3、拉取远端配置
1
http://localhost:7878/master/users-xxx.properties

规则:label/name-profiles.properties

1
2
3
1. label:     仓库的分支,如果不写,则是默认是master分支。
2. name: 代表读取那个具体的配置文件的文件名称
3. profiles: 读取配置文件环境,比如dev
1.4、通过配置文件指定分支和本地仓库
1
2
3
4
# 本地仓库
spring.cloud.config.server.git.basedir=/localresp #一定要是一个空目录,在首次会将该目录清空
# 分支
spring.cloud.config.server.git.default-label=master #指定使用远程仓库中那个分支中内容

2、Config 客户端开发

2.1、引入依赖
1
2
3
4
5
<!--引入config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.2、编写配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
spring.application.name=configclient
# config 配置文件

# 开启统一配置中心服务
spring.cloud.config.discovery.enabled=true
# 指定统一配置服务中心的服务唯一标识
spring.cloud.config.discovery.service-id=configserver
# 指定从仓库的那个分支拉取配置
spring.cloud.config.label=master
# 指定拉取配置文件的名称
spring.cloud.config.name=users
# 指定拉取配置文件的环境
spring.cloud.config.profile=dev

在远端仓库中:

远端仓库文件

1
2
3
4
5
6
7
8
9
10
# users.properties
spring.application.name=configclient
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

# users-dev.properties
server.port=9099

# user-prod.properties
server.port=9098
2.3、启动出现问题
  1. 需要指定服务名称
1
Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: 8988

解决方法:我们需要在配置文件中指定服务名称

1
spring.application.name=configclient
  1. 修改配置文件名称

修改配置文件名称

项目中目前使用的是application.properties启动项目,使用这个配置文件在SpringBoot项目启动过程中不会等待远程配置拉取,直接根据配置文件中内容启动,因此当需要注册中心,服务端口等信息时,远程配置还没有拉取到,所以直接报错。

解决方法:修改配置文件名称

使用统一配置中心时应该将微服务的配置文件名修改为bootstrap.(properties|yml)

2.4、测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
public class TestController {

@Value("${server.port}")
private int port;

@Value("${spring.cloud.config.profile}")
private String prod;

@RequestMapping("/user/port")
public String Test(){
return "此时的环境是" + prod + ",端口号为" + port;
}
}
1
2
# 指定拉取配置文件的环境
spring.cloud.config.profile=prod

成功拉取

证明此时拉取的是users-prod.properties

三、手动刷新配置信息

在生产环境中,微服务可能非常多,每次修改完远端配置之后,不可能对所有服务进行重新启动。

这个时候需要让修改配置的服务能够刷新远端修改之后的配置,从而不要每次重启服务才能生效,进一步提高微服务系统的维护效率。

在springcloud中也为我们提供了手动刷新配置和自动刷新配置两种策略,这里我们先试用手动配置文件刷新。自动配置需要和BUS一起使用。

1、添加配置

1
management.endpoints.web.exposure.include=*

2、添加注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@RefreshScope
public class TestController {

@Value("${server.port}")
private int port;

@Value("${name}")
private String name;

@RequestMapping("/user/port")
public String Test(){
return "name" + name + ",port" + port;
}
}

3、测试

1
2
3
# 修改之前
server.port=9098
name=jzw

修改之前

修改配置文件

1
2
3
# 修改之后
server.port=9098
name=jzw1

发送post请求:curl -X POST http://localhost:9098/actuator/refresh

1
2
C:\Users\JiangZW>curl -X POST http://localhost:9098/actuator/refresh
["config.client.version","server.port"]

修改之后

弊端:

需要手动发送POST请求才能刷新,并且一次只更新一个配置。

四、自动刷新

使用Spring Cloud Bus实现配置的自动刷新。

Bus称之为Spring Cloud Bus中消息总线,主要用来在微服务系统中实现远端配置更新时通过广播形式通知所有客户端刷新配置信息,避免手动重启服务的工作

Spring Cloud Bus使用轻量级消息代理将分布式系统的节点连接起来。然后,可以使用它来广播状态更改(例如配置更改)或其他管理指令。AMQPKafka broker实现包含在项目中。或者,在类路径上找到的任何SpringCloudStream绑定器都可以作为传输使用。

消息队列拉取配置信息

1、引入依赖

1
2
3
4
5
<!--引入bus依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2、安装RabbitMQ

3、 服务端配置 – 配置统一配置中心连接到MQ

1
2
3
4
spring.rabbitmq.port=5672
spring.rabbitmq.host=192.168.111.128
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest #连接mq密码

消息队列

4、客户端配置

添加配置

1
2
# bus消息总线时必须开启连接远程服务失败报错
spring.cloud.config.fail-fast=true

5、刷新

配置统一刷新:

1
curl -X POST http://localhost:7878/actuator/bus-refresh

我们还可以指定服务进行刷新配置:

指定一个服务集群刷新:

1
curl -X POST http://localhost:7878/actuator/bus-refresh/configclient

指定一个具体服务节点刷新:

1
curl -X POST http://localhost:7878/actuator/bus-refresh/configclient:9090

此时,我们可以实现统一刷新,但依然需要发送POST请求才能刷新配置。


微服务组件-配置中心
https://johnjoyjzw.github.io/2021/09/07/微服务组件-配置中心/
Author
John Joy
Posted on
September 7, 2021
Licensed under