微信支付软件架构重构之旅( 三 )

  • 在加入路由机制的时候,结合微信支付和网络密切相关的特点进行了支付领域建模 。支付后台协议重构 2.0 的核心思想也是围绕着这个路由机制展开 。

  • 微信支付软件架构重构之旅

    文章插图
     
    再来看一下,加入路由机制后,对生产力的提升 。以支付流程打开 WebView, 小程序为例,减少将近 83% 的代码 。更重要的是,这里的特殊流程,是在路由机制里面统一处理的,没有耦合到业务代码中,并且是可复用的 。
    3. 管理网络请求首先看看原来 iOS 处理支付网络请求的缺陷:
    微信支付软件架构重构之旅

    文章插图
     
    原来支付的请求,都是通过一个单例网络中心去发起请求,然后收到回包后,通过抛通知,或者调用闭包的方式回调给业务侧 。
    会存在这样的问题:
    1、CGI 一对多通讯问题 。
    举个之前遇到的问题 。
    微信支付软件架构重构之旅

    文章插图
     
    那么钱包发起的 Cgi 的回包就会覆盖收付款页面的数据 。之前在 iOS 只能通过修修补补,增加场景值,增加些标记位来解决 。可能某一天就会又出现新的坑 。
    1、进入钱包页面后,发起了一个 Cgi
    2、然后进入收付款页面也发起同一个 Cgi.
    3、如果收付款发起的回包先到
    4、然后钱包首页的回包再到 。
    5、CGI 生命周期问题 。
    微信支付软件架构重构之旅

    文章插图
     
    不时会有用户反馈一下,怎么没有做什么操作,突然就会弹出网络报错 。
    原因就是 Cgi 的生命周期有问题,在业务结束后,Cgi 的回包仍然得到了处理 。
    解决方案:
    1、将 Cgi 抽象为独立对象
    在架构设计上来说,旧架构是通过单例模式实现的集约型 API,而我们新的架构则是通过命令模式实现的离散型 API 。
    也就是将 Cgi 封装为独立对象 。我们把 Cgi 相关属性和能力内聚起来 。开发业务时,只需简单继承 BaseCgi,设置一下参数即可 。
    微信支付软件架构重构之旅

    文章插图
     
    2、划分职责,明确生命周期
    关于 Cgi 由谁发起,之前安卓和 iOS 都没有一个统一的做法 。有些人会放到 Activity,ViewController,和 UI 代码耦合起来 。
    因此,在跨平台软件架构中,我们统一由业务流程 UseCase 进行发起 。并且生命周期是一对一的,一个 Cgi 只会有一个 UseCase 处理,UseCase 销毁后,Cgi 也随之销毁 。
    微信支付软件架构重构之旅

    文章插图
     
    【微信支付软件架构重构之旅】对比旧架构:
    1. 杜绝了一对多通信造成的 Bug
    2. 生命周期和业务逻辑绑定,不会出现业务结束,Cgi 回来后再触发动作 。
    3. 高内聚,低耦合 。将 Cgi 相关的数据,能力集中处理,业务侧无需感知 。
    4. 提供统一的缓存,加密能力 。

    微信支付软件架构重构之旅

    文章插图
     
    第一步和第二步,我们抽象了业务流程,加入了路由机制 。
    微信支付软件架构重构之旅

    文章插图
     
    在第三步管理网络请求后 。我们的软件架构演进为这样子 。
    微信支付软件架构重构之旅

    文章插图
     
    4. 规范数据传递iOS 和安卓的旧架构都存在信息传递不当和数据污染问题 。这个问题最严重 。iOS 和 安卓都出过不少 bug 。
    首先我们来看看最近现网出现过的问题:
    之前 iOS 出现,不少内部同事,外部的用户都在反馈:进行零钱页后,会无故弹空白框 。而支付又和金钱有关,引起用户的恐慌 。
    微信支付软件架构重构之旅

    文章插图
     
    具体原因就是:
    1. 进入支付首页时,后台返回了数据,然后被写入到一个公共的 Model.
    2. 然后进入钱包页,再进入零钱页 。这个公共 model 一路被传递过去 。
    3. 然后零钱页读取了公共 Model 的数据,但是代码无法处理,导致出现了这个让用户恐慌的问题 。
    除此之外,之前还有有很多发生在安卓,iOS,像钱包页零钱展示错误 。付款的时候 。银行卡失效等等问题 。
    这些问题五花八门,看起来发生的地方,场景都不一样 。每次遇到这类问题的时候,就只能去修修补补 。


    推荐阅读