golang实现nacos获取配置和服务注册-支持集群详解

作者:

文章目录
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Golang基于泛化调用与Nacos实现Dubbo代理 详解golang consul-grpc 服务注册与发现
  • 目录
    • golang nacos获取配置和服务注册-支持集群
      • 初始化客户端
      • 可选参数配置
      • new一个客户端 支持集群配置
      • 获取配置信息
      • 服务注册
      • 获取配置后如何和项目中的vipper如何无缝对接?
    • 总结

      结构体中IpAddres 可以配置多个地址

      package utils
      
      import (
      	"github.com/nacos-group/nacos-sdk-go/clients/config_client"
      	"github.com/nacos-group/nacos-sdk-go/clients/naming_client"
      	"github.com/nacos-group/nacos-sdk-go/vo"
      	"time"
      )
      
      type NacosConfigClient struct {
      	//ConfigInput
      	//"ip1,ip2,ip3"
      	IpAddrs string
      	Port    int
      	NaocesNameSpace string
      	DataId          string
      	Group           string
      	NacosLogDir     string
      	NacosCacheDir   string
      	//NamingInput
      	NamingServiceName string
      	NamingServiceIP   string
      	NamingOwner       string
      	NamingPort        int
      	//Output
      	ConfigClient config_client.IConfigClient
      	NamingClient naming_client.INamingClient
      }
      

      type OptionNacos func(msg *NacosConfigClient)
      
      //config naming
      func OptionNacosConfigWithServiceName(serviceName string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NamingServiceName = serviceName
      	}
      }
      func OptionNacosConfigWithServiceIP(serviceIP string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NamingServiceIP = serviceIP
      	}
      }
      
      func OptionNacosConfigWithOwner(owner string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NamingOwner = owner
      	}
      }
      
      //config client
      func OptionNacosConfigWithLogDir(logDir string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NacosLogDir = logDir
      	}
      }
      
      func OptionNacosConfigWithCacheDir(cacheDir string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NacosCacheDir = cacheDir
      	}
      }
      
      func OptionNacosConfigWithIpaddr(ipAddrr string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.IpAddrs = ipAddrr
      	}
      }
      func OptionNacosConfigWithNameSpace(nameSpace string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NaocesNameSpace = nameSpace
      	}
      }
      func OptionNacosConfigWithPort(port int) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.Port = port
      	}
      }
      
      func OptionNacosConfigDataId(dataId string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.DataId = dataId
      	}
      }
      
      func OptionNacosConfigGroup(group string) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.Group = group
      	}
      }
      
      func OptionNacosWithNamingPort(port int) OptionNacos {
      	return func(msg *NacosConfigClient) {
      		msg.NamingPort = port
      	}
      }
      
      

      func NewNacosClient(ops ...OptionNacos) *NacosConfigClient{
      	nacosConfigClient := new(NacosConfigClient)
      	for _, o := range ops {
      		o(nacosConfigClient)
      	}
      	serverConfigs:=make([]constant.ServerConfig,0)
      	 address:=strings.Split(nacosConfigClient.IpAddrs,",")
      	 for i:=range address{
      		 serverConfigs=append(serverConfigs,constant.ServerConfig{
      			 IpAddr: address[i],
      			 Port:   uint64(nacosConfigClient.Port),
      		 })
      	 }
      	clientConfig := constant.ClientConfig{
      		NamespaceId:         nacosConfigClient.NaocesNameSpace, //
      		NotLoadCacheAtStart: false,
      		TimeoutMs:           5 * 1000,
      		LogDir:              nacosConfigClient.NacosLogDir,
      		CacheDir:            nacosConfigClient.NacosCacheDir,
      	}
      
      	configClient, err := clients.NewConfigClient(
      		vo.NacosClientParam{
      			ClientConfig:  &clientConfig,
      			ServerConfigs: serverConfigs,
      		},
      	)
      
      	if err != nil {
      		panic(err)
      	}
      	nacosConfigClient.ConfigClient = configClient
      
      	// Naming client
      	namingClient, err := clients.NewNamingClient(
      		vo.NacosClientParam{
      			ClientConfig:  &clientConfig,
      			ServerConfigs: serverConfigs,
      		},
      	)
      	if err != nil {
      		panic(err)
      	}
      	nacosConfigClient.NamingClient = namingClient
      	return nacosConfigClient
      }
      
      

      func (client *NacosConfigClient) GetConfig() (string, error) {
      	content, err := client.ConfigClient.GetConfig(vo.ConfigParam{
      		DataId: client.DataId,
      		Group:  client.Group,
      	})
      	return content, err
      }
      

      func (client *NacosConfigClient) Register() (bool, error) {
      	param := vo.RegisterInstanceParam{
      		Ip:          client.NamingServiceIP,
      		Port:        uint64(client.NamingPort),
      		ServiceName: client.NamingServiceName,
      		Weight:      10,
      		Enable:      true,
      		Healthy:     true,
      		Ephemeral:   true,
      		Metadata:    map[string]string{"owenr": client.NamingOwner, "uptime": time.Now().Format("2006-01-02 15:04:05")},
      	}
      	success, err := client.NamingClient.RegisterInstance(param)
      	return success, err
      }
      

      func InitConfig() {
      	config = viper.New()
      	config.SetConfigType("yaml")
      	config.ReadConfig(bytes.NewReader([]byte(GetNacosConfig())))
      }
      
      func GetNacosConfig() string {
      	content,err:=GetNacosClient().GetConfig()
      	if err!=nil{
      		panic(err)
      	}
      	return content
      }
      
      

      这样就可以进行vipper正常操作了

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      您可能感兴趣的文章:

      • Golang基于泛化调用与Nacos实现Dubbo代理
      • 详解golang consul-grpc 服务注册与发现

      站内搜索