为什么要使用统一配置中心
对于传统ssh/ssi的单体应用来说,使用配置文件来管理所有的配置没有问题。如果使用spring boot来创建单体应用,那么可以有多个配置文件,使用profile来决定使用那个配置文件。但是在微服务架构中,成千上万的微服务配置文件如果放在不同的服务中,那么难以管理,同时需要添加配置的时候也麻烦。基于这个问题,spring cloud提供了统一配置中心来管理所有的配置文件,并且可以随意切换配置文件以及配置文件更新后服务可以获取到最新的配置信息。
简介
Spring cloud config为分布式系统提供了服务端和客户端支持,包含了config server和config client两部分。
Config server用于管理配置中心的所有配置,并且可以获取到配置信息。默认使用git,也可以使用svn等。本案例使用码云作为配置管理中心。
Config client是和config server交互,获取配置信息的。只需要开启注解就可以和config server交互。
前提
首先需要自己创建码云账号,地址:https://gitee.com 。然后在码云中创建一个项目spring-cloud-config在这个项目中创建一个目录config-repo用于存放配置文件。具体如下图:
文件的内容是from=xxx,具体的dev/prod等不同文件的值不一样,主要是区分是否读取到了不同文件的配置信息。
编写config server
Maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
配置文件
server:
port: 7000
# master
spring:
application:
name: microservice-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/xxx/spring-cloud-config
search-paths: config-repo
username: 账号
password: 密码
启动类
启动类只需要添加@EnableConfigServer注解即可。就这样一个配置中心就完成了。我们的服务只需要和这个config server交互就可以获取到码云/git/svn等的配置文件内容。
编写config client
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
配置文件
这里需要特别注意,我们不要在application.properties配置文件中写配置,需要创建一个bootstrap.properties的配置文件。这里创建是因为需要提高配置文件的优先级。这个可以google配置文件级别查看。
server.port=7010
spring.application.name=space
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7000/
配置文件属性说明:
spring.application.name属性是码云/git/svn配置文件的前缀,官方建议配置文件名称和应用名称一致,这样容易区分。
spring.cloud.config.profile属性是定义使用那个配置文件的。
spring.cloud.config.label属性是定义使用那个分支,因为我们提交内容到码云/git/svn是可以创建多个分支,所以需要配置。
spring.cloud.config.uri属性是刚才的config server的访问地址。
这样定义好了就可以直接使用配置文件的内容了。下面我简单展示一下使用。我们定义一个controller来返回配置文件的信息:
@RestController
@RefreshScope
public class PropertiesController {
@Value("${from}")
private String from;
@GetMapping(value = "/from")
public String from() {
return this.from;
}
}
From的值就是从配置中心获取的。使用浏览器返回就可以看到具体的值了。
关注微信公众号(程序员小兔)不定期分享技术