rpcx服務框架淺析10-擴充套件Plugin
RPCX分散式服務框架主要致力於提供高效能和透明化的RPC遠端服務呼叫。
RPCX框架可能考慮到擴充套件性(猜測而已),增加了一個外掛功能,引入了外掛介面,如下:
type PluginContainer interface { Add(plugin Plugin) Remove(plugin Plugin) All() []Plugin DoRegister(name string, rcvr interface{}, metadata string) error DoRegisterFunction(name string, fn interface{}, metadata string) error DoUnregister(name string) error DoPostConnAccept(net.Conn) (net.Conn, bool) DoPostConnClose(net.Conn) bool DoPreReadRequest(ctx context.Context) error DoPostReadRequest(ctx context.Context, r *protocol.Message, e error) error DoPreWriteResponse(context.Context, *protocol.Message, *protocol.Message) error DoPostWriteResponse(context.Context, *protocol.Message, *protocol.Message, error) error DoPreWriteRequest(ctx context.Context) error DoPostWriteRequest(ctx context.Context, r *protocol.Message, e error) error }
在一些關鍵事件中會進行PreXXX呼叫,處理完流程後會進行PostXXX呼叫,如程式碼:
func (s *Server) readRequest(ctx context.Context, r io.Reader) (req *protocol.Message, err error) {
err = s.Plugins.DoPreReadRequest(ctx)
if err != nil {
return nil, err
}
// pool req?
req = protocol.GetPooledMsg()
err = req.Decode(r)
perr := s.Plugins.DoPostReadRequest
再例如註冊中心也是利用外掛機制實現的,如程式碼:
向服務提供方例項新增zookeeper註冊中心
plugin := &serverplugin.ZooKeeperRegisterPlugin{ ServiceAddress: "[email protected]:"+*port, ZooKeeperServers: []string{"192.168.10.25:2181"}, BasePath: "/rpcx_test", Metrics: metrics.NewRegistry(), UpdateInterval: time.Minute, } if err := plugin.Start();err != nil { server.Close() os.Exit(1) }else{ server.Plugins.Add(plugin) } server.Plugins.Add(&plugin2.PluginAll{})
func (s *Server) RegisterName(name string, rcvr interface{}, metadata string) error { if s.Plugins == nil { s.Plugins = &pluginContainer{} }
s.Plugins.DoRegister(name, rcvr, metadata) //呼叫註冊中心實際處理函式 _, err := s.register(rcvr, name, true) return err }