三板斧 3
有的场景下,客户的定制化需求,需要改变产品基线的核心逻辑,而这些需求又无法抽象成可枚举的一些情况,因此Configuration模式无法适用这样的场景。那么如何在不改变产品基线代码的情况下,改变其核心逻辑呢?答案就在我们的第三块基石 – Plugin(可插拔)。
我们自研了我们的Plugin Framework,能够在无代码入侵的情况下,实现产品基线的扩展点(Extension Points),同时可以让不同的客户需求以Plugin的形式接入。Plugin Framework按客户实现、国家实现、产品默认实现了三层分层:
Plugin及Lookup机制
需要注意的是,Plugin容易被滥用;因此我们在架构上规定,尽可能用Configuration和Composition模式,仅在不得已的情况下使用Plugin模式,并且需求产品基线架构委员会进行需求和设计审核,才能在产品基线开出Extension Point扩展点。
综合上述的三板斧设计模式,我们实现了满足开闭原则的可扩展产品基线:
综合使用三种模式的可拓展产品基线
3 从项目化向SaaS化(产品化),我们如何推进架构设计最终落地?
架构设计很丰满,现实和技术很骨感,我们知道目标在哪里是不够的,我们需要知道通向目标的正确路径。那么在2年前我们还是以大项目交付为核心模式的时候,我们是如何推进上述架构设计最终落地的呢,怎样的路径才是通往目的地的最优路径呢?下图是我们最终选择的方式,它支持了我们今天的成功转型。
我们上面讨论过三板斧的3种模式:Configuration,Composition,Plugin;Plugin模式作为一种尽可能不要用的模式,却是一种兜底的模式;没有Plugin,就支持不了我们产品化的最后一公里,因此它的重要性不言而喻。那么如何无侵入地做到呢?我们自研了众安国际的Plugin Framework(我们计划把该框架开源):
① 引入plugin框架
②定义扩展点-
只需要让你的扩展点接口继承ExtensionPoint 即可
③使用扩展点-
简单的面向接口编程和Spring DI(Autowired)
④项目交付实现扩展点-
还是简单 Annotation,除了业务,你什么都不用关心!
图注:实现扩展点,从而改变基线default的功能
⑤ 可协同,易管理
图注:基线和项目协同的开发、打包、部署
好了,看到这里,我们如何用一套代码,支持所有客户的需求,真正做到产品化和核心精髓相信你已经理解。那么我们就是一家SaaS公司了?等等,还没有!
4 多租户设计与框架
SaaS产品不仅要求一套代码,还要求一套部署支持多客户。这里有另一个极其重要的点,那就是多租户:
支持多租户,有其最核心的三要素:
多租户三要素1-Security 之 Authentication
多租户三要素2-Context
多租户三要素3.1
数据隔离在Data Model层面进行了第一层隔离,采用tenant_id进行租户的逻辑隔离。
多租户三要素3.2
虽然tenant_id已经做了租户逻辑隔离,但数据库模式还是采用了Per-Tenant的租户隔离模式,以保证更安全的数据隔离,这是第二层的数据隔离。
多租户三要素3.3
数据的二层路由 2-Layer Sharding。
多租户三要素3.4
下图是其它需要多租户改造的数据存储,也要对他们进行多租户改造,才能在多租户架构下实现隔离和安全。
如果大家对我们的多租户框架感兴趣的话,有一个好消息是,我们计划把它们开源,敬请期待!
除了多租户外,高可定制的SaaS订阅模式,也是SaaS产品非常重要的一环:
架构设计一个To B企业级SaaS产品,上面的任何一环都不可或缺,但这就是全部吗?敬请期待我们的《保险产品SaaS化实践之路(下)》!