Spring Cloud Config 是用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息,加密、解密信息等访问接口。而客户端则是微服务架构中的各个微服务应用或基础设施,它通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。

构建配置中心

1.通过Spring Cloud Config构建一个分布式配置中心十分容易,只需要三步:

1.创建一个基础的Spring Boot工程,命名为config-server,并在pom.xml中引入下面的依赖:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</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>2.0.5.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>Finchley.SR1</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-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>

2.在主类上添加@EnableConfigServer注解,开启Spring Cloud Config的服务端功能。

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

3.在application.properties中添加配置服务的基本信息以及Git仓库的相关信息:

spring.application.name=config-server
server.port=7001

spring.cloud.config.server.git.uri=你的仓库地址
spring.cloud.config.server.git.search-paths=config-repo
spring.cloud.config.server.git.username=(git/github账号)
spring.cloud.config.server.git.password=(git/github密码)
spring.cloud.config.server.git.uri:配置Git仓库位置
spring.cloud.config.server.git.search-paths:配置仓库路径下的相对搜索位置,可以配置多个。
spring.cloud.config.server.git.username:访问Git仓库的用户名
spring.cloud.config.server.git.password:访问Git仓库的用户密码

这样简单地一个服务端配置就完成了。

如果将通过file://前缀来设置为一个文件地址(在Windows系统中,需要使用file:///来定位文件内容。)比如:

spring.cloud.config.server.git.uri=file://${user.home}/config-repo

其中,${user.home}代表当前用户的所属目录。file://配置的本地文件系统方式适用于本地开发调试。

下面我在我的git仓库下创建名为config-repo的文件夹,然后根据不同的环境新建了4个配置文件

里面的属性分别为:

from=git-default-1.0
from=git-dev-1.0
from=git-prod-1.0
from=git-test-1.0

访问配置信息的URL与配置文件的隐射关系如:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

上面的url会映射{application}-{profile}.properties对应的配置文件,其中{label}对应Git上不同的分支,默认为master。如下面的url:http://localhost:7001/didispace/master

config-server通过Git在本地仓库暂存,可以有效防止Git仓库出现故障而引起无法加载配置信息的情况。

客户端配置映射

1.首先创建Spring Boot应用,命名为config-client,其pom.xml如:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</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>2.0.5.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>Finchley.SR1</spring-cloud.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>

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

2.主类如:

@SpringBootApplication
public class ConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

3.新建bootstrap.properties配置,来指定获取配置文件的config-server的位置:

server.port=7002

spring.application.name=didispace
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
spring.cloud.config.profile:对应配置文件规则中的{profile}部分。
spring.application.name:对应配置文件规则中的{application}部分。
spring.cloud.config.label:对应配置文件规则中的{label}部分。
spring.cloud.config.uri:配置中心config-server的地址。

(这些属性配置必须在bootstrap.properties中,这样config-server中的配置信息才能被正确加载。)

4.新建一个控制器:

@RefreshScope
@RestController
public class TestController {

    @Value("${from}")
    private String from;

    @Autowired
    private Environment environment;

    @RequestMapping("/from2")
    public String from2(){
        return environment.getProperty("from","undefined");
    }

    @RequestMapping("/from")
    public String from(){
        return this.from;
    }
}

根据上面的配置,我们可以获取didispace-dev.properties文件的配置内容。可以继续通过修改bootstrap.properties中的配置内容来获取不同的配置服务中的配置规则。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐