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
創建應用
  1. 在瀏覽器中打開 http://localhost:8070 進入 Apollo 的配置中心頁面,輸入賬號密碼(默認賬號密碼爲 apollo/admin )

  2. 點擊創建項目按鈕,創建如下項目

  3. 創建一些配置項

  4. 點擊發布按鈕,發佈配置

  5. 點擊 管理密鑰 在 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