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  }