go集成nacos配置管理

1、go.mod引入nacos-sdk-go

官方版本地址:https://github.com/nacos-group/nacos-sdk-go/releases

require (
	github.com/nacos-group/nacos-sdk-go/v2 v2.2.1
)

2、代码使用

1. 示例

官方示例:https://github.com/nacos-group/nacos-sdk-go/blob/master/example/config/main.go

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()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值