在项目中,Nacos经常用来作为配置中心或者服务注册中心,虽然Nacos是用Java写的,但是同时Nacos官方提供了多语言的客户端SDK,因此Go来做微服务的时候也是会优先考虑;
我在集成Nacos到项目前,先进行了测试,我是在虚拟机中docker安装nacos服务端:
docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -p8848:8848 -d nacos/nacos-server:latest
安装完成后,本机上访问 xxx:8848/nacos 没有问题:
于是尝试在Go里面获取在配置中心中注册的配置,比如现在这里获取user-web.yaml在dev group中的配置信息:
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"
)
func main() {
sc := []constant.ServerConfig{
*constant.NewServerConfig("192.168.1.120", 8848, constant.WithContextPath("/nacos")),
}
//create ClientConfig
cc := *constant.NewClientConfig(
constant.WithNamespaceId("efb95058-a55f-4840-a4f2-2c5faa2b0928"),
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)
}
content, err := client.GetConfig(vo.ConfigParam{
DataId: "user-web.yaml",
Group: "dev",
})
fmt.Println("GetConfig,config :" + content)
}
这里面核心的 server的ip、port、namespace(可以同时监听多个namespace,这里我只监听一个)、然后配置文件的DataId和Group,这几个信息正确了就应该能正常读取到配置,但是问题是我这边运行会报一个错误:
Client not connected,current status:STARTING.
而且在输出的日志文件中,它显示在连接 9848 这个端口,按理说nacos的默认端口配置的不是8848吗,为什么会去连9848,后来在官方文档里发现了问题,目前的最新版本是nacos2,nacos2新增了gRPC通信方式,要额外占用两个端口,9848和9849,这是通过我们配置的默认端口8848偏移1000和1001得到的,然后前面docker中安装nacos的时候只转发了8848这个端口,9848和9949是没有开放的,自然请求不到这两个端口
解决办法就是:给nacos docker添加9848 和 9849两个端口,具体方法可以参考下面这篇:
添加docker容器端口(映射宿主机和docker容器中的端口)_Looho_的博客-CSDN博客_docker 增加容器端口
至此,DEMO代码运行正常