Kratos 學習筆記 - 使用 Apollo 配置中心
前言
微服務項目開發中,隨着功能日益複雜,服務中的配置項隨之增多,如果使用傳統的配置文件方式來控制配置項,這種做法雖然簡單,但是非常的不靈活,多個服務對應多套配置文件,並且如果需要修改配置時,還需要登錄到服務所在的機器或容器內部進行修改。另外實際的項目中可能會有一部分配置是公用的配置項,如果涉及到修改公用配置需要修改所有配置文件中的公用配置項。所以需要有一個平臺對配置項來做統一的管理,配置中心應運而生。本文以 Apollo 分佈式配置中心爲例,爲大家簡單演示如何在 Kratos 中接入配置中心。
使用 Apollo 接入 Kratos
什麼是 Apollo
Apollo(阿波羅)是一款可靠的分佈式配置管理中心,誕生於攜程框架研發部,能夠集中化管理應用不同環境、不同集羣的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性,適用於微服務配置管理場景。
阿波羅配置中心主要有以下特性:
-
可以統一管理不同平臺和環境的配置
-
配置支持熱更新
-
配置版本管理
-
灰度發佈
-
權限、審覈、審計
-
客戶端配置信息監控
部署 Apollo 環境
在部署 Apollo 我們可以直接使用 quick start 或者分佈式部署,本文爲了演示效果,將採用 quick start 的方式進行部署,分佈式部署可以查看 Apollo 文檔 分佈式部署章節 [1]。
克隆項目
$ git clone https://github.com/apolloconfig/apollo.git
運行項目
$ cd apollo/scripts/docker-quick-start/
$ docker-compose up -d
創建應用
-
在瀏覽器中打開
http://localhost:8070
進入 Apollo 的配置中心頁面,輸入賬號密碼(默認賬號密碼爲 apollo/admin ) -
點擊創建項目按鈕,創建如下項目
-
創建一些配置項
-
點擊發布按鈕,發佈配置
-
點擊 管理密鑰 在 dev 環境中添加一個訪問密鑰,並修改爲啓用狀態
Kratos Apollo 插件
Apache Dubbo / apollo PMC 鄒部長爲 Kratos 貢獻了 Apollo 插件代碼。
鄒部長,某電商公司任職資深軟件工程師。從事服務端開發工作十多年,做過後端研發,也做過業務架構。擅長多語言微服務技術體系以及電商業務系統研發。Apache Dubbo 與 apollo PMC,曾參與過多個知名開源項目,Apache Dubbo、Apache Dubbo-go、apollo、MOSN 等。
引入插件
go get -u github.com/go-kratos/kratos/config/apollo/v2
# 也可以在代碼中直接引入,然後通過 go mod 獲取依賴
創建 config 對象
使用剛纔創建的項目信息來創建 config 對象
c := config.New(
config.WithSource(
apollo.NewSourceWithConfig(
apollo.WithAppID("kratos"),
apollo.WithCluster("dev"),
apollo.WithEndpoint("http://localhost:8080"),
apollo.WithNamespace("application"),
apollo.WithEnableBackup(),
apollo.WithSecret("895da1a174934ababb1b1223f5620a45"),
),
),
)
加載配置
在使用配置之前需要先加載配置
// 使用 Load 方法加載配置
if err := c.Load(); err != nil {
panic(err)
}
通過 Value 獲取配置
// 傳入配置項的 key 名稱
name, err := c.Value("name").String()
if err != nil {
panic(err)
}
# output
name: 神奇的包子
將配置綁定到結構體上
// 定義一個結構體來接收配置
var v struct {
Name string `json:"name"`
Version string `json:"version"`
}
// 使用 Scan 方法將配置綁定到結構體上
if err := c.Scan(&v); err != nil {
panic(err)
}
#output
config: {Name:神奇的包子 Version:0.0.1}
監聽配置變化
if err := c.Watch("name", func(key string, value config.Value) {
name, err := value.String()
if err != nil {
panic(err)
}
log.Printf("config changed: %s = %s\n", key, name)
}); err != nil {
panic(err)
}
在 apollo 中修改配置,併發布
# output
config changed: name = 不是很神奇的包子
參考資料
[1]
分佈式部署章節: https://www.apolloconfig.com/#/zh/deployment/distributed-deployment-guide
[2]
Apollo: https://github.com/apolloconfig/apollo
[3]
示例代碼: https://github.com/go-kratos/kratos/tree/main/examples/config/apollo
[4]
插件地址: https://github.com/go-kratos/kratos/tree/main/contrib/config/apollo
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/kVeNliAiODjquXfmJJlw5g