spring cloud 入門系列七:基於Git存儲的分散式配置中心--Spring Cloud Config

来源:https://www.cnblogs.com/sam-uncle/archive/2018/05/14/9036053.html
-Advertisement-
Play Games

我們前面接觸到的spring cloud組件都是基於Netflix的組件進行實現的,這次我們來看下spring cloud 團隊自己創建的一個全新項目:Spring Cloud Config.它用來為分散式系統中的基礎設施和微服務提供集中化的外部配置支持,分為服務端和客戶端兩個部分。 其中服務端也稱 ...


我們前面接觸到的spring cloud組件都是基於Netflix的組件進行實現的,這次我們來看下spring cloud 團隊自己創建的一個全新項目:Spring Cloud Config.
它用來為分散式系統中的基礎設施和微服務提供集中化的外部配置支持,分為服務端和客戶端兩個部分。

其中服務端也稱為分散式配置中心,他是獨立的微服務應用,用來連接配置倉庫併為客戶端提供獲取介面(這些介面返回配置信息、加密、解密信息等);

客戶端是微服務架構中的各個微服務應用或基礎設施,它們通過制定的配置中心來管理應用資源與業務相關的配置內容,併在啟動的時候從配置中心獲取和載入配置信息。
由於配置中心預設採用Git來存儲配置信息,因此我們會用到Git相關的內容,如果沒有用過Git或者忘記怎麼用了,可以參考下廖雪峰老師的Git教程
另外,我自己用的Git遠程倉庫是碼雲。
====================華麗的分割線===================
接下來看下代碼怎麼實現。

一、準備遠程Git倉庫

  1. 在Gitee上新建一個項目https://gitee.com/sam-uncle/spring-cloud-learning
  2. 在項目下新建子目錄spring-cloud-config-file,然後新建三個文件
    1.   

       

    2. 內容分別是from=git-dev-1.0、from=git-test-1.0、from=git-1.0
  3. 新建一個分支config-lable-test,新分支裡面新建三個同名的文件,不過內容分別是from=git-dev-2.0、from=git-test-2.0、from=git-2.0

 

二、構建配置中心

  先給出最終代碼結構:

  

  搭建過程如下:

  1. 新建maven工程config-server
  2. 修改POM文件
    <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.sam</groupId>
      <artifactId>config-server</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
      <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.1.RELEASE</version>
        </parent>
    
        <properties>
            <javaVersion>1.8</javaVersion>
        </properties>
        <!-- 使用dependencyManagement進行版本管理 -->
        <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>
    
        <dependencies>
           <!-- 引入config server依賴 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
            </dependency>
    
        </dependencies>
        
    </project>
  3. 創建啟動類
    /**
     * @EnableConfigServer
     * 
     * 開啟Spring Cloud Config 的服務端功能
     *
     */
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApp {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigServerApp.class, args);
        }
    }
  4. 配置application.properties文件,指定遠程倉庫信息
    server.port=7001
    spring.application.name=config-server
    
    #配置Git倉庫的地址
    spring.cloud.config.server.git.uri=https://gitee.com/sam-uncle/spring-cloud-learning/
    #配置倉庫路徑下的相對搜索位置,可以配置多個
    spring.cloud.config.server.git.search-paths=spring-cloud-config-file
    #這裡配置你的Git倉庫的用戶名
    spring.cloud.config.server.git.username=用戶名
    #這裡配置你的Git倉庫的密碼
    spring.cloud.config.server.git.password=密碼
  5. 啟動並驗證

    訪問配置信息的URL與配置文件的映射關係如下:

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

    上面的url會映射{application}-{profile}.properties對應的配置文件,其中{label}對應Git上不同的分支,預設是master。

    通過瀏覽器訪問http://localhost:7001/sam/dev/config-label-test,結果如下:

    


三、實現客戶端

    最終代碼結構:

  

 

   搭建過程如下:

  1. 新建maven工程config-client
  2. 修改POM文件
    <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.sam</groupId>
        <artifactId>config-client</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.1.RELEASE</version>
        </parent>
    
        <properties>
            <javaVersion>1.8</javaVersion>
        </properties>
        <!-- 使用dependencyManagement進行版本管理 -->
        <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>
    
        <dependencies>
            <!-- 引入config依賴 -->
            <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>
    
        </dependencies>
    
    </project>
  3. 創建啟動類
    @SpringBootApplication
    public class ConfigClientApp {
    
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientApp.class, args);
        }
    
    }
  4. 配置bootstrap.properties文件,指定config-server位置
    server.port=7002
    #{application}
    spring.application.name=sam
    #{profile}
    spring.cloud.config.profile=dev
    #{label}
    spring.cloud.config.label=master
    
    #config server uri
    spring.cloud.config.uri=http://localhost:7001/
  5. 創建controller
    @RefreshScope
    @RestController
    public class TestController {
    
        
        /**
         * 通過@Value 來講配置文件中的值寫入到代碼中
         */
        @Value("${from}")
        private String from;
    
        @RequestMapping("/from")
        public String from() {
            return from;
        }
    }
  6. 啟動並測試

    

 

四、工作原理
Spring Cloud Config配置中心的工作原理如下:

  1. 客戶端啟動時,根據bootstrap.properties中配置的應用名{application}、環境名{profile}、分支名{label},向Config Server請求獲取配置信息。
  2. Config Server根據自己維護的Git倉庫信息和客戶傳遞過來的配置定位信息去查找配置信息。
  3. 通過git clone命令將找到的配置信息下載到本地(Config Server的文件系統中)。在通過頁面訪問或啟動客戶端的時候,我們在服務端能看到如下下載的log:
    2018-05-14 22:51:58.055  INFO 3084 --- [nio-7001-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/C:/Users/sam/AppData/Local/Temp/config-repo-8627749771720918793/spring-cloud-config-file/sam-dev.properties
    2018-05-14 22:51:58.055  INFO 3084 --- [nio-7001-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/C:/Users/sam/AppData/Local/Temp/config-repo-8627749771720918793/spring-cloud-config-file/sam.properties
  4. Config Server創建Spring 的ApplicationContext實例,並從Git本地倉庫中載入配置文件,最後將這些配置內容讀取出來返回給客戶端。
  5. 客戶端在獲取外部配置信息後載入到客戶端的applicationContext實例。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 最近在參加一個比賽,使用到了區塊鏈的開源軟體 ,由於之前從未接觸過區塊鏈,以及和區塊鏈開發相關的內容,所有在網上查閱了大量的資料,並且通過學習 "yeasy(楊寶華)" 開源的入門書籍 "區塊鏈技術指南" 以及進階學習的《區塊鏈原理、設計與應用》,對區塊鏈的一些相關概念有了一定認識。這裡記錄的 ...
  • 說到Java,一定繞不開GC,儘管不是Java首創的,但Java一定是使用GC的代表。GC就是垃圾回收,更直接點說就是記憶體回收。是對記憶體進行整理,從而使記憶體的使用儘可能大的被覆用。 一直想好好寫一篇關於GC的文章,可是卻發現要寫的東西太大了,不是一篇博客能簡單的介紹完的。所以打算拆分成若幹篇博客,一 ...
  • 大家好,併發編程 進入第三篇。 上班第一天,大家應該比較忙吧。小明也是呢,所以今天的內容也很少。只要幾分鐘就能學完。 昨天我們說,線程與線程之間要通過消息通信來控製程序的執行。 講完了消息通信,今天就來探討下線程里的信息隔離是如何做到的。 大家註意:信息隔離,這並不是官方命名的名詞,也不是網上廣為流 ...
  • 在迴圈列表的同時記住列表的序列的一種方法 ...
  • python 閉包 1.什麼是閉包 如果在一個內部函數里,對在外部作用域(但不是在全局作用域)的變數進行引用, 那麼[內部函數和該變數]就構成了閉包(closure)。 inner 和 x構成一個閉包 2.閉包使用中的坑 閉包中不能直接修改外部函數的局部變數 (如果使用類似 修改x的值,會直接報錯 ...
  • 上周公司對所有員工封閉培訓了一個星期,期間沒收手機,基本上博客的更新都停止了,儘管培訓時間不長,但還是有些收穫,不僅來自於培訓講師的,更多的是發現自己與別人的不足,一個優秀的人不僅僅是自己專業那塊的精通,自己還有很多內功和外功需要修煉,人生很長,拼的是堅持。培訓回來了就開始馬不停蹄的複習自己之前學的 ...
  • *正則表達式: 是用於快速從一大堆字元中快速找出想要的子字元串的一種表達方式 , 函數+表達方式=快速找出子字元串。 在正則表達式中,如果直接給出字元,就是精確匹配。用\d可以匹配一個數字,\w可以匹配一個字母或數字,所以: '00\d'可以匹配'007',但無法匹配'00A'; '\d\d\d'可 ...
  • __init__:當實例化一個類的時候,首相會執行__new__方法創建一個對象,接下來會執行__init__方法對對象的一些屬性進行初始化. 所以如果對象有屬性,一般會直接寫在__init__方法裡面: __str__:當實例化一個類之後,就有了一個對象的引用,如 test = Test() 這個 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...