Spring Cloud Config 简介
在Spring Boot项⽬中,默认会提供⼀个application.properties或者 application.yml⽂件,我们可以把⼀些全局性的配置或者需要动态维护的配置写⼊改⽂件,不如数据库 连接,功能开关,限流阈值,服务地址等。为了解决不同环境下服务连接配置等信息的差异,Spring Boot还提供了基于spring.profiles.active={profile}的机制来实现不同的环境的切换。
随着单体架构向微服务架构的演进,各个应⽤⾃⼰独⽴维护本地配置⽂件的⽅式开始显露出它的不 ⾜之处。主要有下⾯⼏点。
配置的动态更新:在实际应⽤会有动态更新位置的需求,⽐如修改服务连接地址、限流配置等。在 传统模式下,需要⼿动修改配置⽂件并且重启应⽤才能⽣效,这种⽅式效率太低,重启也会导致服 务暂时不可⽤。
配置多节点维护:在微服务架构中某些核⼼服务为了保证⾼性能会部署上百个节点,如果在每个节 点中都维护⼀个配置⽂件,⼀旦配置⽂件中的某个属性需要修改,可想⽽知,⼯作量是巨⼤的。
不同部署环境下配置的管理:前⾯提到通过profile机制来管理不同环境下的配置,这种⽅式对于⽇ 常维护来说也⽐较繁琐。
统⼀配置管理就是弥补上述不⾜的⽅法,简单说,最近本的⽅法是把各个应⽤系统中的某些配置放 在⼀个第三⽅中间件上进⾏统⼀维护。然后,对于统⼀配置中⼼上的数据的变更需要推送到相应的服务节点实现动态跟新,所以微服务架构中,配置中⼼也是⼀个核⼼组件,⽽Spring Cloud Config就是⼀ 个配置中⼼组件,并且可以Git,SVN,本地⽂件等作为存储。
Spring Cloud Config 实践
实现最简单的配置中⼼,创建06_cloud_config微服务⼯程,作为配置中⼼的Config Server,同时 使⽤git作为配置存储⽅式,改造之前⽀付微服务⼯程,作为客户端从Config Server获取配置。具体实 现如下。
配置中⼼服务端
创建配置中⼼服务端⼯程,同时使⽤默认git作为存储⽅式。
1. 添加依赖
<?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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lxs.demo</groupId>
<artifactId>06_cloud_config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>06_cloud_config</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 启动器
在启动器中使⽤@EnableConfigServer启⽤ConfigServer
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
3. 配置⽂件
配置⽂件application.yml代码如下。
erver:
port: 9006
spring:
application:
name: cloud-config
cloud:
config:
server:
git:
uri: https://gitee.com/
search-paths: config
default-label: master
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9004/eureka
4. 配置仓库
在git仓库中,创建config⽬录,在config⽬录中创建 app-dev.yml配置⽂件,代码如下。
key1: v1
key2: v2
key3: v3
5. 启动并测试
Spring Cloud Config 有它的⼀套访问规则,我们通过这套规则在浏览器上直接访问就可以。
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
{application} 就是应⽤名称,对应到配置⽂件上来,就是配置⽂件的名称部分,例如我上⾯创建的配置⽂ 件。
{profile} 就是配置⽂件的版本,我们的项⽬有开发版本、测试环境版本、⽣产环境版本,对应到配置⽂件 上来就是以 application-{profile}.yml 加以区分,例如application-dev.yml、application-test.yml、applicationprod.yml。
{label} 表示 git 分⽀,默认是 master 分⽀,如果项⽬是以分⽀做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置⽂件了。
git仓库配置⽂件缓存本地⽬录 c:\Users\Administrator\AppData\Local\Temp\config-repo-4882682414831344447 ,可以通过basedir属性改变。
浏览器访问http://localhost:9006/app-dev.yml,效果如图