4、nacos

Nacos-sdk-go是Nacos的Go语言客户端,它实现了服务发现和动态配置的功能

官方文档:https://github.com/nacos-group/nacos-sdk-go/blob/master/README_CN.md

使用限制

支持Go>=v1.15版本

支持Nacos>2.x版本

安装SDK

go get -u github.com/nacos-group/nacos-sdk-go/v2

API

constant.ClientConfig{
	TimeoutMs            uint64 // 请求Nacos服务端的超时时间,默认是10000ms
	NamespaceId          string // ACM的命名空间Id
	Endpoint             string // 当使用ACM时,需要该配置. https://help.aliyun.com/document_detail/130146.html
	RegionId             string // ACM&KMS的regionId,用于配置中心的鉴权
	AccessKey            string // ACM&KMS的AccessKey,用于配置中心的鉴权
	SecretKey            string // ACM&KMS的SecretKey,用于配置中心的鉴权
	OpenKMS              bool   // 是否开启kms,默认不开启,kms可以参考文档 https://help.aliyun.com/product/28933.html
	                            // 同时DataId必须以"cipher-"作为前缀才会启动加解密逻辑
	CacheDir             string // 缓存service信息的目录,默认是当前运行目录
	UpdateThreadNum      int    // 监听service变化的并发数,默认20
	NotLoadCacheAtStart  bool   // 在启动的时候不读取缓存在CacheDir的service信息
	UpdateCacheWhenEmpty bool   // 当service返回的实例列表为空时,不更新缓存,用于推空保护
	Username             string // Nacos服务端的API鉴权Username
	Password             string // Nacos服务端的API鉴权Password
	LogDir               string // 日志存储路径
	RotateTime           string // 日志轮转周期,比如:30m, 1h, 24h, 默认是24h
	MaxAge               int64  // 日志最大文件数,默认3
	LogLevel             string // 日志默认级别,值必须是:debug,info,warn,error,默认值是info
}
constant.ServerConfig{
	ContextPath string // Nacos的ContextPath,默认/nacos,在2.0中不需要设置
	IpAddr      string // Nacos的服务地址
	Port        uint64 // Nacos的服务端口
	Scheme      string // Nacos的服务地址前缀,默认http,在2.0中不需要设置
	GrpcPort    uint64 // Nacos的 grpc 服务端口, 默认为 服务端口+1000, 不是必填
}

使用

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"
	"github.com/spf13/viper"
	"log"
	"strings"
)

func main() {
	connectNacos()
	// 死循环,模拟服务器运行
	for {

	}
}

func connectNacos() {
	// 客户端配置
	clientConfig := constant.ClientConfig{
		NamespaceId:         "", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogDir:              "log",
		CacheDir:            "cache",
		LogLevel:            "debug",
	}
	// nacos服务端配置
	serverConfigs := []constant.ServerConfig{
		{
			IpAddr:      "127.0.0.1", //此处可以使用网址和ip
			ContextPath: "/nacos",
			Port:        8848,
			Scheme:      "http",
		},
	}

	// 创建服务发现客户端
	namingClient, err := clients.NewNamingClient(
		vo.NacosClientParam{
			ClientConfig:  &clientConfig,
			ServerConfigs: serverConfigs,
		},
	)
	if err != nil {
		log.Fatal("创建服务发现客户端失败", err)
	}
	// 将客户端实例注册到nacos
	r, err := namingClient.RegisterInstance(vo.RegisterInstanceParam{
		Ip:          "127.0.0.1",
		Port:        8848,
		ServiceName: "myserver",
		Weight:      10,
		Enable:      true,
		Healthy:     true,
		Ephemeral:   true,
		Metadata:    map[string]string{"idc": "shanghai"},
		ClusterName: "DEFAULT",       // 默认值DEFAULT
		GroupName:   "DEFAULT_GROUP", // 默认值DEFAULT_GROUP
	})
	if !r || err != nil {
		log.Fatal("客户端实例注册失败", err)
	}

	// 创建动态配置客户端
	configClient, err := clients.NewConfigClient(
		vo.NacosClientParam{
			ClientConfig:  &clientConfig,
			ServerConfigs: serverConfigs,
		},
	)
	if err != nil {
		log.Fatal("创建动态配置客户端失败", err)
	}
	// 获取多个配置
	confStr1, err := configClient.GetConfig(vo.ConfigParam{
		DataId: "config1.yml",
		Group:  "DEFAULT_GROUP",
	})
	confStr2, err := configClient.GetConfig(vo.ConfigParam{
		DataId: "config2.yml",
		Group:  "DEFAULT_GROUP",
	})
	log.Printf("读取到配置:\n%s\n", confStr1)
	// 解析配置文件
	config := viper.New()
	config.SetConfigType("yml")
	config.ReadConfig(strings.NewReader(confStr1))
	config.MergeConfig(strings.NewReader(confStr2))
	username := config.GetString("mysql.username")
	password := config.GetString("mysql.password")
	port := config.GetString("server.port")
	fmt.Printf("username=%s,password=%s,port=%s\n", username, password, port)
}