目录

[TOC]

微服务架构中为了方便管理与更新各微服务的配置,在Spring Cloud中可以使用 Spring Cloud Config 来统一管理系统内各微服务的配置文件。使用Config统一管理后,可实现git分布式版本控制,不同环境不同配置,动态调整自动更新配置等功能。
Spring Cloud Config 包括Config Server 和 Config Client 两部分,Config Server用于管理配置,Config Client 则与各微服务集成负责向Config Server请求获取配置并进行缓存以提高性能。
Config Server默认使用Git存储配置内容,当然也可以使用SVN,本地文件系统或Vault存储配置。
下面把Config Server 、 Config Client 和 Eureka配合使用记录下来。

编写Config Server

在编写Config Server 前,我们需要使用Git作为后端存储。

创建Git仓库

可以在github.com上创建一个仓库。先前面用到了电影与用户微服务的配置文件直接放到仓库中。配置文件命名使用规范:服务名+环境 。这里我创建的仓库如下图:
git仓库
每个微服务的配置我这里按开发与生产环境分别部署两份。配置文件内容与前面做的demo配置一样,但开发与生产配置的端口号不同。
另外,方便测试版本控制,我给仓库新建了一个 config-label-v2.0 分支,将端口号进行修改以便区分。

编写Config Server

新建一个Spring Boot项目,
1、引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

2、添加注解
在启动类上添加 @EnableConfigServer 声明这是一个Config Server

1
2
3
4
5
6
7
8
9
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
public class MicroserviceConfigServerApplication {

public static void main(String[] args) {
SpringApplication.run(MicroserviceConfigServerApplication.class, args);
}
}

因为我们是配合Eureka使用,因此启动类上也需要添加 @EnableDiscoveryClient 注解

3、编写配置
编写application.yml ,并添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 8082
spring:
application:
name: microservice-config-server
cloud:
config:
server:
git:
uri: https://github.com/hjwzyy/spring-cloud-edgware-configServer-demo
username: ******@*******.com
password: *******
eureka:
client:
service-url:
defaultZone: http://user:admin@localhost:8761/eureka/

至此 一个简单的Config Server就完成了。
下面我们来启动Config Server进行测试。
访问如下地址:http://localhost:8082/microservice-provider-user/dev 如下图:
查看配置
这里显示的是我们放在Git仓库里的用户微服务的开发环境配置文件,说明Config Server正常。
测试版本控制,访问如下地址:http://localhost:8082/microservice-provider-user/dev/config-label-v2.0
分支配置
可以看到访问地址加上指定分支后显示的是指定分支下的配置文件。

关于Config Server 获取git上的资源信息遵循如下规则:
1
2
3
4
5
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

我们可以按以上规则去访问git上的配置文件

编写Config Client

前面我们写过,Config Client与微服务集成,因此在微服务中添加Config的依赖,稍微配置一下就可以了。
下面我将前面的用户微服务与电影微服务添加Config Client,整个用户与电影微服务的编写,服务注册这里不再贅述,可参考前文:

微服务简单实例–电影购票

微服务学习笔记 –使用Spring Cloud Eureka实现服务注册与发现

添加依赖

向用户微服务添加以下依赖:

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

电影微服务同上添加依赖。

修改配置

因为用户微服务的配置已经放在了git上,所以项目的中的application.yml文件只需要配置一个端口即可,其它配置清除:

1
2
server:
port: 8005

git上的配置文件也可以配置端口,并且会以git上的配置文件为准

添加bootstrap.yml配置文件

Spring Cloud 有一个“引导上下文”的概念,这里主应用程序的父上下文。引导上下文负责从配置服务器加载配置属性,以及解密外部配置文件中的属性。和主应用程序加载application.*(yml或priperties)中的属性不同,引导上下文加载bootstarap.*中的属性。配置在bootstrap.*中的属性有更高的优先级,因此默认情况下它们不能被本地配置覆盖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
application:
name: microservice-provider-user
cloud:
config:
profile: prod
label: master
discovery:
enabled: true
serviceId: microservice-config-server
eureka:
client:
service-url:
defaultZone: http://user:admin@localhost:8761/eureka/

配置文件中加上服务注册配置,因为我们是与Eureka配合使用,Config Client需要先从Eureka中找到Config Server,再从Config Server中获取到对应的配置。而获取对应配置是依靠spring.application.namespring.cloud.config.profile来找到对应配置文件的。还记得前面我们在Git仓库中建立的配置文件命名吗?都是以 服务名+环境 进行命名的。

spring.cloud.config.label 则是指定分支为主分支 master
spring.cloud.config.discovery.enabled 表示使用服务发现组件中的Config Server,而不是自己指定的Config Serverr uri,默认为false
spring.cloud.config.discovery.serviceId指定Config Server在服务发现中的serviceId,默认是configserver ,因此这里写的是前面编写的Config Server 的spring.application.name

电影微服务的配置同上
至此,Config Client已经配置完成。

测试

分别启动Eureka,Config Server,用户微服务与电影微服务。
在Eureka界面可以看到有三个注册的服务:
注册服务
用户微服务与电影微服务启动的端口是git配置文件中设置的端口,访问各各微服务通过正常获取数据:
正常获取数据
说明配置文件已经实现了通过Spring cloud Config 统一管理与获取。