1. 配置中心简介
在常规的开发中,每个微服务都包含代码和配置。其配置包含服务配置、各类开关和业务配置。如果系统结构中的微服务节点较少,那么常规的代码+配置的开发方式足以解决问题。当系统逐步迭代,其微服务会越来越复杂,慢慢演化成网状依赖结构,这个时候常规的代码+配置的开发方式就并不合适了,因为还要考虑整体系统的扩展性、伸缩性和耦合性等。这些问题中,配置的管理也是非常麻烦的。
如果还是以常规开发形式管理配置,则要承担反复修改编译代码、重启系统、重新打包等风险。所以,一个可以集中管理,带有版本控制的配置中心应运而生。
spring cloud config就是一个配置中心。其采用集中式管理每个微服务的配置信息,并使用GIT等版本仓库统一存储配置内容,实现版本化管理控制。微服务与配置中心使用rest方式交互来实现可扩展的配置服务。
spring cloud config配置中心解决了微服务系统的配置中心化、配置版本控制、平台独立、语言独立等问题,其特性如下:
提供服务端和客户端支持(spring cloud config server和spring cloud config client)
集中式管理分布式环境中的配置信息
基于spring环境提供配置管理,与spring系列框架无缝结合
可用于任何语言开发环境
默认基于GIT仓库实现版本控制
2. 搭建config-server
- 创建config-server工程,并添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 创建main方法
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableConfigServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- 添加配置项
spring:
application:
name: config-server
cloud:
config:
server:
git:
# Git repository configure
# 远程仓库是用于集中管理各微服务配置文件的位置。配置文件需要通过GIT管理工具上传到GIT仓库中。配置文件命名有特有的规则,常见如下:
# applicationName-profile.properties
# applicationName-profile.yml
# applicationName是被管理配置文件的微服务服务命名,即spring.application.name
# profile是被管理配置文件的微服务环境,如开发环境的dev,测试环境的test等。如果未定义profile代表默认环境default。
# 配置Git远程仓库地址
uri: https://gitee.com/PegasusKID_admin/config.git
# 如果远程仓库是公开的,不需要提供用户名和密码,如果是私有的,需要提供
username: admin
password: 123456
server:
port: 8001
eureka:
client:
service-url:
defaultZone: http://admin:123456@127.0.0.1:8761/eureka
浏览器测试配置文件内容获取
从config server中获取配置文件有固定的访问方式。其格式为:
http://config-server-ip:port/applicationName/profile[/label]
如:
http://localhost:8001/config-server/application.yml
http://localhost:8001/config-server/prod
http://localhost:8001/config-server/default
config-server-ip - 配置中心服务端IP
applicationName - 服务应用名,代表的是配置中心客户端服务命名,就是真正的服务应用中的spring.application.name值。也是配置文件的核心命名。
profile - 环境命名,代表的是配置中心客户端使用的具体环境,和之前课程中的多环境内容一致。也是配置文件的核心命名。
根据applicationName和profile的含义,决定了GIT仓库中保存的配置文件命名是有要求的,配置文件命名要求是:applicationName[-profile].properties | applicationName[-profile].yml。提供固定的命名规则是用于配置中心客户端和服务端友好交互定义的。
label - 是GIT中的分支命名,默认为master,即主干。如果不是主干分支,必须提供分支命名。
如:分支名称是abc,applicationName是testApp,环境是dev,那么请求路径是:http://config-server-ip:port/testApp/dev/abc
3. 搭建config-client
a. 被管理配置文件的微服务称为spring-cloud-config-client,其本身就是一个普通的微服务,只是配置文件由spring-cloud-config-server集中管理。这个微服务应用必须依赖spring-cloud-starter-config启动器资源,否则无法访问spring-cloud-config-server来获取远程配置内容。
b. spring-cloud-config-client应用必须提供当前服务的基础配置内容,如服务名称、服务端口、Eureka注册中心等,同时还必须配置访问哪一个spring-cloud-config-server。而当前应用的配置由被集中管理,所以全局配置文件命名修改为bootstrap.yml。bootstrap配置文件也是spring-cloud的全局配置文件,其加载优先级高于application系列全局配置文件,spring-cloud-config-client应用启动的时候先根据bootstrap配置来设置本地应用最基础的环境,再根据bootstrap中配置的远程spring-cloud-config-server信息来远程加载被集中管理的配置文件。
- 添加maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 创建配置文件bootstrap.yml(bootstrap.yml文件的加载顺序优先于application.yml文件)
eureka:
client:
service-url:
defaultZone: http://admin:123456@127.0.0.1:8761/eureka/
spring:
cloud:
config:
discovery:
# 开启配置中心搜索
enabled: true
# 配置config-server配置中心的服务名称
service-id: CONFIG-SERVER
# 配置要从配置中心获取的配置文件具体环境,默认为default
profile: dev
# 配置GIT中的分支名称
label: master
application:
name: eureka-client-consumer
- 创建application.yml文件
server:
port: 80
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
EUREKA-CLIENT-PRODUCER:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
feign:
compression:
request:
enabled: true
mime-types: ${server.compression.mime-types}
min-request-size: 2048
response:
enabled: true
httpclient:
enabled: true
hystrix:
enabled: true
ribbon:
ConnectTimeout: 5000
ReadTimeout: 5000
a:
b: ${test.name}
- 在git上创建对应的配置文件, 文件名必须和消费者的spring.application.name保持一致
eureka-client-consumer-dev.yml
test:
name: prod
- 直接在代码中使用即可,如:
@Value("${test.name}")
private String testName;
或
@Value("${a.b}")
private String ab;
四、补充
a. 加载多个配置文件,指定配置文件命名,不再使用spring.application.name查找配置文件,而是使用配置内容找指定的配置文件。(常用, 多个文件用逗号隔开)
在client端的bootstrap.yml配置spring.cloud.config.name=fileName1,fileName2
b. 检索多个目录中的同名配置文件,常用于分目录管理多环境配置文件的情况下,如:dir1中保存default配置,dir2中保存dev配置,dir3中保存test配置。配置文件命名规则不变,默认还是applicationName[-profile].properties。
配置在server端: spring.cloud.config.server.git.search-paths=dir1,dir2,dir3