天天看點

Spring Cloud與Docker微服務架構實戰

作者簡介

周立

spring cloud中國社群聯合發起人之一,近7年的軟體系統開發經驗,多年系統架構經驗;參與開發多個大型項目,有電信某電信網管項目、某o2o電商平台、某征信系統等;對spring cloud、微服務、持續內建、持續傳遞有一定見地。

熱愛技術交流,曾代表公司參加全球微服務架構高峰論壇、qcon等技術沙龍。擁抱開源,多個項目開源在github與git@osc上,并獲得開源中國的推薦,例如電子書《使用spring cloud與docker實戰微服務》等。

目前,筆者的研究重心是使用spring cloud、docker、微服務,著有《spring cloud與docker微服務架構實戰》,已在京東上架。

筆者部落格:http://itmuch.com,定期分享spring cloud相關部落格。

一、為什麼要統一管理微服務配置

對于傳統的單體應用,我們常使用配置檔案管理所有配置。例如一個spring boot開發的單體應用,我們可将配置内容放在application.yml檔案中。如果需要切換環境,我們可設定多個profile,并在啟動應用時指定spring.profiles.active={profile}。在本書《eureka server的高可用》一節,我們使用的也是這種方式。當然,我們也可借助maven的profile實作環境切換。

然而,在微服務架構中,微服務的配置管理一般有以下需求:

(1) 集中管理配置。一個使用微服務架構的應用系統可能會包含成百上千個微服務,是以集中管理配置是非常有必要的;

(2) 不同環境,不同配置。例如,資料源配置在不同的環境(開發、測試、預釋出、生産等)中是不同的;

(3) 運作期間可動态調整。例如,我們可根據各個微服務的負載情況,動态調整資料源連接配接池大小或熔斷門檻值,并且在調整配置時不停止微服務;

(4) 配置修改後可自動更新。如配置内容發生變化,微服務能夠自動更新配置。

綜上所述,對于微服務架構而言,一個通用的配置管理機制是必不可少的,常見做法是使用配置伺服器幫助我們管理配置。

二、spring cloud config簡介

spring cloud config為分布式系統外部化配置提供了伺服器端和用戶端的支援,它包括config server和config client兩部分。由于config server和config client都實作了對spring environment和propertysource抽象的映射,是以,spring cloud config非常适合spring應用程式,當然也可與任何其他語言編寫的應用程式配合使用。

config server是一個可橫向擴充、集中式的配置伺服器,它用于集中管理應用程式各個環境下的配置,預設使用git存儲配置内容(也可使用subversion、本地檔案系統或vault存儲配置,限于篇幅,本書不作讨論),是以可以很友善地實作對配置的版本控制與内容審計。

config client是config server的用戶端,用于操作存儲在config server中的配置屬性。

Spring Cloud與Docker微服務架構實戰

圖9-1 spring cloud config架構圖

如圖9-1,所有的微服務都指向config server。各個微服務在啟動時,會請求config server以擷取所需要的配置屬性,然後緩存這些屬性以提高性能。

三、編寫config server

本節我們來編寫一個config server。在本例中,我們使用git作為config server的後端存儲。

Spring Cloud與Docker微服務架構實戰

内容分别是:

Spring Cloud與Docker微服務架構實戰

為了測試版本控制,我們為該git倉庫建立config-label-v2.0分支,并将各個配置檔案中的1.0改為2.0。

(2) 建立一個maven工程,artifactid是microservice-config-server ,并為項目添加以下依賴。

Spring Cloud與Docker微服務架構實戰

(3) 編寫啟動類,在啟動類上添加注解@enableconfigserver,聲明這是一個config server。

Spring Cloud與Docker微服務架構實戰

(4) 編寫配置檔案application.yml,并在其中添加以下内容。

Spring Cloud與Docker微服務架構實戰

這樣,一個config server就完成了。

我們可使用config server的端點擷取配置檔案的内容。端點與配置檔案的映射規則如下:

Spring Cloud與Docker微服務架構實戰

以上端點都可以映射到{application}-{profile}.properties 這個配置檔案,{application} 表示微服務的名稱,{label} 對應git倉庫的分支,預設是master。

按照以上規則,對于本例,我們可使用以下url通路到git倉庫master分支的microservice-foo-dev.properties,例如:

<a>http://localhost:8080/microservice-foo/dev</a>

<a>http://localhost:8080/microservice-foo-dev.properties</a>

<a>http://localhost:8080/microservice-foo-dev.yml</a>

Spring Cloud與Docker微服務架構實戰

從結果我們可以直覺地看到應用名稱、項目profile、git label、git version、配置檔案url、配置詳情等資訊。

Spring Cloud與Docker微服務架構實戰
Spring Cloud與Docker微服務架構實戰

說明獲得了git倉庫config-label-v2.0分支中的配置資訊。

至此,我們已成功建構了config server,并通過構造url的方式,擷取了git倉庫中的配置資訊。

四、編寫config client

前文我們已經建構了一個config server,并使用config server端點擷取配置内容。本節我們來讨論spring cloud微服務如何擷取配置資訊。

下面我們來編寫一個微服務,該微服務整合了config client。

(1) 建立一個maven工程,artifactid是microservice-config-client ,并為項目添加以下依賴。

Spring Cloud與Docker微服務架構實戰

(2) 建立一個基本的spring boot啟動類。

Spring Cloud與Docker微服務架構實戰

(3) 編寫配置檔案application.yml,并在其中添加如下内容。

Spring Cloud與Docker微服務架構實戰

(4) 建立配置檔案bootstrap.yml,并在其中添加如下内容。

Spring Cloud與Docker微服務架構實戰

其中:

spring.cloud.config.profile:profile對應config server所擷取的配置檔案中的{profile} ;

spring.cloud.config.label:指定git倉庫的分支,對應config server所擷取配置檔案的{label}。

spring cloud有一個“引導上下文”的概念,這是主應用程式的父上下文。引導上下文負責從配置伺服器加載配置屬性,以及解密外部配置檔案中的屬性。和主應用程式加載application.* (yml或properties)中的屬性不同,引導上下文加載bootstrap.* 中的屬性。配置在bootstrap.* 中的屬性有更高的優先級,是以預設情況下它們不能被本地配置覆寫。

如需禁用引導過程,可設定spring.cloud.bootstrap.enabled=false 。

(4) 編寫controller。

Spring Cloud與Docker微服務架構實戰

在controller中,我們通過注解@value("${profile}") ,綁定git倉庫配置檔案中的profile屬性。

(1) 啟動microservice-config-server。

(2) 啟動microservice-config-client。

dev-1.0

說明config client能夠正常通過config server獲得git倉庫中對應環境的配置。

來源:中生代技術

<a href="https://mp.weixin.qq.com/s/qp60hh6qtlvot_dlabkawa" target="_blank">原文連結</a>