Skip to content

Latest commit

 

History

History
107 lines (64 loc) · 5.85 KB

plugin_management.md

File metadata and controls

107 lines (64 loc) · 5.85 KB

English

前言

tRPC-Cpp 框架基于接口编程的思想,把框架功能抽象成一系列的插件组件,通过插件工厂来管理。框架在运行过程中串联这些插件组件,拼装出完整的功能。我们可以把插件模型分为以下部分:

  1. 框架设计层:框架只定义标准接口和使用规范,不限定具体实现,与平台完全解耦。
  2. 插件实现层:将插件按框架标准接口封装起来即可实现框架插件。
  3. 用户使用层:业务开发只需要注册自己需要的插件即可,按需索取,拿来即用。

在这篇文档中我们对框架插件的管理进行介绍,开发者可以了解到以下内容:

  • 框架支持的插件类型
  • 插件的注册方式
  • 插件的依赖管理

插件类型

框架插件化支持的模块类型较多,有框架主体实现相关的,服务治理相关的,还有一些重要的特性。本节对常见插件类型进行介绍。

协议插件

支持用户使用自定义的协议进行通信,而不止局限于使用框架默认提供的 trpchttp 协议。详细介绍请参考开发自定义协议文档

拦截器

框架借鉴 java 面向切面(AOP)的编程思想,支持了拦截器来扩展框架的功能,以及对接不同的生态。例如使用者可以通过自定义拦截器来实现服务限流、服务监控等功能。详细介绍请参考开发自定义拦截器文档

服务治理插件

其他特性

  • 序列化插件

    支持自定义通信消息的序列化方式,如 protobuf 序列化、json 序列化等。详细介绍请参考消息序列化文档

  • 压缩插件

    支持自定义通信消息的压缩、解压缩方式,如:zlib、gzip等。详细介绍请参考压缩/解压缩文档

插件注册方式

用户需要在框架启动时通过框架提供的注册接口,来将插件注册到对应类型的插件工厂中。这些接口由trpc::TrpcPlugin提供。

例如注册自定义监控插件:

trpc::TrpcPlugin::GetInstance()->RegisterMetrics(trpc::MakeRefCounted<CustomMetrics>());

依赖管理

不同的插件之间可能存在依赖关系,例如配置的拉取可能需要先查询名字服务。这就要求多个插件的初始化、销毁等操作必须按照一定的顺序来进行。

tPPC-Cpp 框架提供了一套插件依赖管理的方案:

  1. 首先插件开发者需要明确指出其实现的插件依赖的其他插件,通过 GetDependencies 接口返回依赖的插件的名字。

    class Plugin : public RefCounted<Plugin> {
    public:
    /// @brief get the collection of plugins that this plugin depends on
    ///        dependent plugins need to be initialized first
    /// @note If there are cases of dependencies with the same name (possible in cases where the types are
    ///       different), the plugin_name needs to follow the following format: 'plugin_name#plugin_type', where
    ///       plugin_name is the name of the plugin and plugin_type is the corresponding index of the plugin type.
    virtual void GetDependencies(std::vector<std::string>& plugin_names) const {}
    };
  2. 插件使用者注册的插件实例只需要创建,不需要手动调用插件的 InitDestroy等接口,它们会由框架自动执行。

  3. 框架会分析所有已注册插件之间的依赖关系,并按照以下规则对插件进行管理:

    • 启动时,先调用被依赖插件的 InitStart接口,然后再调用不被依赖的插件的 InitStart接口。例如插件 A 依赖插件 B,则先初始化插件 B,再初始化插件 A。
    • 退出时,先调用未被依赖的插件的 StopDestroy接口,然后再调用被依赖插件的 StopDestroy接口。例如插件 A 依赖插件B,则先销毁插件 A,再销毁插件 B。