近期参与SAAS项目第一代应用设计,为满足整体灵活性,复用性和可定制化,得出如下应用层模型,希望能给大家相互参考学习,设计上有什么缺漏请多指教
核心思想
- 模块为最小化购买单位 例如商城模块 分销模块等
- 多个模块组合成为一个版本 例如基础版本 旗舰版等
- 每个模块都关联了对应的接口/页面路由 将对应的关系上报给配置中心
- 根据租户购买情况 得出用户有哪些模块的权限 进而每个用户显示不同的功能及权限 由租户网关统一校验
- 以此达成多租户共享同一套应用程序但各自使用不同的模块
应用层架构图
模块
- 模块是SAAS购买/赠送的最小单位 例如商城模块,活动模块等 每个模块都有对应的定价
- 一个模块可以配置这个模块包含了哪些页面和接口
- 每个模块启动时自动向配置中心提交自己归属的页面和接口 用于网关校验
- 模块是被定制化的最小单位,可标记这个模块在某个租户上是否被定制化,若是已定制化的标记,则路由到定制化后的服务上去,具体的接口和页面的配置也已定制化后的为准
版本
- 多个模块组合打包即成为一个版本
- 用户可以版本为单位进行购买 批量获得各个模块的权限
前台与后台
- 以微商城SAAS举例 给到消费者用的页面等为前台
- 商户管理店铺的端口为后台
配置中心
- 每个模块将其对应包含的接口和页面启动时上报到配置中心
统一租户网关
- 实现SSO登录及其校验
- 租户及租户的客户每次访问页面或调用接口时 读取配置中心配置 校验其是否有这个页面/接口的权限 决定是否放行
- 对租户的租约到期时间进行校验 若已到期或快要到期的 则跳转引导续费
- 判断该租户的模块是否被定制化 若已定制化 则转发到对应的定制化模块上
- 提供接口给租户查询自己拥有多少个模块及其页面和接口
功能页面
- 具体功能对应的页面则为功能页面 例如商城页面等
- 每个页面可能包含多个模块的功能 页面前端组件根据该租户已购的模块动态显示/隐藏对应的组件 实现租户页面动态显示
非功能页面
- 续费 充值 支付等页面为非功能页面
- 这类页面不用经过网关校验 属于路由白名单
通用模块
- 即无需购买都有的模块 例如账号密码管理 子账号管理等
- 对应的接口和页面都为非功能页面/接口
租户购买/续费
- 即记录该租户和具体的哪些模块的关联关系及其租约到期时间
- 视为该租户已经购入了这个模块
小节
整体租户使用时调用路径如下:
访问页面:
- 根据路由规则或读取得出该页面关联有多少哪些个模块
- 网关校验该租户是否有这个页面的权限 即该用户有无购入该页面关联的模块 有则放行
- 当前是否处在即将到期或已到期状态下 不是则放行
- 根据该租户购有的模块 动态显示页面上的组件 即页面上本可有但用户没有购买的组件则隐藏不显示
调用接口:
- 根据路由规则得出该接口关联在哪个模块
- 网关校验该租户是否有这个接口的权限 即该用户有无购入这个接口对应的模块 有则放行
- 当前是否处在即将到期或已到期状态下 不是则放行
以此应用架构下,新增功能时可以水平扩充多个模块并保持灵活的权限控制,并且支持小部分客户的定制化,做到定制化且不影响原有的非定制化的功能,缺点是租约网关负荷相对较大,需要使用缓存等减轻租约网关压力。