1、go.mod引入nacos-sdk-go
require (
github.com/nacos-group/nacos-sdk-go/v2 v2.2.1
)
2、代码使用
1. 示例
package main
import (
"fmt"
"github.com/nacos-group/nacos-sdk-go/v2/clients"
"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
"github.com/nacos-group/nacos-sdk-go/v2/vo"
"time"
)
func main() {
// nacos服务端配置
sc := []constant.ServerConfig{
*constant.NewServerConfig("127.0.0.1", 8848),
}
// nacos客户端配置
cc := *constant.NewClientConfig(
constant.WithNamespaceId(""), //public
constant.WithTimeoutMs(5000),
constant.WithNotLoadCacheAtStart(true),
//constant.WithLogDir("/tmp/nacos/log"),
//constant.WithCacheDir("/tmp/nacos/cache"),
//constant.WithLogLevel("debug"),
)
// 创建配置管理客户端
client, err := clients.NewConfigClient(
vo.NacosClientParam{
ClientConfig: &cc,
ServerConfigs: sc,
},
)
if err != nil {
panic(err)
}
// 发布配置,配置key=dataId+group+namespaceId
_, err = client.PublishConfig(vo.ConfigParam{
DataId: "test-data",
Group: "test-group",
Content: "hello world!yzh",
})
_, err = client.PublishConfig(vo.ConfigParam{
DataId: "test-data-2",
Group: "test-group",
Content: "hello world2!yzh2",
})
if err != nil {
fmt.Printf("PublishConfig err:%+v \n", err)
}
time.Sleep(1 * time.Second)
// 获取配置
content, err := client.GetConfig(vo.ConfigParam{
DataId: "test-data",
Group: "test-group",
})
fmt.Println("GetConfig,config :" + content)
// 监听配置,key=dataId+group+namespaceId.
err = client.ListenConfig(vo.ConfigParam{
DataId: "test-data",
Group: "test-group",
// 配置更新的监听
OnChange: func(namespace, group, dataId, data string) {
fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
},
})
err = client.ListenConfig(vo.ConfigParam{
DataId: "test-data-2",
Group: "test-group",
OnChange: func(namespace, group, dataId, data string) {
fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
},
})
time.Sleep(1 * time.Second)
_, err = client.PublishConfig(vo.ConfigParam{
DataId: "test-data",
Group: "test-group",
Content: "test-listen",
})
time.Sleep(1 * time.Second)
_, err = client.PublishConfig(vo.ConfigParam{
DataId: "test-data-2",
Group: "test-group",
Content: "test-listen2",
})
time.Sleep(2 * time.Second)
// 取消监听配置
err = client.CancelListenConfig(vo.ConfigParam{
DataId: "test-data",
Group: "test-group",
})
time.Sleep(1 * time.Second)
// 删除配置
_, err = client.DeleteConfig(vo.ConfigParam{
DataId: "test-data-2",
Group: "test-group",
})
time.Sleep(1 * time.Second)
// 查询配置列表
searchPage, _ := client.SearchConfig(vo.SearchConfigParam{
Search: "blur",
DataId: "",
Group: "",
PageNo: 1,
PageSize: 10,
})
fmt.Printf("Search config:%+v \n", searchPage)
}
2. 工具类封装
package nacos
import (
"fmt"
"github.com/nacos-group/nacos-sdk-go/v2/clients"
"github.com/nacos-group/nacos-sdk-go/v2/clients/config_client"
"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
"github.com/nacos-group/nacos-sdk-go/v2/common/logger"
"github.com/nacos-group/nacos-sdk-go/v2/vo"
"net/url"
"strconv"
)
// Client nacos客户端
var Client *NacosClient
type NacosClient struct {
client config_client.IConfigClient
}
// Init 初始化nacos
func Init() {
Client = initClient("http://127.0.0.1:8848", "develop")
}
func initClient(address string, namespaceId string) *NacosClient {
hostname, portString := getHostAndPort(address)
port, err := strconv.ParseUint(portString, 10, 64)
if err != nil {
panic(err)
}
// nacos服务端配置
sc := []constant.ServerConfig{
*constant.NewServerConfig(hostname, port),
}
// nacos客户端配置
cc := *constant.NewClientConfig(
constant.WithNamespaceId(namespaceId),
constant.WithTimeoutMs(5000),
constant.WithNotLoadCacheAtStart(true),
//constant.WithLogDir("/tmp/nacos/log"),
//constant.WithCacheDir("/tmp/nacos/cache"),
//constant.WithLogLevel("debug"),
)
// 创建配置管理客户端
client, err := clients.NewConfigClient(
vo.NacosClientParam{
ClientConfig: &cc,
ServerConfigs: sc,
},
)
if err != nil {
panic(err)
}
return &NacosClient{client}
}
// Set 设置配置
func (c *NacosClient) Set(dataId, group, content string) (bool, error) {
ok, err := c.client.PublishConfig(vo.ConfigParam{
DataId: dataId,
Group: group,
Content: content,
})
if err != nil {
logger.Errorf("设置nacos配置异常!dataId=%s, group=%s", dataId, group, err)
}
return ok, err
}
// Get 获取配置
func (c *NacosClient) Get(dataId, group string) (string, error) {
data, err := c.client.GetConfig(vo.ConfigParam{
DataId: dataId,
Group: group,
})
if err != nil {
logger.Errorf("获取nacos配置异常!dataId=%s, group=%s", dataId, group, err)
}
return data, err
}
// Listen 监听配置
func (c *NacosClient) Listen(dataId, group string, f func(content string)) error {
return c.client.ListenConfig(vo.ConfigParam{
DataId: dataId,
Group: group,
// 配置更新的监听
OnChange: func(namespace, group, dataId, data string) {
fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
f(data)
},
})
}
// CancelListen 取消监听配置
func (c *NacosClient) CancelListen(dataId, group string) error {
return c.client.CancelListenConfig(vo.ConfigParam{
DataId: dataId,
Group: group,
})
}
// Delete 删除配置
func (c *NacosClient) Delete(dataId, group string) error {
_, err := c.client.DeleteConfig(vo.ConfigParam{
DataId: dataId,
Group: group,
})
return err
}
func getHostAndPort(address string) (hostname, port string) {
parse, err := url.Parse(address)
if err != nil {
panic(err)
}
return parse.Hostname(), parse.Port()
}
工具类使用:
func main() {
Init()
_, err := Client.Set("test-data3", "test-group", "set is ok")
if err != nil {
panic(err)
}
data, err := Client.Get("test-data3", "test-group")
if err != nil {
panic(err)
}
fmt.Println("data:", data)
}
3. properties类型的工具类封装
var mutex sync.Mutex
// SetValue 设置配置,key=value
func (c *NacosClient) SetValue(group, dataId, key, value string) (bool, error) {
// 互斥锁
mutex.Lock()
defer mutex.Unlock()
// 获取旧配置
oldData, err := c.Get(group, dataId)
if err != nil {
return false, err
}
// string -> map
oldMap := util.StringPropertiesToMap(&oldData)
// 添加新配置
oldMap[key] = value
// map -> string
newData := util.MapToStringProperties(oldMap)
// 发布配置
return c.Set(group, dataId, newData)
}
// GetValue 获取配置key的值
func (c *NacosClient) GetValue(group, dataId, key string) (string, error) {
data, err := c.Get(group, dataId)
if err != nil {
return "", err
}
// string -> map
dataMap := util.StringPropertiesToMap(&data)
return dataMap[key], nil
}
string和map的转换代码:
package util
func StringPropertiesToMap(str *string) map[string]string {
m := make(map[string]string)
kvs := strings.Split(*str, "\n")
for _, kv := range kvs {
pair := strings.Split(kv, "=")
if len(pair) == 2 {
m[pair[0]] = pair[1]
}
}
return m
}
func MapToStringProperties(m map[string]string) string {
var str strings.Builder
for k, v := range m {
str.WriteString(k)
str.WriteString("=")
str.WriteString(v)
str.WriteString("\n")
}
return str.String()
}