Windows平臺上使用Nacos的情形似乎不是很多,所以也沒有找到相關的文章。自己摸索的過程中遇到了一些問題,這裏記錄一下。
Nacos 是阿里巴巴開源的服務發現工具,提供的功能主要是服務發現和配置管理。詳細說明可以參考官網文檔:https://nacos.io/zh-cn/docs/what-is-nacos.html
本文的重點是go語言如何使用Nacos進行配置管理,所以Nacos 服務採用windows部署的方式,並且是最簡單的單機部署。
1. Nacos快速開始:
依賴環境:64bit OS,64位 JDK1.8+
直接下載最新穩定版的可執行壓縮包 https://github.com/alibaba/nacos/releases
目前最新穩定版本是1.2.1
直接使用默認配置運行nacos/bin/startup.cmd
說明一下,這裏有必要看一下nacos的啓動日誌
有幾個地方我們後面要用到,Nacos使用Tomcat作爲容器,端口是8848,上下文路徑是/nacos。 對於配置文件、日誌文件、數據文件有興趣的可以查看一下。最終要的是控制檯地址:http://192.168.1.103:8848/nacos/index.html
Nacos 控制檯管理
功能分爲配置管理、服務管理、集羣管理、權限控制和命名空間。這裏我們只關心命名空間和配置管理兩部分,假如一個配置是一條KEY=VALUE的文本,DataID(配置集)中有一或多條配置,一個Group中有一或多個配置集,一個命名空間內可以有任意個Group。通常用命名空間分別管理開發配置、測試配置和正式環境配置。默認的命名空間是public。
Go Client
在說Go Client API之前,先看一下Open-API, Open-API 是Nacos服務提供的一組RESTful 接口,比如獲取配置就是 GET /nacos/v1/cs/configs?dataId=配置集group=分組tenant=命名空間
其中命名空間可省略,採用默認的public。在 go client的日誌中發現,它也是通過Open-API來實現的。
Go Client 下載地址: https://github.com/nacos-group/nacos-sdk-go
Go Client還依賴於其他的庫,需要依次下載,其中aliyun-cloud在下載的時候發生連接超時,需要通過科學上網來下載。
(可以參考我的Demo)
基本的使用代碼在代碼中的ReadMe.md有介紹,主要如下:
constant.ClientConfig{
TimeoutMs: 10 * 1000, //http請求超時時間,單位毫秒
ListenInterval: 30 * 1000, //監聽間隔時間,單位毫秒(僅在ConfigClient中有效)
BeatInterval: 5 * 1000, //心跳間隔時間,單位毫秒(僅在ServiceClient中有效)
NamespaceId: "public", //nacos命名空間
Endpoint: "", //獲取nacos節點ip的服務地址
CacheDir: "/data/nacos/cache", //緩存目錄
LogDir: "/data/nacos/log", //日誌目錄
UpdateThreadNum: 20, //更新服務的線程數
NotLoadCacheAtStart: true, //在啓動時不讀取本地緩存數據,true--不讀取,false--讀取
UpdateCacheWhenEmpty: true, //當服務列表爲空時是否更新本地緩存,true--更新,false--不更新
}
Nacos客戶端配置, 需要說明的有三處,
Endpoint 是通過阿里雲ACM(應用配置管理)來部署nacos時使用,可以通過Endpoint來找到nacos服務器的地址信息。
CacheDir: 配置的緩存目錄,獲取到的配置數據會放到CacheDir下的config目錄下,文件名是dataId@@group@@namespace。 windows平臺下這裏的config目錄需要手動創建。
LogDir 是客戶端日誌的存放目錄,在創建日誌文件之後,還會創建該文件的軟連接,所以還需要用管理員權限運行,才能夠正常執行。
constant.ServerConfig{
IpAddr: "console.nacos.io", //nacos服務的ip地址
ContextPath: "/nacos", //nacos服務的上下文路徑,默認是“/nacos”
Port: 8848, //nacos服務端口
}
服務配置信息可以參考上面的服務日誌信息,IP 就是本機IP、端口和上下文路徑分別是8848和/nacos。 關於上下文路徑,它實際就是uri根路徑信息。比如獲取配置的uri就是IP:port/contextPath/v1/vs/configs?params
示例代碼:
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"
)
func main() {
clientConfig := constant.ClientConfig{
TimeoutMs: 10 * 1000, //http請求超時時間,單位毫秒
ListenInterval: 30 * 1000, //監聽間隔時間,單位毫秒(僅在ConfigClient中有效)
BeatInterval: 5 * 1000, //心跳間隔時間,單位毫秒(僅在ServiceClient中有效)
NamespaceId: "", //nacos命名空間
Endpoint: "", //獲取nacos節點ip的服務地址
CacheDir: "D:\\temp\\cache", //緩存目錄
LogDir: "D:\\temp\\log", //日誌目錄
UpdateThreadNum: 20, //更新服務的線程數
NotLoadCacheAtStart: true, //在啓動時不讀取本地緩存數據,true--不讀取,false--讀取
UpdateCacheWhenEmpty: true, //當服務列表爲空時是否更新本地緩存,true--更新,false--不更新
}
// 至少一個
serverConfigs := []constant.ServerConfig{
{
IpAddr: "127.0.0.1",
ContextPath: "/nacos",
Port: 8848,
},
}
configClient, err := clients.CreateConfigClient(map[string]interface{}{
"serverConfigs": serverConfigs,
"clientConfig": clientConfig,
})
if err != nil {
fmt.Println(err)
return
}
//success, err := configClient.PublishConfig(vo.ConfigParam{
// DataId: "testId",
// Group: "testGroup",
// Content: "hello world!222222"})
//if err!=nil ||!success {
// fmt.Println("publish failed",err)
//}
content, err := configClient.GetConfig(vo.ConfigParam{
DataId: "mysql",
Group: "CDN",
})
if err != nil {
fmt.Println(err)
}
fmt.Println("content:" + content)
}
如果有錯誤發生,可以多看看日誌。
ACM 應用配置管理
如果使用ACM部署的nacos服務,直接參考官方的說明文檔即可。
https://help.aliyun.com/document_detail/130146.html?spm=a2c4g.11186623.3.3.186166eexxWHnu
這裏也可以簡單演示一下:
ACM生成的有4個配置項Endpoint、NameSpace、accessKey、secretKey ,後面兩個key是服務器安全用的,我們暫且不管。namespace就是前面的命名空間,Endpoint 在nacos的日誌中也有(基於base path的相對路徑是 /actuator ),也就是127.0.0.1:8848/nacos/actuator。 直接使用SDK的示例代碼
// 從控制檯命名空間管理的"命名空間詳情"中拷貝 End Point、命名空間 ID
var endpoint = "192.168.1.103:8848/nacos/actuator"
var namespaceId = ""
// 推薦使用 RAM 用戶的 accessKey、secretKey
//var accessKey = "${accessKey}"
//var secretKey = "${secretKey}"
clientConfig := constant.ClientConfig{
//
Endpoint: endpoint,
NamespaceId: namespaceId,
//AccessKey: accessKey,
//SecretKey: secretKey,
CacheDir: "D:\\temp\\cache", //緩存目錄
LogDir: "D:\\temp\\log", //日誌目錄
TimeoutMs: 5 * 1000,
ListenInterval: 30 * 1000,
}
configClient, err := clients.CreateConfigClient(map[string]interface{}{
"clientConfig": clientConfig,
})
if err != nil {
fmt.Println(err)
return
}
var dataId = "mysql"
var group = "CDN"
// 獲取配置
content, err := configClient.GetConfig(vo.ConfigParam{
DataId: dataId,
Group: group})
fmt.Println("Get config:" + content)
測試結果是一樣的,如果使用的有阿里雲服務器,還是推薦使用ACM。官方自動配置,免費使用,省去了運維的煩惱。
Demo 下載:
https://download.csdn.net/download/u012179109/12555270