「Java技术架构TB」这也太厉害了,微信支付软件架构( 二 )


上面的MV(X)模式忽略了一个非常重要的一点 , 那就是业务流程 , 界面的转场究竟由谁负责 。 也即ViewController与ViewController之间的关系由谁维护 , 业务流程的逻辑写在哪里 。
如果还按照传统的MVC模式 , 那么ViewController自己负责和不同的ViewController通讯 。 那么ViewController得不到复用 , 更致命的是业务流程的代码非常不清晰 , 业务流程的代码都被分散到各个Controller中 , 而一个Controller又可能耦合了多个业务的代码 。
举个例子:一个普通的转账流程 , 可能会涉及风控拦截 , 实名验证 , 收银台 , 绑卡 , 支付成功页等等 。 如果是基于MVC这种架构的话 , 很快代码会变得难以维护 。
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
因此 , 为了适应微信支付流程多 , 界面跳转复杂的特点 。 架构抽象的第一步就是将业务流程抽象为一个独立的角色UseCase 。 同时,把界面抽象为UIPage 。 一个大的业务流程可以分解为一个个小的业务流程 。
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
和刚才基于MVC混乱的架构相比:
业务流程的代码能够聚合到UseCase中 , 而不是分散到原来iOS,安卓的各个ViewController , Activity中 。
业务流程和界面得到了复用 。
契合微信支付多流程 , 界面跳转复杂的业务特点 。
2.加入路由机制
既然流程得到了抽象 , 这个时候需要针对业务流程做更深的思考 。 在开发支付业务流程时 , 开发者不可绕过的问题有:
1、流程之间 , 页面之间的流传 。
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
比如我们要给一个朋友转账 , 输入金额 , 确认支付,触发Cgi后 。 下一个流程是多变的 。 有可能用户需要去实名 , 有可能用户要进入一个安全拦截的WebView , 或者是正常拉起收银台 。
本文中的名词CGI可以理解为一个网络请求 , 类似HTTP请求 。
那么以往在iOS,安卓分开实现时 , 都没有一个统一的处理机制 。 要么就是通过网络回包的某个字段来判断 , 要么就是本地维护一些状态来决定下一步走什么流程等等 。 非常繁琐 , 易错 。
2、特殊流程的处理
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
支付业务流程还有个特殊的地方 , 那就是在正常流程的中间 , 往往很多时候要需要插入一些特殊流程 。 比如有些地方要跳转Webview,有些地方要跳转小程序 , 有些地方要弹窗告知用户风险 , 或者终止当前流程 , 等等 。 我们经常需要在业务代码里面不断重复增加这样的处理 。
这些问题 , 引导我想到 , 微信支付需要一个路由机制 。
首先了解一下路由机制 。
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
路由机制的核心思想 , 就是通过向路由传递数据 , 然后路由解析数据 , 并响应 。
结合微信支付和网络密切相关的特点 。 创新地将支付领域模型作为传递的数据 。
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
那么怎么建立这个支付领域模型的呢?
建模 , 就是建立映射 。 领域知识+建模方法=领域建模 。 那么这里的领域知识 , 就是对支付业务流程的理解 。 建模方法 , 我采用了UML建模 。 最终会落地为Proto协议供客户端和后台一起使用 。
「Java技术架构TB」这也太厉害了,微信支付软件架构
文章图片
首先 , 微信支付业务特点就是和网络密切相关 , 流程和页面往往是由Cgi串联起来 。 因此建立模型时 , 最外层便是网络回包 。 对于路由机制 , 这里我们只关心路由数据模型 。


推荐阅读