文章目录
创建配置服务器
pom如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>config-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.16.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</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>Edgware.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</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>
激活应用
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
主要是添加@EnableConfigServer注解开启配置服务器
修改配置文件
接下来修改配置文件:
spring.application.name=config-server
server.port=9090
# 管理端安全失效
management.security.enabled=false
此时如果启动应用会报错Caused by: java.lang.IllegalStateException: You need to configure a uri for the git repository
说是要配置一个git仓库,这里我们只介绍远程Git仓库的配置
配置远程Git仓库
在码云上新建一个公开仓库,让后通过新建文件新建如下两个配置文件

demo.yml
demo-prod.yml
然后在配置服务器的配置文件中添加:
# git仓库的地址
spring.cloud.config.server.git.uri=https://gitee.com/safika/spring-cloud-config.git
# 使本地的配置保持最新的
spring.cloud.config.server.git.force-pull=true
这里因为我码云上的项目是公有的,因此不需要配置用户名和密码
接下来,重启配置服务器就不会报错了。

直接访问demo.yml会报错(也可以通过demo-default.yml访问)
可以在后面跟上"-x" x可以是任何字母(还可以是数字)

如果访问demo-prod.yml

就会读取相应的配置文件。
总结,如果能获取到配置文件则返回,获取不到则返回默认的(demo.yml)。
同时,demo-prod.yml会继承demo.yml的配置,比如我在demo.yml中增加一个属性

因此,公共配置可以放到默认配置文件里面。
获取配置信息的维度
- {application}: 配置客户端应用名称,即配置项:spring.application.name
- {profile}: 当前激活的Profile, 配置项: spring.profiles.active
- {label}: 版本信息,git中的分执名称
创建配置客户端
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http:///POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>config-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>config-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.17.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</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>Edgware.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>
<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>
将application.properties替换为bootstrap.yml
spring:
cloud:
config:
name: config-client # 配置客户端应用关联的应用
profile: prod
uri: http://127.0.0.1:9090/ #配置服务器的uri
如果没有配置,则会取spring.application.name的值
同时在配置服务器关联的git仓库上添加下面几个文件:
config-client.yml
management:
security:
enabled: false
config-client-test.yml
config-client-prod.yml
重启配置服务器,接着启动配置客户端

因为刚才的profile是prod,因此获取的端口是10000
自动刷新
增加lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
修改启动类:
@Slf4j
@SpringBootApplication
public class ConfigClientApplication {
private final ContextRefresher contextRefresher;
@Autowired
public ConfigClientApplication(ContextRefresher contextRefresher) {
this.contextRefresher = contextRefresher;
}
/**
* 1秒钟更新一次,可用于自动刷新配置,不需要手动post /refresh方法
* @return
*/
@Scheduled(fixedRate = 1000L)
public void update() {
Set<String> keys = contextRefresher.refresh();
if (!keys.isEmpty()) {
log.info("Updated config keys:{}",keys);
}
}
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
通过定时调用ContextRefresher#refresh方法来执行刷新。
这里用了@Slf4j注解来打印日志,这是在lombok中才有的。
当我修改了git仓库相应的配置文件后,可以发现有如下打印:
Updated config keys:[config.client.version, ]
这样可以不需要配置github上的webhook。
项目地址
https://gitee.com/safika/springcloud-learn