程序员 (ID:) 在推特上发布了 818 图片来自百度
过往回顾:淘宝现在有重大BUG:传闻3.25出现是程序员的复仇,被淘宝斥为谣言!淘宝是这样回应的!
身体
背景
微信支付作为一项重要的业务,在客户端上面临着各种问题。其中一个核心问题是不同平台的实现导致的问题:
为了解决子平台实现的核心问题,并解决之前的技术债务。我们构建了一个基于C++的跨平台框架,并重构了核心支付流程。
微信支付跨平台从 iOS 7.0.4 和 7.0.7 开始完全覆盖。
在线性能指标
以 iOS 发布为例:
那么,跨平台支付软件架构如何才能有效地保证质量并提高生产力呢?这是本文的主要内容。
对如何基于C++构建从零到一的跨平台框架感兴趣的学生可以在 %E5%9F%BA%E4%BA%8E%20C%2B%2B%20%E6%9E%84%E5%BB%BA%E5%BE%AE%E4%BF%A1%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%B7%A8%E5%E5%B3%E5%8F%B0%E5%BC%80%E5% 8F%91%E6%A1%86%E6%9E%B6.key 下载我在QCon 2019上的演讲题目为“基于C++构建微信客户端的跨平台开发框架”。
什么是软件架构
什么是软件架构?正如伊瓦尔(UML之父)所说,让五个人回答这个问题,他们五个人可能都有不同的答案。
架构定义可以通过多种方式表达,从代码规范到可以作为体系结构一部分的发布过程。
根据微信支付的业务特点,这里对架构的定义是:架构是系统的组成部分,是它们之间的相互关系(通信模式)。这更符合我们程序员在日常编写业务代码时对架构的理解。即通俗意义上的MVC、MVVM等。
为什么需要软件架构
?
早在 1986 年,《人月神话》的作者就讨论了软件的复杂性,他说软件的本质复杂性存在于复杂的业务需求中。
管理复杂性的最基本方法是职责分离。为了实现职责分离,代码被重用,架构被慢慢表示。架构的本质是管理复杂性。
没有架构,我们所有的代码都是耦合的,人类的心智模型不擅长处理这种复杂性,架构搭建起来,图书馆的图书分类、公司的组织等,本质上都是一样的。这是关于管理复杂性以实现更高的生产力。
构建跨平台软件架构,实现从零到一的支付
在移动客户端领域,业界基于C++编写业务代码,没有成熟的架构。即使使用 C++ 编写业务逻辑,也不涉及 UI,也不涉及接口的跳转过程。
既然行业内没有成熟的架构可以借鉴,那么干脆应用行业通用架构是不是更好?
1. 抽象业务流程
现在业内常见的有MVC、MVP、MVVM。这些都是熟悉的软件架构。但是这些软件架构存在一个问题:它们不能处理业务流程和接口转换。
微信支付有很多流程。该过程是接口 (,) 和相关业务逻辑的组合。
这
上面的MV(X)模式忽略了一个非常重要的点,那就是谁负责业务流程,接口转换。也就是说,谁与业务流程的关系以及业务流程的逻辑在哪里编写。如果您仍然遵循传统的 MVC 模式,那么您需要负责不同的通信。如果不能复用,更致命的是业务流程的代码非常不清晰,业务流程的代码分散到各个部分,一个代码可能与多个业务耦合。
例如,普通的转账流程可能涉及风控拦截、实名认证、收银、绑卡、支付成功页面等。如果你基于像 MVC 这样的架构,代码将很快变得难以维护。
因此,为了适应微信支付流程的特点,界面跳转很复杂。架构抽象的第一步是将业务流程抽象为一个单独的角色。同时,将接口抽象为 .大型业务流程可以分解为较小的业务流程。
相较于刚才基于MVC的混沌架构:
2. 添加路由机制
现在流程已经抽象出来了,现在是时候更深入地思考业务流程了。在开发支付业务流程时,开发者无法绕过以下问题:
这些问题让我觉得微信支付需要一种路由机制。
首先,我们来看看路由机制。
路由机制的核心思想是将数据传递给路由,然后路由解析数据并做出响应。
结合微信支付的特点,与网络息息相关。创新地使用支付域模型作为要交付的数据。
那么,如何构建这个支付领域模型呢?
建模就是创建映射。领域知识 + 建模方法 = 领域建模。那么这里的领域知识就是对支付业务流程的理解。建模方法,我使用了UML建模。最终,它将被实现为客户端和后端一起使用的协议。
首先,微信支付业务的特点与网络密切相关,流程和页面往往通过CGI连接。因此,在构建模型时,最外层是网络反向数据包。对于路由机制,这里我们只关心路由数据模型。
这
路由数据模型是路由类型和每种路由类型所需信息的组合。
路由类型明确定义了要触发的行为。无论你是想打开一个,还是打开一个界面,还是一个网页,一个小程序,一个弹出窗口等。
然后是这些行为所需的数据。例如,打开小程序所需的参数、弹窗所需的参数等。
一旦建立了支付域模型,我们的路由解决方案就变得非常清晰。解析路由后,会根据路由类型触发不同的操作。
例如,流程和接口的流程将移交给处理。
特殊流程,如打开小程序、打开弹窗等,将统一处理。
在第一步中,我们将业务流程抽象为 .第二步是添加路由机制。
随着路由机制的加入,支付的跨平台软件架构已经演变成这样。
添加路由机制后,与 iOS 相比, 原有的旧架构:
我们来看看添加路由机制后的生产力提升情况。以支付流程开放和小程序为例,代码减少近83%。更重要的是,这里的特殊流程在路由机制中是统一处理的,不与业务代码耦合,是可复用的。
3. 管理网络请求
让我们看一下处理支付网络请求的原始 iOS 缺陷:
最初,支付请求是通过单例网络中心发起的,然后在收到数据包后,通过抛出通知或调用关闭的方式将其召回业务端。
会有这样的问题:
溶液:
与旧架构相比:
在第一步和第二步中,我们抽象了业务流程并添加了路由机制。
在第三步管理网络请求后。以下是我们的软件架构是如何演变的。
4. 规范数据传输
iOS 和 的遗留架构都存在信息传递错误和数据污染的问题。这个问题是最严重的。iOS 和 都有各自的错误。
首先,我们来看看最近直播网络上出现的问题:
在 iOS 出现之前,许多内部同事和外部用户都在反馈:在制作更改页面后,会无缘无故弹出一个空白框。而且支付与金钱有关,引起了用户的恐慌。
原因如下:
除此之外,、iOS 上还发生了很多错误,例如钱包页面更改显示。付款时。无效的银行卡等
这些问题是多种多样的,它们似乎都发生在不同的地方和场景中。每次遇到这种问题,你都要修补它。
但深入挖掘,你会发现真正的原因在于软件架构的问题
旧的支付架构采用黑板模式,虽然读写数据方便。但问题和好处完全不成比例:
然后为跨平台软件架构付费,以结束此类问题。这是我的做法:
在规范上传递数据后。与旧架构相比:
在前三步中,我们抽象了业务流程,并添加了路由机制,以统一的方式管理网络请求。
然后,在标准化数据传输之后,我们的软件架构就是这样发展的。
总结
软件的内在复杂性存在于复杂的业务需求中。软件架构的本质是管理复杂性,所以一个真正好的架构是在复杂的业务需求中反复提炼和总结,以解决真正的业务问题,而不是空谈。
软件架构,除了清理旧架构的缺陷外,是我们业务发展的基石。它还可以为企业赋能,为企业带来价值。在建立软件架构的基础上,围绕软件架构建立微信支付跨平台自动数据上报机制,可带来防重复支付、安全横切等巨大业务效益。如果有机会,我会进一步撰写相关文章,稍后再与您讨论。
该架构是一个不断演进的过程,随着新的支付服务基于跨平台软件架构编写,我将继续更新和迭代该架构。让这个软件架构更适合微信支付,更加健壮和完整。
欢迎在评论区留下您的意见,共同讨论和改进。如果今天的文章给你新的启发,对学习能力的提升有了新的认识,欢迎转发,分享给更多的人。
猜你还想看
它
阿里巴巴、腾讯、百度、华为、 最新面试问题合集
Java 中的 SPI 机制到底是什么?必须掌握高级Java!
当 Java 对象不再使用时,为什么要将值赋值为 null?
答应我!别再写几千行的类了!这样的代码让我的生活比死亡更糟糕!