rpcpubserver.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package internal
  2. import (
  3. "os"
  4. "strings"
  5. "github.com/tal-tech/go-zero/core/discov"
  6. "github.com/tal-tech/go-zero/core/netx"
  7. )
  8. const (
  9. allEths = "0.0.0.0"
  10. envPodIp = "POD_IP"
  11. )
  12. // NewRpcPubServer returns a Server.
  13. func NewRpcPubServer(etcdEndpoints []string, etcdKey, listenOn string,
  14. opts ...ServerOption) (Server, error) {
  15. registerEtcd := func() error {
  16. pubListenOn := figureOutListenOn(listenOn)
  17. pubClient := discov.NewPublisher(etcdEndpoints, etcdKey, pubListenOn)
  18. return pubClient.KeepAlive()
  19. }
  20. server := keepAliveServer{
  21. registerEtcd: registerEtcd,
  22. Server: NewRpcServer(listenOn, opts...),
  23. }
  24. return server, nil
  25. }
  26. type keepAliveServer struct {
  27. registerEtcd func() error
  28. Server
  29. }
  30. func (ags keepAliveServer) Start(fn RegisterFn) error {
  31. if err := ags.registerEtcd(); err != nil {
  32. return err
  33. }
  34. return ags.Server.Start(fn)
  35. }
  36. func figureOutListenOn(listenOn string) string {
  37. fields := strings.Split(listenOn, ":")
  38. if len(fields) == 0 {
  39. return listenOn
  40. }
  41. host := fields[0]
  42. if len(host) > 0 && host != allEths {
  43. return listenOn
  44. }
  45. ip := os.Getenv(envPodIp)
  46. if len(ip) == 0 {
  47. ip = netx.InternalIp()
  48. }
  49. if len(ip) == 0 {
  50. return listenOn
  51. }
  52. return strings.Join(append([]string{ip}, fields[1:]...), ":")
  53. }