1. 程式人生 > >rpcx服務框架淺析10-擴充套件Plugin

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

(ctx, req, err)     if err == nil {         err = perr     }     return req, err }

再例如註冊中心也是利用外掛機制實現的,如程式碼:

向服務提供方例項新增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 }