github.com/glide-im/glide@v1.6.0/pkg/rpc/server.go (about) 1 package rpc 2 3 import ( 4 "fmt" 5 "github.com/rcrowley/go-metrics" 6 "github.com/rpcxio/rpcx-etcd/serverplugin" 7 "github.com/smallnest/rpcx/server" 8 "time" 9 ) 10 11 const ( 12 BaseServicePath = "/im_service" 13 ) 14 15 type ServerOptions struct { 16 Name string 17 Network string 18 Addr string 19 Port int 20 MaxRecvMsgSize int 21 MaxSendMsgSize int 22 EtcdServers []string 23 } 24 25 type BaseServer struct { 26 Srv *server.Server 27 28 Options *ServerOptions 29 etcdRegister *serverplugin.EtcdV3RegisterPlugin 30 reg []func(srv *BaseServer) error 31 id string 32 } 33 34 func NewBaseServer(options *ServerOptions) *BaseServer { 35 ret := &BaseServer{ 36 Srv: server.NewServer(), 37 id: fmt.Sprintf("%s@%s:%d", options.Name, options.Addr, options.Port), 38 } 39 40 if options.Network == "" { 41 options.Network = "tcp" 42 } 43 44 ret.Options = options 45 if len(options.EtcdServers) != 0 { 46 ret.etcdRegister = &serverplugin.EtcdV3RegisterPlugin{ 47 EtcdServers: options.EtcdServers, 48 BasePath: BaseServicePath, 49 Metrics: metrics.NewRegistry(), 50 UpdateInterval: time.Minute, 51 } 52 } 53 return ret 54 } 55 56 func (s *BaseServer) GetServerID() string { 57 if len(s.id) == 0 { 58 s.id = fmt.Sprintf("%s@%s:%d", s.Options.Name, s.Options.Addr, s.Options.Port) 59 } 60 return s.id 61 } 62 63 func (s *BaseServer) Register(name string, sv interface{}) { 64 s.reg = append(s.reg, func(srv *BaseServer) error { 65 return srv.Srv.RegisterName(name, sv, "") 66 }) 67 } 68 69 func (s *BaseServer) Run() error { 70 71 addr := fmt.Sprintf("%s:%d", s.Options.Addr, s.Options.Port) 72 73 if s.etcdRegister != nil { 74 s.etcdRegister.ServiceAddress = s.Options.Network + "@" + addr 75 76 err := s.etcdRegister.Start() 77 if err != nil { 78 return err 79 } 80 s.Srv.Plugins.Add(s.etcdRegister) 81 } 82 83 for _, f := range s.reg { 84 if er := f(s); er != nil { 85 return er 86 } 87 } 88 89 return s.Srv.Serve(s.Options.Network, addr) 90 }