跳至主要內容

nacos-配置中心与注册中心

gqzclGolang后端nacos后端大约 2 分钟

nacos-配置中心与注册中心

项目地址open in new window

安装nacos

需要先安装JAVA环境

下载安装包

直接使用2.0版本

wget https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.tar.gz
tar -xzvf nacos-server-2.1.0.tar.gz
cd nacos/bin
# 单机部署
sh startup.sh -m standalone
# 关闭服务器
sh shutdown.sh

控制台界面

打开http://x.x.x.x:8848/nacos ,初始用户名和密码为nacos。

项目中使用nacos

服务注册发现

package conf

import (
	"fmt"
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/clients/naming_client"
	"github.com/nacos-group/nacos-sdk-go/model"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"log"
	"sync"
)

var (
	namingClient naming_client.INamingClient
	nonce        = &sync.Once{}
)

func init() {
	GetNamingClient()
}

// GetNamingClient create naming client
func GetNamingClient() naming_client.INamingClient {
	if namingClient == nil {
		nonce.Do(func() {
			var err error
			namingClient, err = clients.NewNamingClient(
				vo.NacosClientParam{
					ClientConfig:  &cc,
					ServerConfigs: sc,
				},
			)
			if err != nil {
				fmt.Println("Naming client create failed")
			} else {
				fmt.Println("Naming client create success")
			}
		})
	}
	return namingClient
}

func RegisterInstance() error {
	// TODO 直接从配置文件导入
	success, err := namingClient.RegisterInstance(vo.RegisterInstanceParam{
		Ip:          "10.0.0.11",
		Port:        8848,
		ServiceName: "demo.go",
		Weight:      10,
		Enable:      true,
		Healthy:     true,
		Ephemeral:   true,
		Metadata:    map[string]string{"idc": "shanghai"},
		ClusterName: "cluster-a", // default value is DEFAULT
		GroupName:   "group-a",   // default value is DEFAULT_GROUP
	})
	if err != nil {
		return err
	}
	if success {
		fmt.Println("Register Instance successfully.")
	}
	return err
}

func Deregisterinstance() error {
	success, err := namingClient.DeregisterInstance(vo.DeregisterInstanceParam{
		Ip:          "10.0.0.11",
		Port:        8848,
		ServiceName: "demo.go",
		Ephemeral:   true,
		Cluster:     "cluster-a", // default value is DEFAULT
		GroupName:   "group-a",   // default value is DEFAULT_GROUP
	})
	if err != nil {
		return err
	}
	if success {
		fmt.Println("Deregister instance successfully")
	}
	return err
}

func GetAllInstances() ([]model.Instance, error) {
	instances, err := namingClient.SelectAllInstances(vo.SelectAllInstancesParam{
		ServiceName: "demo.go",
		GroupName:   "group-a",             // default value is DEFAULT_GROUP
		Clusters:    []string{"cluster-a"}, // default value is DEFAULT
	})
	if err != nil {
		return nil, err
	}
	return instances, err
}

func GetInstance() ([]model.Instance, error) {
	instance, err := namingClient.SelectInstances(vo.SelectInstancesParam{
		ServiceName: "demo.go",
		GroupName:   "group-a",             // default value is DEFAULT_GROUP
		Clusters:    []string{"cluster-a"}, // default value is DEFAULT
		HealthyOnly: true,
	})
	if err != nil {
		return nil, err
	}
	return instance, err
}

// GetOneHealthyInstance return one instance by WRR strategy for load balance
// And the instance should be health=true,enable=true and weight>0
func GetOneHealthyInstance() (*model.Instance, error) {
	instance, err := namingClient.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{
		ServiceName: "demo.go",
		GroupName:   "group-a",             // default value is DEFAULT_GROUP
		Clusters:    []string{"cluster-a"}, // default value is DEFAULT
	})
	if err != nil {
		return nil, err
	}
	return instance, err
}

func SubscribeClient() error {
	err := namingClient.Subscribe(&vo.SubscribeParam{
		ServiceName: "demo.go",
		GroupName:   "group-a",             // default value is DEFAULT_GROUP
		Clusters:    []string{"cluster-a"}, // default value is DEFAULT
		SubscribeCallback: func(services []model.SubscribeService, err error) {
			log.Printf("\n\n callback return services:%s \n\n", services)
		},
	})
	return err
}

func UnSubscribeClient() error {
	err := namingClient.Unsubscribe(&vo.SubscribeParam{
		ServiceName: "demo.go",
		GroupName:   "group-a",             // default value is DEFAULT_GROUP
		Clusters:    []string{"cluster-a"}, // default value is DEFAULT
		SubscribeCallback: func(services []model.SubscribeService, err error) {
			log.Printf("\n\n callback return services:%s \n\n", services)
		},
	})
	return err
}
func GetAllServiceName() (model.ServiceList, error) {
	serviceInfos, err := namingClient.GetAllServicesInfo(vo.GetAllServiceInfoParam{
		NameSpace: "0e83cc81-9d8c-4bb8-a28a-ff703187543f",
		PageNo:    1,
		PageSize:  10,
	})
	return serviceInfos, err
}

发布订阅配置

publish config:PublishConfig
success, err := configClient.PublishConfig(vo.ConfigParam{
    DataId:  "dataId",
    Group:   "group",
    Content: "hello world!222222"})
delete config:DeleteConfig
success, err = configClient.DeleteConfig(vo.ConfigParam{
    DataId: "dataId",
    Group:  "group"})
get config info:GetConfig
content, err := configClient.GetConfig(vo.ConfigParam{
    DataId: "dataId",
    Group:  "group"})
Listen config change event:ListenConfig
err := configClient.ListenConfig(vo.ConfigParam{
    DataId: "dataId",
    Group:  "group",
    OnChange: func(namespace, group, dataId, data string) {
        fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data)
	},
})
Cancel the listening of config change event:CancelListenConfig
err := configClient.CancelListenConfig(vo.ConfigParam{
    DataId: "dataId",
    Group:  "group",
})
Search config: SearchConfig
configPage, err := configClient.SearchConfig(vo.SearchConfigParam{
    Search:   "blur",
    DataId:   "",
    Group:    "",
    PageNo:   1,
    PageSize: 10,
})