天天看点

Spring Boot+Spring Cloud基础入门(七)分布式配置中心——Spring Cloud Config

Spring Cloud Config

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。

Spring Cloud Config中的远程Git仓库,支持的有很多,本地局域网的SVN,远程的有:GitHub:https://github.com/、码云:https://gitee.com/ 、开源中国:http://git.oschina.net/、 GitLab:http://www.gitlab.org/等等。

本文就以远程的GitHub为例,进行介绍。

搭建Config Server项目

新建Model项目–Config-Server,引入spring-cloud-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>cn.ponytech</groupId>
    <artifactId>config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.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.RELEASE</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>
           

在项目的入口,项目启动类中,添加@EnableConfigServer注解,表示打开ConfigServer。

再修改properties文件,配置如下:

server.port=
spring.application.name=config-server
spring.cloud.config.server.git.uri=https://github.com/mingwei-cheng/SpringCloud.git
spring.cloud.config.server.git.searchPaths=SpringCloud
spring.cloud.config.label=master
#spring.cloud.config.username=
#spring.cloud.config.password=
           

当你的仓库为公有仓库时,username和password可以不指定,当其为私有仓库时,需要指定这两项。

我们在GitHub仓库中,新建两个文件:

application-dev.properties

This is Spring Cloud Config dev

application-user.properties

username=Cheng MingWei

password=SpringCloud

启动项目,访问http://localhost:9006/application/dev,这里的地址,与文件名相对应,路径的根目录为配置文件中spring.cloud.config.server.git.searchPaths所指定的,”-“可以用“/”来替代,当前的写法下“.properties”可以不写,浏览器中显示:

{“name”:”application”,”profiles”:[“dev”],”label”:master,”version”:”0cbfb3a01dbb96742bc9ffe47f245daf944211d1”,”state”:null,”propertySources”:[{“name”:”https://github.com/mingwei-cheng/SpringCloud.git/application-dev.properties“,”source”:{“This”:”is Spring Cloud dev”}}]}

以http://localhost:9006/application-dev.properties的形式访问时 ,显示:

This is Spring Cloud Config dev

这样可以证明,我们已经连接上了GitHub仓库。

访问路径映射

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

搭建Config Client项目

新建Model项目–Config-Client,引入spring-cloud-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>cn.ponytech</groupId>
    <artifactId>config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.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.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>
           

在项目启动类中,新建一个方法user,并添加@RestController注解。

@SpringBootApplication
@RestController
public class ConfigClientApplication {

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

    @Value("${username}")
    String username;
    @Value("${password}")
    String password;
    @RequestMapping(value = "/user")
    public String user(){
        return "您好,您用户名为:"+username+",密码为:"+password;
    }
}
           

再对properties配置文件进行修改。

server.port=9007

spring.application.name=config-client

项目的基础信息写在自动生成的 application.properties文件中,SpringCloud ConfigServer的默认端口号为8888,我们如果需要修改这个端口号,需要新建一个叫bootstrap.properties的文件,在其中再指定好端口号,访问的文件。

spring.cloud.config.label=master

spring.cloud.config.profile=user

spring.cloud.config.uri=http://localhost:9006/

接下来我们访问http://localhost:9007/user,出现:

您好,您用户名为:Cheng MingWei,密码为:SpringCloud

说明我们的Config-Client从Config-Server中获取到了值,而Config-Server中并没有这个配置文件,足以证明,是从我们指定的Git仓库中获取到的。

继续阅读