簡介
為什麼需要配置中心
我們現在有一個專案, 使用Gin進行開發的, 配置檔案我們知道是一個config.yaml的檔案, 也知道這個配置檔案在專案啟動時會被載入到記憶體中使用;
考慮三種情況:
a . 新增配置項
1 . 你現在的使用者服務有10個部署例項, 那麼新增配置項你得去十個地方修改配置檔案還得重新啟動等;
2 . 即使Go的viper能完成修改配置檔案自動生效, 那麼你得考慮其他語言是否能做到這點, 其他微服務是否一定會使用viper?
b . 修改配置項
大量的服務可能會使用同一個配置,比如我要更新jwt的secret,這麼多例項怎麼辦?
c . 開發,測試,生產環境如何隔離
前面雖然已經介紹了viper,但是依然一樣的問題,那麼多服務如何統一這種考慮因素;
配置中心選型
目前最主流的分散式配置中心主要有spring cloud config,apollo和nacos,spring cloud屬於spring體系, 我們就考慮apollo(攜程)和nacos(阿里),都是目前比較流行且維護活躍的2個配置中心;
a . apollo大而全, 功能完善, nacos小而全, 可以對比django和flask區別;
b . 部署nacos更加簡單;
c .nacos不止支援配置中心還支援服務註冊和發現;
d . 都支援各種語言, 不過apollo是第三方支援的,nacos是官方支援各種語言;
nacos很活躍, 不過看的出來nacos想要構建的生態野心更大, 不過收費意圖明顯;
Nacos安裝
https://nacos.io/zh-cn/docs/what-is-nacos.html
docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_MAX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest
Nacos使用
配置
名稱空間
可以隔離
新建
組 - 隔離
丟擲一個問題: 你現在確實能夠隔離微服務, 但是把不同微服務的開發,測試,生產如何區別;
此時就可以用組隔離了
dataid - 配置集
一個配置集就是一個配置檔案,實際可以更靈活, 將db,server內容等配置分開管理;
Go整合Nacos
安裝
go get -u github.com/nacos-group/nacos-sdk-go
Go操作Nacos
https://github.com/nacos-group/nacos-sdk-go/blob/master/README_CN.md
Example1
package main
import (
"fmt"
"github.com/nacos-group/nacos-sdk-go/clients"
"github.com/nacos-group/nacos-sdk-go/common/constant"
"github.com/nacos-group/nacos-sdk-go/vo"
"time"
)
func main() {
sc := []constant.ServerConfig{{
IpAddr: "192.168.0.4",
Port: 8848,
}}
cc := constant.ClientConfig{
NamespaceId: "e6295280-8bc8-424e-b9c6-2eb61da8a189", // 如果需要支援多namespace,我們可以場景多個client,它們有不同的NamespaceId。當namespace是public時,此處填空字串。
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "log",
CacheDir: "cache",
RotateTime: "1h",
MaxAge: 3,
LogLevel: "debug",
}
configClient, err := clients.CreateConfigClient(map[string]interface{}{
"serverConfigs": sc,
"clientConfig": cc,
})
if err != nil {
panic(err)
}
content, err := configClient.GetConfig(vo.ConfigParam{
DataId: "user-web.yaml",
Group: "dev",
})
if err != nil {
panic(err)
}
fmt.Println(content) //字串 - yaml
err = configClient.ListenConfig(vo.ConfigParam{
DataId: "user-web.yaml",
Group: "dev",
OnChange: func(namespace, group, dataId, data string) {
fmt.Println("配置檔案發生了變化...")
fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
},
})
time.Sleep(300 * time.Second)
}
配置對映為struct
go內建json,可以不用引入第三方Yaml,可以用以下網站轉換下:
http://json2yaml.com/convert-yaml-to-json
{
"name": "user-web",
"port": 9001,
"user_srv": {
"host": "192.168.0.84",
"port": 50051,
"name": "user_srv"
},
"redis": {
"host": "47.94.149.143",
"password": "wunai.18",
"port": 6379,
"db": 0,
"expire": 3000
},
"jwt": {
"key": "!42&%MFFezZmB8a^RhUiGa$l5g2z65HZ"
},
"ali_sms": {
"key": "LTAI4GAdvAHSnQGAuiu2vicL",
"secrect": "ZfneNg1Sa6bEpbVHlP16nCTmT9dInh"
},
"consul": {
"host": "192.168.0.4",
"port": 8500
}
}