1. 程式人生 > >基於Github搭建SrpingCloudConfig詳解

基於Github搭建SrpingCloudConfig詳解

創建 pass end stat IE 小夥伴 des 版本問題 serve

最近在看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有所幫助。實際生產中比這個復雜,大家可以通過不同的場景搭建不同的配置服務。

基於Github搭建SrpingCloudConfig詳解