|
|
|
package internal
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/tal-tech/go-zero/core/discov"
|
|
|
|
"github.com/tal-tech/go-zero/core/netx"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
allEths = "0.0.0.0"
|
|
|
|
envPodIp = "POD_IP"
|
|
|
|
)
|
|
|
|
|
|
|
|
// NewRpcPubServer returns a Server.
|
|
|
|
func NewRpcPubServer(etcd discov.EtcdConf, listenOn string, opts ...ServerOption) (Server, error) {
|
|
|
|
registerEtcd := func() error {
|
|
|
|
pubListenOn := figureOutListenOn(listenOn)
|
|
|
|
var pubOpts []discov.PubOption
|
|
|
|
if etcd.HasAccount() {
|
|
|
|
pubOpts = append(pubOpts, discov.WithPubEtcdAccount(etcd.User, etcd.Pass))
|
|
|
|
}
|
|
|
|
if etcd.HasTLS() {
|
|
|
|
pubOpts = append(pubOpts, discov.WithPubEtcdTLS(etcd.CertFile, etcd.CertKeyFile,
|
|
|
|
etcd.CACertFile, etcd.InsecureSkipVerify))
|
|
|
|
}
|
|
|
|
pubClient := discov.NewPublisher(etcd.Hosts, etcd.Key, pubListenOn, pubOpts...)
|
|
|
|
return pubClient.KeepAlive()
|
|
|
|
}
|
|
|
|
server := keepAliveServer{
|
|
|
|
registerEtcd: registerEtcd,
|
|
|
|
Server: NewRpcServer(listenOn, opts...),
|
|
|
|
}
|
|
|
|
|
|
|
|
return server, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type keepAliveServer struct {
|
|
|
|
registerEtcd func() error
|
|
|
|
Server
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ags keepAliveServer) Start(fn RegisterFn) error {
|
|
|
|
if err := ags.registerEtcd(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return ags.Server.Start(fn)
|
|
|
|
}
|
|
|
|
|
|
|
|
func figureOutListenOn(listenOn string) string {
|
|
|
|
fields := strings.Split(listenOn, ":")
|
|
|
|
if len(fields) == 0 {
|
|
|
|
return listenOn
|
|
|
|
}
|
|
|
|
|
|
|
|
host := fields[0]
|
|
|
|
if len(host) > 0 && host != allEths {
|
|
|
|
return listenOn
|
|
|
|
}
|
|
|
|
|
|
|
|
ip := os.Getenv(envPodIp)
|
|
|
|
if len(ip) == 0 {
|
|
|
|
ip = netx.InternalIp()
|
|
|
|
}
|
|
|
|
if len(ip) == 0 {
|
|
|
|
return listenOn
|
|
|
|
}
|
|
|
|
|
|
|
|
return strings.Join(append([]string{ip}, fields[1:]...), ":")
|
|
|
|
}
|