Spring Cloud 系列之 Apollo 配置中心(四)

本篇文章爲系列文章,未讀前幾集的同學請猛戳這裏:

本篇文章講解 Apollo 高可用環境搭建,灰度發佈,教大家搭建企業中真實環境的配置中心。


高可用環境搭建


點擊鏈接觀看:Apollo 高可用環境搭建視頻(獲取更多請關注公衆號「哈嘍沃德先生」)


分析

數據庫高可用

方案很多,比如雙主結構、主從結構、異地備份等等,還可以選擇第三方雲數據庫服務,讓雲服務廠商去保證數據庫的高可用性,這樣不僅比自己實現起來更可靠、更輕鬆,而且還方便管理等。

AdminService 高可用

在 Apollo 中所有的 Admin Service 都會註冊到 Eureka 裏,所以我們只需要配置多臺 AdminService,數據庫採用同一套即可。

ConfigService 高可用

在 Apollo 的設計中每個 ConfigService 也是一個 Euerka 的註冊中心,所以保證 ConfigService 高可用的前提是保證 Eureka 的高可用,Eureka 的高可用實際上就是將自己作爲服務向其他服務註冊中心註冊自己,這樣就可以形成一組互相註冊的服務註冊中心,以實現服務清單的互相同步,達到高可用的效果。

實踐

再來一臺機器 192.168.10.104 然後將 apollo-configservice-x.x.x-github.zipapollo-adminservice-x.x.x-github.zip 上傳至該機器,解壓以後都配置 102 機器的數據庫,我們搭建一個 DEV 的高可用環境。

配置數據庫

  1. 將 ConfigService 和 AdminService 上傳至 192.168.10.104
  2. 解壓
  3. 打開config目錄下的application-github.properties文件
  4. 填寫正確的 ApolloConfigDB 數據庫連接串信息,注意用戶名和密碼後面不要有空格!
  5. 修改完的效果如下:
# DataSource
spring.datasource.url = jdbc:mysql://192.168.10.102:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 1234

調整服務端配置

Eureka 註冊中心地址存儲在 ApolloConfigDB.ServerConfig 表中,如下圖,在③Value的地方添加多個地址即可。

配置 apollo-portal 的 meta service 信息

Apollo Portal 需要在不同的環境訪問不同的 meta service(apollo-configservice) 地址,所以我們需要在配置中提供這些信息。默認情況下,meta service 和 config service 是部署在同一個JVM進程,所以 meta service 的地址就是 config service 的地址。

對於 1.6.0 及以上版本,可以通過 ApolloPortalDB.ServerConfig 中的配置項來配置 Meta Service 地址。

新版本配置方式

通過 apollo.portal.meta.servers 添加 meta service(apollo-configservice) 地址,類似以下方式,修改完需要重啓生效。

{
    "DEV":"http://192.168.10.102:8080,http://192.168.10.104:8080",
    "PRO":"http://192.168.10.103:8080"
}

舊版本配置方式

打開apollo-portal-x.x.x-github.zipconfig目錄下的apollo-env.properties文件。

假設 DEV 的 apollo-configservice 未綁定域名,地址是 1.1.1.1:8080,FAT 的 apollo-configservice 綁定了域名 apollo.fat.xxx.com,UAT 的 apollo-configservice 綁定了域名 apollo.uat.xxx.com,PRO 的 apollo-configservice 綁定了域名 apollo.xxx.com,那麼可以如下修改各環境 meta service 服務地址,格式爲${env}.meta=http://${config-service-url:port},如果某個環境不需要,也可以直接刪除對應的配置項,參考案例如下:

dev.meta=http://1.1.1.1:8080
fat.meta=http://apollo.fat.xxx.com
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xxx.com

如果採用舊版本配置方式,本小節配置方案如下:

#local.meta=http://localhost:8080
dev.meta=http://192.168.10.102:8080,http://192.168.10.104:8080
#fat.meta=http://fill-in-fat-meta-server:8080
#uat.meta=http://fill-in-uat-meta-server:8080
#lpt.meta=${lpt_meta}
pro.meta=http://192.168.10.103:8080

除了通過apollo-env.properties方式配置 meta service 以外,apollo 也支持在運行時指定 meta service(優先級比apollo-env.properties高):

  1. 通過 Java System Property ${env}_meta
    • 可以通過 Java 的 System Property ${env}_meta來指定
    • java -Ddev_meta=http://config-service-url -jar xxx.jar
    • 也可以通過程序指定,如System.setProperty("dev_meta", "http://config-service-url");
  2. 通過操作系統的 System Environment ${ENV}_META
    • DEV_META=http://config-service-url
    • 注意 key 爲全大寫,且中間是_分隔

啓動

進入對應安裝包的 script 目錄,執行 startup.sh 文件。

我的啓動順序爲:

  • 192.168.10.101 啓動 Portal
  • 192.168.10.102 啓動 ConfigService 再啓動 AdminService
  • 192.168.10.104 啓動 ConfigService 再啓動 AdminService

訪問:192.168.10.102:8080 和 192.168.10.104:8080 看看 Eureka 以及各服務是否正常啓動,如下:

最後,在頁面發佈配置信息的同時,可以通過查看日誌的方式,查看高可用環境是否搭建成功,日誌存放在 /opt/appId/xxx.log

灰度發佈

在一般情況下,升級服務器端應用,需要將應用源碼或程序包上傳到服務器,然後停止掉老版本服務,再啓動新版本。但是這種簡單的發佈方式存在兩個問題,一方面,在新版本升級過程中,服務是暫時中斷的,另一方面,如果新版本有BUG,升級失敗,回滾起來也非常麻煩,容易造成更長時間的服務不可用。

爲了解決這些問題,人們研究出了多種發佈策略,比如藍綠部署、滾動發佈、灰度發佈等,Apollo 採用的是灰度發佈的特性。

介紹

灰度發佈也叫金絲雀發佈,起源是,礦井工人發現,金絲雀對瓦斯氣體很敏感,礦工會在下井之前,先放一隻金絲雀到井中,如果金絲雀不叫了,就代表瓦斯濃度高。

在灰度發佈開始後,先啓動一個新版本應用,但是並不直接將流量切過來,而是測試人員對新版本進行線上測試,啓動的這個新版本應用,就是我們的金絲雀。如果沒有問題,那麼可以將少量的用戶流量導入到新版本上,然後再對新版本做運行狀態觀察,收集各種運行時數據,如果此時對新舊版本做各種數據對比,就是所謂的 A/B 測試。

當確認新版本運行良好後,再逐步將更多的流量導入到新版本上,在此期間,還可以不斷地調整新舊兩個版本的運行的服務器副本數量,以使得新版本能夠承受越來越大的流量壓力。直到將100%的流量都切換到新版本上,最後關閉剩下的老版本服務,完成灰度發佈。如果在灰度發佈過程中(灰度期)發現了新版本有問題,就應該立即將流量切回老版本上,這樣,就會將負面影響控制在最小範圍內。

實踐

我們使用 apollo-demo 中的 order-serviceorder-service02 兩個實例來實踐,order-service 在 Windows 端運行,order-service02 在 Linux 端運行。

配置文件

order-service 的配置文件。

server:
  port: 9090 # 端口

spring:
  application:
    name: order-service # 應用名稱

# apollo 相關配置
app:
  id: order-service # 與 Apollo 配置中心中的 AppId 一致

apollo:
  meta: http://192.168.10.102:8080,http://192.168.10.104:8080 # Apollo 中的 Eureka 註冊中心地址
  #cluster: SHAOY # 指定 Apollo 集羣,默認爲 default,相同集羣實例使用對應集羣的配置
  #cacheDir:  # 配置緩存目錄,網絡不可用時任然可提供配置服務
  bootstrap:
    enable: true # 啓用 apollo

env: DEV # 指定環境

# 自定義配置
name: order-service-dev
mysql:
  host: localhost
  port: 3306
  username: root
  password: root

order-service02 的配置文件。

server:
  port: 9091 # 端口

spring:
  application:
    name: order-service02 # 應用名稱

# apollo 相關配置
app:
  id: order-service # 與 Apollo 配置中心中的 AppId 一致

apollo:
  meta: http://192.168.10.102:8080,http://192.168.10.104:8080 # Apollo 中的 Eureka 註冊中心地址
  #cluster: SHAOY # 指定 Apollo 集羣,默認爲 default,相同集羣實例使用對應集羣的配置
  #cacheDir:  # 配置緩存目錄,網絡不可用時任然可提供配置服務
  bootstrap:
    enable: true # 啓用 apollo

env: DEV # 指定環境

# 自定義配置
name: order-service-dev
mysql:
  host: localhost
  port: 3306
  username: root
  password: root

最終效果如下:

創建灰度

點擊右上角灰度按鈕,點擊確定創建灰度。

新增灰度配置

新增灰度規則

灰度發佈

測試

放棄灰度

確認放棄灰度以後會刪除該灰度版本,並恢復爲主版本的配置信息。

全量發佈

全量發佈將會把灰度版本的配置合併到主分支,併發布。

發佈歷史

可以通過發佈歷史來查看所有的發佈記錄,比如主版本發佈,主版本回滾,灰度操作、灰度規則等等。

至此 Apollo 配置中心所有的知識點就講解結束了。

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

大家可以通過 分類 查看更多關於 Spring Cloud 的文章。


🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章