1. 程式人生 > >分散式配置中心Spring Cloud Config初窺(15)

分散式配置中心Spring Cloud Config初窺(15)

轉自 https://blog.csdn.net/u012702547/article/details/77823434

這個系列我感覺真的太好了,可以一步一步的瞭解spring cloud 的搭建以及更深層次的東西,對想學這門技術的朋友真的入門特別的快,感謝這位大哥的分享,我也會持續的更新過來。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

隨著我們的分散式專案越來越大,我們可能需要將配置檔案抽取出來單獨管理,Spring Cloud Config對這種需求提供了支援。Spring Cloud Config為分散式系統中的外部配置提供伺服器和客戶端支援。我們可以使用Config Server在所有環境中管理應用程式的外部屬性,Config Server也稱為分散式配置中心,本質上它就是一個獨立的微服務應用,用來連線配置倉庫並將獲取到的配置資訊提供給客戶端使用;客戶端就是我們的各個微服務應用,我們在客戶端上指定配置中心的位置,客戶端在啟動的時候就會自動去從配置中心獲取和載入配置資訊。Spring Cloud Config可以與任何語言執行的應用程式一起使用。伺服器儲存後端的預設實現使用git,因此它輕鬆支援配置資訊的版本管理,當然我們也可以使用Git客戶端工具來管理配置資訊。本文我們就先來看下Spring Cloud Config的一個基本使用。


本文是Spring Cloud系列的第二十二篇文章,瞭解前二十一篇文章內容有助於更好的理解本文:

1.使用Spring Cloud搭建服務註冊中心 
2.使用Spring Cloud搭建高可用服務註冊中心 
3.Spring Cloud中服務的發現與消費 
4.Eureka中的核心概念 
5.什麼是客戶端負載均衡 
6.Spring RestTemplate中幾種常見的請求方式 
7.RestTemplate的逆襲之路,從傳送請求到負載均衡 
8.Spring Cloud中負載均衡器概覽 
9.Spring Cloud中的負載均衡策略

 
10.Spring Cloud中的斷路器Hystrix 
11.Spring Cloud自定義Hystrix請求命令 
12.Spring Cloud中Hystrix的服務降級與異常處理 
13.Spring Cloud中Hystrix的請求快取 
14.Spring Cloud中Hystrix的請求合併 
15.Spring Cloud中Hystrix儀表盤與Turbine叢集監控 
16.Spring Cloud中宣告式服務呼叫Feign 
17.Spring Cloud中Feign的繼承特性 
18.Spring Cloud中Feign配置詳解 
19.Spring Cloud中的API閘道器服務Zuul 
20.Spring Cloud Zuul中路由配置細節 
21.Spring Cloud Zuul中異常處理細節


本文假設小夥伴們已經有一個GitHub或者碼雲的賬號了,並且對Git的一些基本操作命令也已經熟悉了。

構建配置中心

首先我們來構建一個配置中心,方式很簡單,建立一個普通的Spring Boot專案,叫做config-server,建立好之後,新增如下依賴:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
    <spring-cloud.version>Dalston.SR3</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
            <version>1.2.3.RELEASE</version>
    </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>

然後在入口類上新增@EnableConfigServer註解,表示開啟配置中心服務端功能,如下:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

然後在application.properties中配置一下git倉庫的資訊,為了簡單,我這裡就不自己搭建git服務端了,直接使用GitHub(當然也可以使用碼雲),這裡需要我首先在我的Github上建立一個名為scConfig的專案,建立好之後,再做如下配置:

spring.application.name=config-server
server.port=2007
spring.cloud.config.server.git.uri=https://github.com/lenve/scConfig.git
spring.cloud.config.server.git.search-paths=config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password=password

前兩行配置的含義就不用我多說了,我說下後面四行配置的含義,如下:

1.uri表示配置中心所在倉庫的位置 
2.search-paths表示倉庫下的子目錄 
3.username表示你的GitHub使用者名稱 
4.password表示你的GitHub密碼

做好這些之後我們的配置中心服務端就建立好了。

構建配置倉庫

接下來我們需要在github上設定好配置中心,首先我在本地找一個空資料夾,在該資料夾中建立一個資料夾叫config-repo,然後在config-repo中建立四個配置檔案,如下:

這裡寫圖片描述

四個檔案中的內容分別如下:

這裡寫圖片描述

OK,然後回到test目錄下,依次執行如下命令將本地檔案同步到Github倉庫中,如下:

這裡寫圖片描述

如此之後,我們的配置檔案就上傳到GitHub上了。此時啟動我們的配置中心,通過/{application}/{profile}/{label}就能訪問到我們的配置檔案了,其中application表示配置檔案的名字,對應我們上面的配置檔案就是app,profile表示環境,我們有dev、test、prod還有預設,label表示分支,預設我們都是放在master分支上,我們在瀏覽器上訪問結果如下:

這裡寫圖片描述

OK,從這裡我們看到了我們放在倉庫中的配置檔案。JSON中的name表示配置檔名application的部分,profiles表示環境部分,label表示分支,多了一個version,實際上就是我們GitHub上提交資訊時產生的版本號,當我們訪問成功後,我們還可以看到控制檯列印瞭如下日誌:

這裡寫圖片描述

實際上是配置中心通過git clone命令將配置檔案在本地儲存了一份,這樣可以確保在git倉庫掛掉的時候我們的應用還可以繼續執行,此時我們斷掉網路,再訪問http://localhost:2007/app/prod/master,一樣還可以拿到資料,此時的資料就是從本地獲取的。

客戶端配置

服務端搞好了,接下來我們來看看怎麼樣在客戶端使用。

首先建立一個普通的Spring Boot工程config-client,建立成功之後新增如下依賴:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
    <spring-cloud.version>Dalston.SR3</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>
</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>

然後建立bootstrap.properties檔案,來獲取配置資訊,注意這些資訊一定要放在bootstrap.properties檔案中才有效,檔案內容如下:

spring.application.name=app
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:2007/
server.port=2008

這裡的name對應了配置檔案中的application部分,profile對應了profile部分,label對應了label部分,uri則表示配置中心的地址。配置完成之後建立一個測試Controller,我們來看看效果:

@RestController
@RefreshScope
public class HelloController {
    @Value("${sang}")
    String sang;
    @Autowired
    Environment env;

    @RequestMapping("/sang")
    public String sang() {
        return this.sang;
    }
    @RequestMapping("/sang2")
    public String sang2() {
        return env.getProperty("sang", "未定義");
    }
}

我們可以直接注入值,也可以通過Environment來獲取值,訪問結果如下:

這裡寫圖片描述

好了,配置中心我們就先了解到這裡,有問題歡迎留言討論。