天天看點

Spring Cloud Config學習總結

    Spring Cloud Config作為分布式系統的配置中心,Config Server預設從git上擷取配置檔案。當Spring應用啟動時,會連接配接上Config Server,從Config Server擷取配置來初始化Spring環境。

    一、建立git倉庫

          1.1 建立遠端git倉庫

               Git建立公開倉庫

               Config Server配置資源庫

          1.2 建立本地git倉庫

$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"
           

在倉庫中加如下格式的檔案。

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

以上端點可以直接通路資源庫的配置檔案

Spring Cloud Config學習總結

比如我上面通路的就是第一種方式,省略的label,也就是master分支。

 application -》 Config Client的spring.application.name,要唯一指定,預設是application;

 profile -》Config Client的spring.profiles.active = config1,config2 ,或者spring.cloud.config.profile= config1,config2

 label -》Config Server的spring.cloud.config.label,預設是master分支,也可以是Tag分支名,commit id;多個以逗号分隔;

 注意:一定要commit,要不然Config Server啟動時,會報如下錯:

Spring Cloud Config學習總結

         原因是沒有預設的master分支。

 二、建立Config Server

        啟動類:

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

    application.properties:

spring.application.name=config-server
#預設是8080端口,為避免沖突,我們自定義一個
server.port=8889

#公開的遠端git倉庫
#spring.cloud.config.server.git.uri=https://github.com/bawcwchen/config/
#本地倉庫
spring.cloud.config.server.git.uri=file:///D:/back/localgit
#按項目搜尋配置檔案
spring.cloud.config.server.git.searchPaths=app1,app2
spring.cloud.config.label=master
#spring.cloud.config.server.git.username=your username
#spring.cloud.config.server.git.password=your password
           

注意,如果spring.cloud.config.server.git.uri用的是windows系統的本地倉庫,以file:///開頭。

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.cj</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.2.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>
    </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>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR6</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>
           

三、 Config Client

        Config Client其實就是我們的分布式系統用戶端應用。

        啟動類:

@SpringBootApplication
@RestController
public class ConfigClientApplication {

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

    /**
     * config server連接配接的遠端資源庫和本地application.properties都提供
     * 優先取config server上配置app1-config1.properties
     * 若沒有,則取application.properties配置
     */
    @Value("${username}")
    private String username;

    /**
     * config server沒有提供該配置,取application.properties
     */
    @Value("${year}")
    private Integer year;

    /**
     * 取config server上配置app1-config2.properties,注意這裡是資源庫上另外一個配置檔案
     */
    @Value("${address}")
    private String address;

    /**
     * 從application.properties, application.yml, application-*.properties取全局配置。
     */
    @Value("${greeting}")
    private String greeting;

    @RequestMapping(value = "/hello")
    public String hello() {
        return username + ":" + year + ":" + address + ":" + greeting;
    }
}
           

PS:

  git資源庫上以application開頭的配置檔案,會被所有Config Client共享,自動擷取該配置檔案。如下:

Spring Cloud Config學習總結

  Config Client啟動時,可能報錯,因為從git倉庫擷取配置時,網絡性能不好,多試幾次就好了。

  application.properties:

server.port=8881

username = 張三
year = 18

#spring cloud配置,最好放到bootstrap.properties裡,要不然有問題,
#比如:這裡spring.cloud.config.uri不生效,還是去連接配接的預設的8888端口
#spring.cloud.config.label=master
#spring.cloud.config.profile= config1,config2  
#spring.cloud.config.uri= http://localhost:8889/
           

 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.forezp</groupId>
    <artifactId>config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.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>
    </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>Dalston.RC1</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>
           

 bootstrap.properties:

  這個檔案是用戶端應用啟動的引導檔案,裡面的内容最好單獨出來,不要放到application.properties裡去,要不然會有一些莫名其妙的問題。

#這個配置項不要像純springboot應用那樣放到application.properties裡,
#要不然啟動時,如果application.properties沒有配置項,會報找不到config server上的配置項
spring.application.name= app1

spring.cloud.config.label=master

#以下2種方式指定配置檔案都行
#spring.cloud.config.profile= config1,config2
spring.profiles.active = config1,config2  //擷取多配置檔案

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

           

 當用戶端啟動時,它的正常啟動日志如下這樣:

2018-05-27 16:26:37.343  INFO 156880 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8889/
2018-05-27 16:26:37.740  INFO 156880 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=app1, profiles=[config1, config2], label=master, version=4531e6fdf74c00fa9f122b8fe00bf437816dd786, state=null
2018-05-27 16:26:37.740  INFO 156880 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource [name='configService', propertySources=[MapPropertySource [name='configClient'], MapPropertySource [name='file:///D:/back/localgit/app1/app1-config2.properties'], MapPropertySource [name='file:///D:/back/localgit/app1/app1-config1.properties']]]
           

當用戶端啟動時,會連接配接到Config Server,Server的輸出日志如下:

Spring Cloud Config學習總結

如果連接配接的是Git遠端倉庫,它會在本地的${user.home}\AppData\Local\Temp下倉庫本地倉庫。

PS:不用git倉庫,直接從本地檔案系統取配置。也可以從svn上取配置沒試過。

Config Server配置修改如下:

spring.profiles.active=native
spring.cloud.config.server.native.searchLocations = file:///D:/back/localgit/app1,file:///D:/back/localgit/app2
      

Config Client配置修改如下:

#spring.cloud.config.label=master
           

因為不是git倉庫,是以不用指定label了。

spring.cloud.config.server.native.searchLocations 也可以指定到[classpath:/, classpath:/config] 下。

通路位址:

http://localhost:8881/hello

Spring Cloud Config學習總結

項目源碼位址:

https://github.com/bawcwchen/config-demo.git

繼續閱讀