天天看點

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

本文為阿裡雲容器服務spring cloud應用開發系列文章的第六篇。

六、集中配置管理(本文)

在傳統的運維中,如果一個伺服器或着運作環境更新更新,可以通過自動化腳本對伺服器進行更新。随着時間的推移和需求的不斷變化,可能需要運維人員登陸進入伺服器進行改動。這樣做雖然友善,但積累起來會造成伺服器環境的"漂移",意味着自從上次代碼部署後在這個伺服器發生了什麼改變誰都不記得了,也許微小的一個差異就會引起錯誤。

不變基礎架構(immutable infrastructure)的意思我們不再打更新檔了,也不允許運維人員登陸進入手工修改。如果伺服器需要更新,那就把原來的服務停掉,删除伺服器,用一個新的伺服器替換。不變架構保證了線上運作的代碼和配置永遠是有版本控制,并且一緻的。

這樣做會帶來一些不友善,如果一個服務需要更新一個基礎配置,也需要在代碼的配置檔案中進行更改,建構一個新的鏡像,然後把該服務的所有執行個體停掉進行替換。有時候為了更改一個配置資訊而重新建構鏡像,這件事總讓人覺得有些不對。能不能應用的配置資訊也集中管理起來?

spring cloud提供的集中配置管理(config server)可以解決這個問題。服務在啟動的時候統一從一個集中的配置伺服器中讀取的配置,這樣可以保證服務的代碼和配置選項都不變的情況下又能夠得到最新的配置資訊。

我們在下面會示範如何建立config server,如何讓其它服務通路config server。

注意:本文的示例程式沒有包含這部分内容。如果向獲得較長的描述,請參見spring官方文檔。

在build.gradle中引入對config server的依賴。

通過<code>@enableconfigserver</code>注解将主class聲明為config server:

在<code>application.properties</code>中定義config server的偵聽端口和從git中獲得配置資訊:

git.uri指向存儲配置資訊的git倉庫,裡面為每個服務建立一個.properties檔案,例如如下檔案目錄結構:

<code>foo.properties</code>是為一個名字為<code>foo</code>的服務存儲配置資訊的檔案,<code>foo-cloud.properties</code>是同樣的<code>foo</code>服務在cloud profile下使用的配置資訊。

假定<code>foo</code>需要一個名字為<code>message</code>的配置資訊,可以在<code>foo.properties</code>中寫入:

config server啟動後可以通過http協定通路,擷取配置資訊:

所有需要從config server中擷取配置資訊的服務,需要在<code>build.gradle</code>中引入spring config依賴:

<code>@refreshscope</code>注解将<code>foocontroller</code> class聲明為從config server中擷取配置。

<code>bootstrap.yml</code>聲明config server的位址和端口号,在這裡分别是<code>config-server</code>與<code>8888</code>。

啟動容器時,通過容器間的<code>links</code>将真正的config server和服務關聯起來。

假定這個服務就上文提到的<code>foo</code>服務,那麼它如何擷取<code>message</code>配置呢?這也是通過注解完成。

@value("${message}")表示在應用啟動時自動注入foocontroller的message變量。

通過spring config server進行配置資訊同步可能有一個潛在的問題,例如上面的示例中,在<code>bootstrap.yml</code>中配置對配置伺服器的通路。<code>bootstrap.yml</code>是在應用啟動時解析的,如果在啟動時配置伺服器還沒有啟動則會出現依賴它的所有服務也無法成功啟動。

我們這裡展示的是通過阿裡雲的對象存儲(oss)完成服務的集中配置管理。原理是所有的容器挂載oss,啟動成功後容器内的應用從oss中讀取配置。由于oss具有非常高的可靠性,并且對其内容的更改會被所有服務讀到,非常适用于配置資訊同步這個場景。

更進一步,阿裡雲容器服務上提供了ossfs的支援。ossfs可以把oss模拟成為檔案系統,應用可以直接用傳統的檔案系統api通路oss,而不必使用oss api。由于一般應用都是将配置存儲在檔案系統中,使用ossfs意味着應用不必做任何變更就實作了配置資訊的中心化管理。

下面示範如何建立oss以及挂載ossfs。

進入oss管理控制台,建立oss bucket,注意所屬地域要選擇容器叢集所在地域,如下圖所示:

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

bucket建立好後,将配置檔案上傳。

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

基于安全的考慮,建議進入<code>安全令牌</code>建立子賬号,并記錄下accesskeyid和accesskeysecret。

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

進入容器服務控制台,在<code>資料卷</code>菜單下建立新的資料卷:

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

選擇剛才建立的bucket:

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

在docker-compose.yml中為服務增加如下聲明:

<code>volumes</code>中,<code>foobar-config-oss</code>是前面建立的oss bucket名字,<code>/config</code>是在容器中的挂載點。

我們準備通過登陸進入容器來驗證ossfs是否已經挂載成功。

首先在容器服務的控制台上點選叢集<code>連接配接資訊</code>進入連接配接資訊頁面。

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(六)

複制環境變量配置,在你的指令行視窗配置環境變量,下載下傳證書,将證書解壓縮到工作目錄。

在工作目錄下運作如下指令,獲得挂載ossfs的容器id:

進入容器,檢視<code>/config</code>下的配置檔案内容。

可以看到容器已經成功挂載ossfs。如果配置檔案發生變更,上傳進入oss bucket後容器就可以讀到最新的内容。是以容器示例都挂載同一個資料卷,實作了配置資訊的集中化管理和分布讀取。

本文介紹了如何通過spring config server和阿裡雲的對象存儲oss來進行配置資訊的集中管理。