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:   "tcp@192.168.10.25:"+*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
}

系列文章

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值