首頁 > 軟體

基於GitHub搭建SrpingCloudConfig詳解

2020-06-16 16:50:12

最近在看SpringCloud,為了幫助自己學習和記憶,所以寫下這篇文章。

從SpringCloud官方文件上看SpringCloudConfig其實為我們提供設定外部化的一個服務,可以理解成就是個web服務,我們通過請求到web服務上獲取我們所需要的組態檔。

 

我們首先在github上建立一個專案,然後建立幾個組態檔

我建立了3個組態檔,分別對應開發,測試和生產三個環境,

我們組態檔建好之後,開始建立SpringCloudConfig服務

 

我先放一下我的專案結構,不然pom.xml有些小夥伴可能不理解

my-spring-cloud就是最外層專案的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>jipeng.com</groupId>
    <artifactId>my_spring_cloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>my_spring_cloud_config_service</module>
        <module>my_spring_cloud_config_client</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
    </parent>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <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.SR3</spring-cloud.version>
    </properties>

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


    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

    <name>my_spring_cloud</name>
</project>

這裡我們比正常的springboot專案多了一個 spring-cloud-dependencies

這是SpringCloud主包,後面我們SpringCloudConfig的包需要依賴這個,所以版本問題大家需要注意。

下面看下我們my_spring_cloud_config_service專案的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">
    <parent>
        <artifactId>my_spring_cloud</artifactId>
        <groupId>jipeng.com</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>my_spring_cloud_config_service</artifactId>


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

</project>

很簡單比我們正常的web專案多了一個  spring-cloud-config-server

下面再看下我們 spring-cloud-config-server 的application.properties 檔案

#伺服器端口
server.port=8091
#服務名稱
spring.application.name=configService


#服務對應的git地址,就是你git專案地址,你clone的那個地址
spring.cloud.config.server.git.uri=https://github.com/xxx/xxx.git
#git倉庫地址下的相對地址,可以設定多個,用,分割。
spring.cloud.config.server.git.search-paths=/**
#組態檔所在的分支
spring.cloud.config.label=master
#git倉庫使用者名稱
spring.cloud.config.username=xxx
#git倉庫密碼
spring.cloud.config.password=xxx

我們建立一個 ConfigServiceApplication 程式碼如下

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

/**
 * @Author: jipeng
 * @Description:
 * @Date: Created in 2018/6/7 7:54
 */
@EnableConfigServer
@SpringBootApplication
public class ConfigServiceApplication {

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

    }
}

比正常的web專案多了一個 EnableConfigServer 註解,這是一個SpringCloud註解,有了這個註解及時告訴專案這是一個設定服務。好了,到此我們的設定服務已經好了,我們可以啟動專案通過postman來檢驗下我們的成果

 

看下我們的請求地址  http://localhost:8091/configTestService/dev 

再看下github中的組態檔

大家是不是發現了什麼

/configTestService/dev   就是根據我們github中的組態檔名來的  configTestService 為我們的應用名稱   dev 為 環境

現在config伺服器端搭好了,我們搭建用戶端

用戶端的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>my_spring_cloud</artifactId>
        <groupId>jipeng.com</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>my_spring_cloud_config_client</artifactId>

    <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>
        <finalName>my_spring_cloud_config_client</finalName>
    </build>
</project>

比正常的web多了一個 spring-cloud-starter-config

用戶端的application.properties 就兩個設定

server.port:8081

spring.applicaton.name=configclient

用戶端多了一個bootstrap的組態檔,裡面設定的是SpringCloudConfig的相關設定

#設定應用名稱
spring.cloud.config.name=configTestService
#組態檔的版本
spring.cloud.config.profile=test
#設定服務的地址
spring.cloud.config.uri=http://localhost:8091/
#組態檔所在的分支
spring.cloud.config.label=master

建立一個 WebApplication ,程式碼如下

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author: jipeng
 * @Description:
 * @Date: Created in 2018/6/8 7:03
 */
@SpringBootApplication
public class WebApplication {
    public static void main(String[] args){
        SpringApplication.run(WebApplication.class,args);
    }
}

我們建立一個 TestController

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: jipeng
 * @Description:
 * @Date: Created in 2018/6/8 7:52
 */
@RestController
public class TestController {
    @Value("${configtest.version}")
    private String version;

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

都加好了我們啟動專案,留意下啟動日記,就是啟動日記剛開始列印的時候

2018-06-10 21:45:07.420  INFO 8376 --- [          main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://localhost:8091/
2018-06-10 21:45:11.347  INFO 8376 --- [          main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=configTestService, profiles=[dev], label=master, version=9d66adb8d2b7ace9e4933177051b167a7ef49c1a, state=null
2018-06-10 21:45:11.348  INFO 8376 --- [          main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource [name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://github.com/jploveslife/springcloudtest.git/configTestService-dev.properties'}]]
2018-06-10 21:45:11.352  INFO 8376 --- [          main] com.ji.WebApplication                    : No active profile set, falling back to default profiles: default
2018-06-10 21:45:11.369  INFO 8376 --- [          main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@3a5ecce3: startup date [Sun Jun 10 21:45:11 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@10db82ae
2018-06-10 21:45:11.855  INFO 8376 --- [          main] o.s.cloud.context.scope.GenericScope    : BeanFactory id=0537ae00-a03a-35d0-830a-1277fd4d74d0
2018-06-10 21:45:11.913  INFO 8376 --- [          main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$4fec7b02] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

我會發現剛啟動的時候是使用我們的設定服務去獲取的組態檔,這裡面的原理下次講

我們來通過postman驗證下,看設定有沒有過來,我們請求test介面

 

 

 返回1.0.0 和我們組態檔中一直,說明設定生效了。

到此就結束了,沒講多少,都是直接上的程式碼,希望這個文章對大家了解SpringCloudConfig有所幫助。實際生產中比這個複雜,大家可以通過不同的場景搭建不同的設定服務。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-06/152814.htm


IT145.com E-mail:sddin#qq.com