前言
在上一期《异构链江湖,谁能大一统?》一文中,我们提到对于BaaS平台而言,有两个显然易见的挑战,针对“如何纳管非BaaS平台创建的联盟链”这一挑战已在上期推文中着重剖析,而针对“BaaS究竟如何灵活支持当前市场上繁多的区块链底层”这一挑战,我们收到了大量用户留言提问。
为了系统性地讲清楚这一解决方案,我们将通过上、下两篇推文以趣链BaaS平台为例,为大家解密BaaS如何优雅、快速、高效地将不同技术实现、不同接入方式的区块链底层平台统一集成至平台内。
BaaS驱动有何妙用?
“驱动”的本意是设备驱动程序,它作为一段携带了硬件相关配置的程序,是操作系统和硬件之间通信的桥梁。
打个形象的比喻,如果我们把BaaS平台比作电脑,那驱动就像电脑上的USB转接口,可以灵活接入不同的设备如键盘、鼠标、显示屏。由于转接口已经适配了这些外部设备的不同型号,因此电脑本身就无需关注这些外部设备用的是type c 还是HDMI接口还是Lightning接口,都可以丝滑的接入。
我们如何设计驱动?
根据驱动的功能差异,BaaS内存在主机驱动、链驱动等多种不同类型的驱动。以主机驱动为例,在与不同云主机厂商对接的过程中,我们总结了一套通用的云主机实例操作模式(包括create、update、delete等),并在此基础上抽象了一套标准化API。
主机驱动通过实现这一套API,将不同云厂商的实例操作模式封装起来,并统一提供给上层服务以执行调用操作。
具体而言,假设主机驱动需要实现create和delete这两个标准化的API ,则对接并研发云厂商I的主机驱动I-driver时,需要实现以下核心操作:
create:创建云厂商I的实例,并将实例ID、实例状态等信息上报给上层服务;
Delete:删除云厂商I的某一个实例,并将删除结果上报给上层服务;
上层服务在创建云厂商I的实例时,只需调用主机驱动I-driver的 create 操作,等待它自行创建实例并将所有创建中的状态返回。更进一步地,I-driver的create操作也可自行绘制可视化前端页面,支持将所有的操作交互和接口请求封装在create页面中,并通过趣链BaaS封装的微前端接入功能展示给用户。
由此,我们的BaaS平台通过分离不同的底层业务、分离不同的前端交互,借助“驱动”这一中间介质,真正实现了“可插拔”。
BaaS平台引入驱动后的变化
在没有引入“驱动”概念之前,我们如何处理私有化场景中的异构链、异构主机接入呢?
一般来说,接入异构链和异构主机时,前端和后端都需要进行多重逻辑判断以适配新的云厂商或链底层的业务逻辑,导致大量的业务代码杂糅在一起,冗余严重。随着功能的延展,BaaS平台的代码结构越来越复杂,理解成本极高,最后变成一块无人愿碰的烫手山芋,那么宇宙的尽头就只能是重构…
*但引入驱动之后,系统又有什么变化呢?*让我们看看变化后的整体结构:
为了便于读者理解,我们首先对图中几个角色功能进行简要说明:
BaaS控制台:BaaS提供的一套可视化界面,提供主机、联盟链生命周期管理等功能;
核心驱动容器环境:BaaS的一个核心后端服务,负责管理驱动的全生命周期,持久化驱动创建的实例信息,并处理驱动间的业务逻辑;
create/update:驱动对实例的操作,是一套标准化的实现,包含后端API实现和前端交互页面。核心驱动容器环境定义了 API 标准,并通过调用API对所有驱动实行统一的操作管理;
节点主机:主机驱动在云主机上建立的实例;
因此,假设我们实现了云厂商I的驱动I-driver,则上述各个模块间的主要交互如下:
1)用户访问控制台,进入主机管理模块,点击创建云主机I的实例;
2)控制台向核心驱动容器环境请求I-driver的create 页面,并将页面以微前端方式嵌入;
3)页面交互完成后,create页面向核心驱动容器环境 发起 I-driver的create 请求;
4)核心驱动容器环境将请求透传给I-driver,I-driver即访问对应的云厂商进行实例创建;
5)实例创建完成后I-driver上报到核心驱动容器环境,进行持久化存储并将状态推送给控制台;
可以清晰的看出,在创建云主机I实例的过程中,创建页面和创建逻辑均由I-driver提供,控制台和核心驱动容器环境不需要关心与云主机I的具体对接方式,只需要做页面展示和接口透传。
核心驱动容器环境又有何用?
在前文中多次提到了核心驱动环境,那么它的作用仅仅是进行一个接口的透传吗?答案显然显然是否定的,核心驱动容器环境真正的关键能力是对驱动的全生命周期管理。
核心驱动容器环境会将驱动作为一个长稳服务起在服务器上,控制台或SDK对驱动的任何访问都需要通过核心驱动容器环境进行。
**一方面,统一的入口方便核心驱动容器环境对驱动进行统一的操作和管理。**所有的驱动都需要实现一套核心驱动容器环境制定的标准化API接口,在执行具体的实例操作(create/update/stop/delete等)时,核心驱动容器环境并不关心目标驱动的具体实现,只需要直接调用目标驱动的标准化接口即可(参考流程中的步骤2~4)。
**另一方面,如架构图所示,驱动会将实例的状态和信息全部上报到核心驱动容器环境,随即对实例信息进行持久化存储。**驱动还可以通过核心驱动容器环境暴露的SDK访问核心驱动容器环境中存储的其他实例数据,完成驱动间的逻辑交互。
总结
在区块链BaaS平台内,驱动扮演了中间人的角色,前承核心驱动容器环境,后接云厂商、链底层的真实运行环境。通过驱动,趣链的BaaS对于异构主机、异构链的接入就变得清晰而简单,我们将在下一期推文中通过详细的代码示例为大家解析一键部署多种区块链背后的更多密码。