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 }