gf/net/ghttp/ghttp_server_registry.go

132 lines
3.3 KiB
Go

// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package ghttp
import (
"context"
"fmt"
"github.com/gogf/gf/v2/net/gipv4"
"github.com/gogf/gf/v2/net/gsvc"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
)
// doServiceRegister registers current service to Registry.
func (s *Server) doServiceRegister() {
if s.registrar == nil {
return
}
var (
ctx = gctx.GetInitCtx()
protocol = gsvc.DefaultProtocol
insecure = true
err error
)
if s.config.TLSConfig != nil {
protocol = `https`
insecure = false
}
metadata := gsvc.Metadata{
gsvc.MDProtocol: protocol,
gsvc.MDInsecure: insecure,
}
s.service = &gsvc.LocalService{
Name: s.GetName(),
Endpoints: s.calculateListenedEndpoints(ctx),
Metadata: metadata,
}
s.Logger().Debugf(ctx, `service register: %+v`, s.service)
if len(s.service.GetEndpoints()) == 0 {
s.Logger().Warningf(ctx, `no endpoints found to register service, abort service registering`)
return
}
if s.service, err = s.registrar.Register(ctx, s.service); err != nil {
s.Logger().Fatalf(ctx, `%+v`, err)
}
}
// doServiceDeregister de-registers current service from Registry.
func (s *Server) doServiceDeregister() {
if s.registrar == nil {
return
}
var ctx = gctx.GetInitCtx()
s.Logger().Debugf(ctx, `service deregister: %+v`, s.service)
if err := s.registrar.Deregister(ctx, s.service); err != nil {
s.Logger().Errorf(ctx, `%+v`, err)
}
}
func (s *Server) calculateListenedEndpoints(ctx context.Context) gsvc.Endpoints {
var (
configAddr = s.config.Address
endpoints = make(gsvc.Endpoints, 0)
addresses = s.config.Endpoints
)
if configAddr == "" {
configAddr = s.config.HTTPSAddr
}
if len(addresses) == 0 {
addresses = gstr.SplitAndTrim(configAddr, ",")
}
for _, address := range addresses {
var (
addrArray = gstr.Split(address, ":")
listenedIps []string
listenedPorts []int
)
if len(addrArray) == 1 {
addrArray = append(addrArray, gconv.String(defaultEndpointPort))
}
// IPs.
switch addrArray[0] {
case "127.0.0.1":
// Nothing to do.
case "0.0.0.0", "":
intranetIps, err := gipv4.GetIntranetIpArray()
if err != nil {
s.Logger().Errorf(ctx, `error retrieving intranet ip: %+v`, err)
return nil
}
// If no intranet ips found, it uses all ips that can be retrieved,
// it may include internet ip.
if len(intranetIps) == 0 {
allIps, err := gipv4.GetIpArray()
if err != nil {
s.Logger().Errorf(ctx, `error retrieving ip from current node: %+v`, err)
return nil
}
s.Logger().Noticef(
ctx,
`no intranet ip found, using internet ip to register service: %v`,
allIps,
)
listenedIps = allIps
break
}
listenedIps = intranetIps
default:
listenedIps = []string{addrArray[0]}
}
// Ports.
switch addrArray[1] {
case "0":
listenedPorts = s.GetListenedPorts()
default:
listenedPorts = []int{gconv.Int(addrArray[1])}
}
for _, ip := range listenedIps {
for _, port := range listenedPorts {
endpoints = append(endpoints, gsvc.NewEndpoint(fmt.Sprintf(`%s:%d`, ip, port)))
}
}
}
return endpoints
}