解决方案设计方案

如何设计业务组件动态加载方案

2019-10-06  本文已影响0人  无醉_1866

概念

术语 意义
资源包(ResourceArchive, Archive) Zip包,包含业务组件工程打出来的jar及其依赖的jar,可使用maven-assembly插件打包
业务组件 需要动态加载并执行的代码,一个资源包中可包含多个业务组件
业务组件工程 开发业务组件的java工程,允许有依赖

我为什么需要动态加载

为什么不使用OSGI

OSGI确实提供了类隔离能力,但OSGI太重太复杂,难以掌控,我们需要轻量级简单易用的方案

如何设计架构

使用方式

不同角色

整个过程如上图,整个体系中包含多个角色,开发者开发业务组件工程,打包成zip后上传到平台,平台会保存上传的zip文件,并做动态加载,当有业务系统请求/消息,平台会调用资源包中的业务组件对请求/消息做处理

能力目标

希望业务组件中只做业务开发,不关心业务开发所需要的资源初始化等问题,平台除了提供动态加载外,还需要为业务组件提供存储,配置,调用外部接口以及预热等能力:


业务组件可使用的能力

对于配置加载,mybatis/hbase等存储的使用以及rest接口的调用,有两种处理方式,一是让业务组件工程自己管理资源的初始化,配置的加载等,但业务组件工程都是轻量级的jar包,业务组件工程的关注点在业务组件的逻辑上,对于业务组件工程来说,处理过多的初始化相关的开发不仅太重,而且有大量的重复建设;第二种方式是平台提供配置初始化和资源初始化的能力,业务组件工程直接使用,这种方式相对要好很多,因此平台有如下非能力型目标:

问题抽象

先对前文提到的能力地图做抽象,可对需要的能力分为以下几类:


能力分类

对于这些能力的支持,在加载资源包的时候,需要遵循以下流程:


资源包加载流程

核心概念

经过对问题的抽象,系统主要围绕以下核心概念开展:

核心概念

将核心概念抽象成实体并做一定的扩充:

实体之间的关系

事件处理

以事件的方式对请求做抽象,事件可分为同步事件和异步事件,一个事件有一个事件标识;
事件通道是在事件的基础上加上了事件类型的概念,事件类型分为http, rpc, mq等,事件类型+事件码唯一表示一个事件通道;
EventDispatcher用于做事件分发,将事件提交给不同的业务组件:

事件处理

整体架构

通过对领域模型的划分,可得将初始化流程做如下抽象:

架构

在此流程模式中,不同的初始化逻辑可通过不同的PostProcessor来实现,不同拦截链的作用如下:

上一篇下一篇

猜你喜欢

热点阅读