SpringCloud Config分布式配置中心
SpringCloud Config 分布式配置文件中心
为什么要使用分布式的配置中心
产生背景:在微服务中如果使用传统的方式管理配置文件,配置文件管理起来就会非常麻烦跟复杂,如果有100个服务,那不是要写100个application.yml吗。而且,如果生产环境配置文件可能需要发生改变的时候,就得重新打war包,重新读取配置信息到jvm内存中,非常的麻烦,因此就有了分布式的配置中心
什么是分布式配置中心
在微服务中使用同一个服务器管理所有服务的配置文件信息,能够实现后台可管理,当服务器正在运行的时候,如果配置文件需要发生改变。可以实现不需要重启服务器就可以实时更改配置文件信息。
分布式配置中心框架的对比
阿波罗:携程写的分布式配置中心,有专门的图形界面可管理配置文件信息,配置文件信息存放在数据库里面
SpringCloud Config:没有后台可管理分布式配置中心的,配置文件信息存放在版本控制器里面(git | svn)
使用Zookeeper实现分布式配置中心:持久节点+事件通知 实现
分布式配置中心原理
分布式配置中心需要哪些组件
- web管理系统:后台可以使用图形界面管理配置文件,SpringCloud Config中没有图形化界面管理配置文件
- 存放分布式配置文件服务器(持久存储服务器):SpringCloud Config使用版本控制器存放配置文件信息
- ConfigServer缓存配置文件服务器(临时缓存存放)
- ConfigClient读取ConfigServer配置文件信息
思考:为什么要设计一层ConfigServer?
目的是为了缓存git上的配置文件信息
使用
搭建远程git仓库
为了能够存放持久化配置文件信息,这里使用gitee,新建一个仓库就行了
git环境上项目以文件夹进行区分
例如:
member_config会员服务配置文件夹
order_config 订单服务配置文件夹
搭建ConfigServer
Maven依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jx.cloud</groupId> <artifactId>springcloud_configServer2.0</artifactId> <version>1.0-RELEASE</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR2</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- eureka客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- config server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
配置application.yml
server: port: 8001 spring: application: name: config-server cloud: config: server: git: # configServer读取git环境的地址 uri: https://gitee.com/traeric/distribute.git username: gitee登录邮箱 password: gitee密码 # 读取配置文件的目录名称 search-paths: - gkconfig # 读取的分支环境 label: master # 注册中心地址 # 为什么要注册到注册中心,因为configClient去访问configServer是通过别名访问的 eureka: client: service-url: defaultZone: http://127.0.0.1:8100/eureka
配置文件命名规范以及发布配置文件
在git环境上创建配置文件的命名规范:
服务名称-环境.yml
环境大致有:
公司项目中环境是如何区分的
- dev 开发环境
- sit 测试环境
- pre 预发布环境
- prd 准生产环境
搭建ConfigClient
Maven依赖

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jx.cloud</groupId> <artifactId>springcloud_configClient2.0</artifactId> <version>1.0-RELEASE</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR2</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Eureka客户端依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- config client依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
创建bootstrap.yml文件(替换掉application.yml)
在resource目录下建立bootstrap.yml文件
server: port: 8002 spring: application: # 服务名称,必须和git上的配置文件名相同 # 例如文件名为:test-configClient-sit.yml # 那么这里的服务名即:test-configClient name: test-configClient cloud: config: # 读取的环境 profile: sit discovery: # ConfigServer在注册中心上的名字 service-id: config-server # 开启读取权限 enabled: true # 注册中心地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka
从ConfigServer中获取配置信息
虽然配置文件在ConfigServer上,但是使用起来跟配置文件在resource/application.yml中没有什么区别,跟配置文件在resource中一样使用
@RestController public class TestController { @Value("${jxInfo}") private String jxInfo; @RequestMapping("/getInfo") public String getInfo() { return jxInfo; } }
然后访问对应的路径即可
配置文件信息实时刷新
默认情况下不能及时的获取实时变更的文件信息
SpringCloud分布式配置中心可以采用手动刷新或者自动刷新
手动刷新:需要人工调用接口,读取最新配置文件(监控中心)
自动刷新:消息总线进行实时通知(SpringCloud Bus)
手动刷新和自动刷新都不需要重启服务器
actuator端点刷新数据
Maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在bootstrap.yml中新增开启监控断点
management:
endpoints:
web:
exposure:
include: "*" # 监控所有
刷新前提
在需要刷新的Bean上添加@RefreshScope注解
@RestController @RefreshScope public class TestController {
手动刷新
在需要刷新的时候只需要使用POST请求/actuator/refresh即可