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