rpcpubserver.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package internal
  2. import (
  3. "os"
  4. "strings"
  5. "github.com/wuntsong-org/go-zero-plus/core/discov"
  6. "github.com/wuntsong-org/go-zero-plus/core/netx"
  7. )
  8. const (
  9. allEths = "0.0.0.0"
  10. envPodIp = "POD_IP"
  11. )
  12. // NewRpcPubServer returns a Server.
  13. func NewRpcPubServer(etcd discov.EtcdConf, listenOn string, middlewares ServerMiddlewaresConf,
  14. opts ...ServerOption) (Server, error) {
  15. registerEtcd := func() error {
  16. pubListenOn := figureOutListenOn(listenOn)
  17. var pubOpts []discov.PubOption
  18. if etcd.HasAccount() {
  19. pubOpts = append(pubOpts, discov.WithPubEtcdAccount(etcd.User, etcd.Pass))
  20. }
  21. if etcd.HasTLS() {
  22. pubOpts = append(pubOpts, discov.WithPubEtcdTLS(etcd.CertFile, etcd.CertKeyFile,
  23. etcd.CACertFile, etcd.InsecureSkipVerify))
  24. }
  25. if etcd.HasID() {
  26. pubOpts = append(pubOpts, discov.WithId(etcd.ID))
  27. }
  28. pubClient := discov.NewPublisher(etcd.Hosts, etcd.Key, pubListenOn, pubOpts...)
  29. return pubClient.KeepAlive()
  30. }
  31. server := keepAliveServer{
  32. registerEtcd: registerEtcd,
  33. Server: NewRpcServer(listenOn, middlewares, opts...),
  34. }
  35. return server, nil
  36. }
  37. type keepAliveServer struct {
  38. registerEtcd func() error
  39. Server
  40. }
  41. func (s keepAliveServer) Start(fn RegisterFn) error {
  42. if err := s.registerEtcd(); err != nil {
  43. return err
  44. }
  45. return s.Server.Start(fn)
  46. }
  47. func figureOutListenOn(listenOn string) string {
  48. fields := strings.Split(listenOn, ":")
  49. if len(fields) == 0 {
  50. return listenOn
  51. }
  52. host := fields[0]
  53. if len(host) > 0 && host != allEths {
  54. return listenOn
  55. }
  56. ip := os.Getenv(envPodIp)
  57. if len(ip) == 0 {
  58. ip = netx.InternalIp()
  59. }
  60. if len(ip) == 0 {
  61. return listenOn
  62. }
  63. return strings.Join(append([]string{ip}, fields[1:]...), ":")
  64. }