插件化架构(Plug-in Architecture)是一种面向功能进行拆分的可扩展性架构,通常用于存在多个版本、需要下载安装才能使用的客户端应用,例如 php等这类解释器的扩展模块、Eclipse、notepad++ 这类 IDE 软件的插件、Nginx的模块等。当然,后台业务系统也可以设计成插件化架构来实现高扩展性。

基本架构

插件化架构包含两类组件:核心系统(core system)和插件模块(plug-in modules):

  • 核心系统负责和具体业务功能无关的通用功能,例如模块加载、模块间通信等;
  • 插件模块负责实现具体的业务逻辑,例如php扩展中的xdebug扩展实现了代码debug功能,Nginx的openResty模块用于搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关等。

上面这张图中核心系统 Core System 功能比较稳定,不会因为业务功能扩展而不断修改,插件模块可以根据业务功能的需要不断地扩展。

插件化架构本质就是将变化部分封装在插件里面,从而达到快速灵活扩展的目的,而又不影响整体系统的稳定。

设计关键点

插件化的核心系统设计的关键技术有:插件管理、插件连接和插件通信。

  1. 插件管理
    核心系统需要知道当前有哪些插件可用,如何加载这些插件,什么时候加载插件。常见的实现方法是插件注册表机制。核心系统提供插件注册表(可以是配置文件,也可以是代码,还可以是数据库),插件注册表含有每个插件模块的信息,包括它的名字、位置、加载时机(启动就加载,还是按需加载)等。
  2. 插件连接
    插件连接指插件如何连接到核心系统。通常来说,核心系统必须制定插件和核心系统的连接规范,然后插件按照规范实现,核心系统按照规范加载即可。常见的连接机制有 OSGi(Eclipse 使用)、消息模式(自定义消息)、依赖注入(Spring 使用),甚至使用分布式的协议都是可以的,比如 RPC 或者 HTTP Web 的方式。
  3. 插件通信
    插件通信指插件间的通信。虽然设计的时候插件间是完全解耦的,但实际业务运行过程中,必然会出现某个业务流程需要多个插件协作,这就要求两个插件间进行通信。由于插件之间没有直接联系,通信必须通过核心系统,因此核心系统需要提供插件通信机制。这种情况和计算机类似,计算机的 CPU、硬盘、内存、网卡是独立设计的配件,但计算机运行过程中,CPU 和内存、内存和硬盘肯定是有通信的,计算机通过主板上的总线提供了这些组件之间的通信功能。微内核的核心系统也必须提供类似的通信机制,各个插件之间才能进行正常的通信。