Nacos-sdk-go是Nacos的Go语言客户端,它实现了服务发现和动态配置的功能
官方文档:https://github.com/nacos-group/nacos-sdk-go/blob/master/README_CN.md
支持Go>=v1.15版本
支持Nacos>2.x版本
go get -u github.com/nacos-group/nacos-sdk-go/v2
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)
}