github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/framework/registry/nacos/node.go (about)

     1  package nacos
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/hashicorp/go-sockaddr"
     6  	"github.com/pkg/errors"
     7  	"github.com/unionj-cloud/go-doudou/framework/buildinfo"
     8  	"github.com/unionj-cloud/go-doudou/framework/internal/config"
     9  	"github.com/unionj-cloud/go-doudou/toolkit/cast"
    10  	"github.com/unionj-cloud/go-doudou/toolkit/constants"
    11  	"github.com/unionj-cloud/go-doudou/toolkit/stringutils"
    12  	logger "github.com/unionj-cloud/go-doudou/toolkit/zlogger"
    13  	"github.com/wubin1989/nacos-sdk-go/clients"
    14  	"github.com/wubin1989/nacos-sdk-go/clients/naming_client"
    15  	"github.com/wubin1989/nacos-sdk-go/vo"
    16  	"runtime"
    17  	"strconv"
    18  	"sync"
    19  	"time"
    20  )
    21  
    22  var NamingClient naming_client.INamingClient
    23  
    24  var GetPrivateIP = sockaddr.GetPrivateIP
    25  
    26  func getRegisterHost() string {
    27  	registerHost := config.DefaultGddNacosRegisterHost
    28  	if stringutils.IsNotEmpty(config.GddNacosRegisterHost.Load()) {
    29  		registerHost = config.GddNacosRegisterHost.Load()
    30  	}
    31  	if stringutils.IsEmpty(registerHost) {
    32  		var err error
    33  		registerHost, err = GetPrivateIP()
    34  		if err != nil {
    35  			logger.Panic().Err(err).Msg("[go-doudou] failed to get interface addresses")
    36  		}
    37  		if stringutils.IsEmpty(registerHost) {
    38  			logger.Panic().Msg("[go-doudou] no private IP address found, and explicit IP not provided")
    39  		}
    40  	}
    41  	return registerHost
    42  }
    43  
    44  func getPort() uint64 {
    45  	httpPort := config.DefaultGddPort
    46  	if stringutils.IsNotEmpty(config.GddPort.Load()) {
    47  		if port, err := cast.ToIntE(config.GddPort.Load()); err == nil {
    48  			httpPort = port
    49  		}
    50  	}
    51  	return uint64(httpPort)
    52  }
    53  
    54  func getServiceName() string {
    55  	service := config.DefaultGddServiceName
    56  	if stringutils.IsNotEmpty(config.GddServiceName.Load()) {
    57  		service = config.GddServiceName.Load()
    58  	}
    59  	if stringutils.IsEmpty(service) {
    60  		logger.Panic().Msgf("[go-doudou] no value for environment variable %s found", config.GddServiceName)
    61  	}
    62  	return service
    63  }
    64  
    65  var onceNacos sync.Once
    66  var NewNamingClient = clients.NewNamingClient
    67  
    68  func InitialiseNacosNamingClient() {
    69  	var err error
    70  	NamingClient, err = NewNamingClient(config.GetNacosClientParam())
    71  	if err != nil {
    72  		logger.Panic().Err(err).Msg("[go-doudou] failed to create nacos discovery client")
    73  	}
    74  }
    75  
    76  func NewNode(data ...map[string]interface{}) error {
    77  	onceNacos.Do(func() {
    78  		InitialiseNacosNamingClient()
    79  	})
    80  	registerHost := getRegisterHost()
    81  	httpPort := getPort()
    82  	service := getServiceName()
    83  	weight := config.DefaultGddWeight
    84  	if stringutils.IsNotEmpty(config.GddWeight.Load()) {
    85  		if w, err := cast.ToIntE(config.GddWeight.Load()); err == nil {
    86  			weight = w
    87  		}
    88  	}
    89  	buildTime := buildinfo.BuildTime
    90  	if stringutils.IsNotEmpty(buildinfo.BuildTime) {
    91  		if t, err := time.Parse(constants.FORMAT15, buildinfo.BuildTime); err == nil {
    92  			buildTime = t.Local().Format(constants.FORMAT8)
    93  		}
    94  	}
    95  	rr := config.DefaultGddRouteRootPath
    96  	if stringutils.IsNotEmpty(config.GddRouteRootPath.Load()) {
    97  		rr = config.GddRouteRootPath.Load()
    98  	}
    99  	metadata := make(map[string]string)
   100  	metadata["registerAt"] = time.Now().Local().Format(constants.FORMAT8)
   101  	metadata["goVer"] = runtime.Version()
   102  	metadata["gddVer"] = buildinfo.GddVer
   103  	metadata["buildUser"] = buildinfo.BuildUser
   104  	metadata["buildTime"] = buildTime
   105  	metadata["weight"] = strconv.Itoa(weight)
   106  	metadata["rootPath"] = rr
   107  	for _, item := range data {
   108  		for k, v := range item {
   109  			metadata[k] = fmt.Sprint(v)
   110  		}
   111  	}
   112  	success, err := NamingClient.RegisterInstance(vo.RegisterInstanceParam{
   113  		Ip:          registerHost,
   114  		Port:        httpPort,
   115  		Weight:      float64(weight),
   116  		Enable:      true,
   117  		Healthy:     true,
   118  		Metadata:    metadata,
   119  		ClusterName: config.GddNacosClusterName.LoadOrDefault(config.DefaultGddNacosClusterName),
   120  		ServiceName: service,
   121  		GroupName:   config.GddNacosGroupName.LoadOrDefault(config.DefaultGddNacosGroupName),
   122  		Ephemeral:   true,
   123  	})
   124  	if err != nil {
   125  		return errors.Errorf("[go-doudou] failed to register to nacos server: %s", err)
   126  	}
   127  	if success {
   128  		logger.Info().Msg("[go-doudou] registered to nacos server successfully")
   129  	}
   130  	return nil
   131  }
   132  
   133  func Shutdown() {
   134  	if NamingClient != nil {
   135  		registerHost := getRegisterHost()
   136  		httpPort := getPort()
   137  		service := getServiceName()
   138  		success, err := NamingClient.DeregisterInstance(vo.DeregisterInstanceParam{
   139  			Ip:          registerHost,
   140  			Port:        httpPort,
   141  			ServiceName: service,
   142  			Ephemeral:   true,
   143  		})
   144  		NamingClient = nil
   145  		if err != nil {
   146  			logger.Error().Err(err).Msg("[go-doudou] failed to deregister from nacos server")
   147  			return
   148  		}
   149  		if !success {
   150  			logger.Error().Msg("[go-doudou] failed to deregister from nacos server")
   151  			return
   152  		}
   153  		logger.Info().Msg("[go-doudou] deregistered from nacos server successfully")
   154  	}
   155  }