1. 概要
- 项目采用微服务架构,将原有的单一web项目拆分成若干个微服务;每个微服务里,都有自己的springboot配置;
- 微服务上线后,开始现场部署,悲剧了开始了。。。实施人员需要将20几个微服务jar包逐个解压,然后修改里面的配置信息,比如:数据库地址,redis地址,RabbitMQ地址等;如果数据库地址等有改动,还是将这20几个jar包,逐一改动;实在是不方便;开发经理强烈要求:必须优化微服务配置管理;
- 于是,我便开始了优化微服务配置的任务;
2. 教程
springboot是支持配置集中管理的,下面具体介绍一下集成方法。
2.1 搭建配置中心服务端
- 既然想实现统一管理各个微服务的配置,那么就得有一个集中管理配置的服务。
- 搭建一个新的springboot项目,然后引入相应的springboot依赖就可以了,比较简单。
- 我是直接将配置中心集成到Euraka服务里了,因为我们项目的微服务jar目前就已经20几个了,太多了,索性直接将配置中心集成到Euraka里,减少维护成本。
2.1.1 POM.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.1.2 修改启动类
给启动类添加 @EnableConfigServer 注释,声明该项目作为配置中心服务端:
@EnableConfigServer
@EnableEurekaServer
@SpringBootApplication
public class WsfyCenterApplication {
public static void main(String[] args) {
SpringApplication.run(WsfyCenterApplication.class, args);
}
}
2.1.3 修改配置文件
配置中心服务端的配置文件 application.yml,需要增加如下配置:
server:
port: 8761
spring:
profiles:
active: native #配置中心-配置文件仓库-本地(除了本地,还有svn,git等配置)
cloud:
config:
server:
native:
search-locations: E:/WsfyConfigResporties #配置中心-配置文件仓库-地址
- 配置中心需要一个地方来存储各个微服务的配置文件;可以通过spring.profiles.active配置项指定配置仓库的类型;仓库存储类型通常有:本地存储、svn、git等。
- 通过配置项spring.cloud.config.server.native.search-locations指定本地存储路径。我是将本地的e盘下的WsfyConfigResporties文件夹作为配置中心存储路径。
- 我们项目采用的本地存储。也就是说将各个微服务的配置文件,存储到配置中心所在的服务器上某个路径下。因为用户现场是没有git和svn的。
2.1.4 提取出各个微服务的配置文件到配置中心
-
将各个微服务的配置文件application.yml放到配置项spring.cloud.config.server.native.search-locations指定的路径下。
-
各个微服务的配置文件,在配置中心存储路径下的命名规则,springboot是有要求的。规则如下:
{微服务名称} - {运行环境的标识}.yml -
微服务名称,对应各个微服务的配置文件里的spring.application.name属性;
spring:
application:
name: wsfy-api
每个微服务就是通过自己的服务名称,在配置中心读取自己对应的配置文件的。
- 运行环境的标识,是指微服务指定运行环境的标识。比如某个微服务A,它有多个环境的配置文件:
环境名称 | 对应的配置文件 | 运行环境的标识 |
---|---|---|
开发环境 | application-dev.yml | dev |
测试环境 | application-test.yml | test |
生产环境 | application-prod.yml | prod |
配置文件名称里的dev、test、prod就是运行环境的标识。
- 既然将各个微服务的配置文件提取到了jar包之外,那么各个微服务项目里的配置文件application.yml里就没必要再保留这些冗余的配置了,避免增加维护成本,可以清除了。每个微服务的配置文件里,我只保留了项目名配置项:
2.1.5 提取公共配置文件
-
每个微服务的配置文件里,都有数据库地址、redis地址、RabbitMQ地址等公共配置。为了减少维护成本,我将这些公共配置提取到一个公共配置文件里:wsfy-master-config.yml,文件名称自己随便定义哈。
-
我的配置中心的存储路径下,各个微服务文件列表示例如下:
wsfy-master-config.yml
wsfy-api-dev.yml
wsfy-api-prod.yml
wsfy-user-dev.yml
wsfy-user-prod.yml
wsfy-cache-dev.yml
wsfy-cache-prod.yml -
至此,配置中心服务端搭建完毕。启动项目,浏览器访问http://{配置ip}:{prot}/配置文件名,可以查看该配置文件:
2.2 各个微服务连接配置中心
2.2.1 pom.xml依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.2.2 连接配置中心
- 在每个微服务的src/main/resources路径下新建bootstrap.yml配置文件,在这里配置一些与配置中心有关的信息,从而使微服务可以访问配置中心里的配置文件。
- 注意:新建的配置文件名,必须为bootstrap.yml。在springboot里,bootstrap.yml的优先级比application.yml高。如果将配置中心的相关配置写到application.yml是不会生效的,只有写在bootstrap.yml里才会生效。读者可以网上搜索application.yml与bootstrap.yml的区别。
- bootstrap.yml配置如下:
spring:
application:
name: wsfy-api (3)
config:
location: http://{配置中心IP地址}:{配置中心服务端口}/wsfy-master-config.yml (2)
cloud:
config:
uri: http://{配置中心IP地址}:{配置中心服务端口} (1)
profile: prod (4)
(1)spring.cloud.config.uri:对应配置中心服务端地址。告诉当前微服务,去哪里拿配置。
(2)spring.config.location:对应配置中心服务端,公共文件的访问地址。如果在浏览器,这个地址打不开,说明你的配置中心服务端启动有问题,需要排查一下。
(3)spring.application.name:告诉配置中心,哪个文件是我的。别给我读取别的微服务的配置文件。
(4)spring.cloud.config.profile:告诉配置中心,我要读取哪个运行环境的配置文件。
- 至此微服务客户端访问配置中心完毕。可以启动了。
笔记
1.同一配置,公共文件和jar自己的文件,哪个优先级高?
同一个配置在公共配置文件和jar自己的配置文件里,都进行了配置,那么jar自己的文件里的配置优先级高,会覆盖公共文件里的配置;
比如配置项test.string在配置中心里的公共文件wsfy-master-config.yml 和 wsfy-api-dev.yml 都进行了配置,那么启动wsfy-api项目,哪个配置会生效呢,本地测试了一下,是wsfy-api-dev.yml里的配置生效了。
2.相对于公共文件,或相对于个jar自己的文件,新增的配置是否有效?
在公共配置文件,或者jar自己的文件里新增的配置,都会生效;项目读取的两个配置文件的合集;并且公共配置文件里的配置信息,是全局的,可以被其他jar读取;