文章目录

创建配置服务器

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仓库

在码云上新建一个公开仓库,让后通过新建文件新建如下两个配置文件

SpringCloud 配置服务器_xml

demo.yml

info:
hello,default

demo-prod.yml

info:
hello,prod

然后在配置服务器的配置文件中添加:

# git仓库的地址
spring.cloud.config.server.git.uri=https://gitee.com/safika/spring-cloud-config.git
# 使本地的配置保持最新的
spring.cloud.config.server.git.force-pull=true

这里因为我码云上的项目是公有的,因此不需要配置用户名和密码

接下来,重启配置服务器就不会报错了。

SpringCloud 配置服务器_xml_02

直接访问demo.yml会报错(也可以通过demo-default.yml访问)

可以在后面跟上"-x" x可以是任何字母(还可以是数字)

SpringCloud 配置服务器_xml_03

如果访问demo-prod.yml

SpringCloud 配置服务器_maven_04

就会读取相应的配置文件。

总结,如果能获取到配置文件则返回,获取不到则返回默认的(demo.yml)。

同时,demo-prod.yml会继承demo.yml的配置,比如我在demo.yml中增加一个属性

SpringCloud 配置服务器_spring_05

因此,公共配置可以放到默认配置文件里面。

获取配置信息的维度

  • {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

server:
port: 10001

config-client-prod.yml

server:
port: 10000

重启配置服务器,接着启动配置客户端

SpringCloud 配置服务器_xml_06

因为刚才的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​