Spring Cloud Config支持的配置仓库类型有:Git、svn、数据库、本地文件系统等。
因为有些场景在部署项目时,服务器不能连接外网,所以不能使用git仓库,可以选择使用本地配置文件仓库或者数据库仓库,这里介绍如何使用本地配置文件实现配置中心。
环境准备:
- spring boot 版本:2.1.7.RELEASE
- spring cloud版本:Greenwich.SR1
- 开发环境:idea2019
父工程:
为了方便依赖的版本管理,这里使用父子工程结构,父工程管理各个模块的公共依赖,首先建立父maven工程,pom文件如下:
<?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.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yh</groupId>
<artifactId>exercise</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>exercise</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<modules>
<module>eureka-client</module>
<module>config-server</module>
</modules>
<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>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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>
</plugin>
</plugins>
</build>
</project>
config-server
在父工程上右键,新建module,选择Spring initializr,然后按照普通创建spring boot项目的流程创建新的模块,名称为config-server。模块pom文件如下:
<?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>com.yh</groupId>
<artifactId>exercise</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.yh</groupId>
<artifactId>configserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
为该模块的入口类添加@EnableConfigServer注解开启配置服务器的功能。该模块的配置文件application.yml内容如下:
spring:
application:
name: config-server
profiles:
active: native
cloud:
config:
server:
native:
search-locations: E:/test
server:
port: 9879
这里的active: native就是指我们的配置是读取本地文件,search-locations指定配置文件目录,可配置多个,用逗号分隔,如果要使用相对路径,可以使用**file:**前缀配置,例:search-locations: file:./config,代表jar同目录下的config文件夹。
config-client
新建另外一个子模块,名称为config-client,模块pom文件如下:
<?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>com.yh</groupId>
<artifactId>exercise</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.yh</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
此模块的配置文件名称应该为bootstrap而不是application,可以使用yml文件形式,也可以使用properties文件,我这里使用的yml,内容如下:
server:
port: 6299
spring:
application:
name: config-client
cloud:
config:
uri: http://127.0.0.1:9879
profile: dev
label: master
写一个测试接口,读取配置中心的配置(配置文件后面会介绍),接口内容:
@RestController
public class TestController {
@Value("${server.port}")
String port;
//测试读取配置中心数据
@Value("${testConfig}")
String testConfig;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "yh") String name) {
return "hi " + name + " ,i am from port:" + port+" testConfig:"+testConfig;
}
}
下一步就是创建config-client对应的配置文件,这个配置文件的位置就是上面config-server配置的本地磁盘路径,文件的名称为:config-client-dev.properties(也就是server.application.name的值+“-”+spring.cloud.config.profile的值),这里的写法是固定的,否则读取不到。我们的文件内容为:
testConfig=lalala
先启动config-server,再启动config-client,访问我们的测试接口:
http://localhost:6299/hi?name=yh
可以看到结果:
hi yh ,i am from port:6299 testConfig:lalala
手动刷新配置
在修改配置文件内容后,需要刷新操作来使新配置生效,spring cloud提供了两种方式,一种是手动调用刷新接口,另一种是使用Spring Cloud bus实现自动刷新。这里介绍手动刷新的操作。我们之间调用config-client的/actuator/refresh接口即可(注意必须使用post请求):
http://localhost:6199/actuator/refresh