`

架构演进-实例篇

 
阅读更多

1引言

在标题的取名上,不敢说颇费心机,也算得上花费了一点功夫的。首先想到的是“架构设计过程”,又觉得是不是太大了,因为例子比较局部,不是很完整。叫做“结构变化过程”可能更好点。但是又怕名字取的小气了,进来的人少,参与讨论的就更少了,最终还是取了这个有点忽悠人的标题“架构演进”。

今天的这个架构演进,使用系统中一个局部的实例进行推导和演进,一起来观察一下,架构是如何不满足需求的?架构如何演进?更好的架构应该具备哪些条件?有没有更好的呢?

业务场景

图1 业务场景图

从上图可以看出,就是一个电子商务网站常见的支付、支付的后续处理,这样一个业务场景。支持多种支付方式,目前包括银联、支付宝,还有平台账户。平台账户就是注册用户将资金存储在平台为用户建立并维护的一个账户里,购买平台的产品,可以使用平台账户中的资金进行支付。

2业务流程

  1. 首先用户选择商品。
  2. 下单,进行支付。
  3. 选择支付方式。
  4. 使用相应支付方式进行支付。第三方支付,会跳转到第三方的支付页面进行支付。
  5. 平台进行支付的后续处理,包括成功之后的修改状态等,还包括失败之后的记录标记等。

第三方的支付,在打开第三方支付界面的时候,会告诉它一个平台的回调地址,支付之后,通过回调地址接收第三方支付的结果,然后进行后续处理。使用平台账户支付,就直接进行后续处理就可以了。

当然,这其中还会有一些细节,不在我们的讨论范围。例如:使用平台账户进行支付,判断账户金额是否充足。使用第三方支付,是否记录第三方支付的完整过程,以及完整的支付流程。等等具体的业务细节均不在今天的讨论范围。

3初级架构-用存储过程搞定它

回调地址接收两个参数,一个是订单编号,一个是标志。标志说明是成功还是失败,或者是更加详细的信息。


配合一段C#代码,判断一下支付方式,然后给存储过程传递参数。这样写的话,上面的这个存储过程很容易就超过1k行了,相信大家也写过1k行以上的存储过程,也维护过这样的存储过程,知道个中的酸甜苦辣。

如果说那一天我们增加了一种支付方式,需要修改的地方包括哪些呢?

界面要修改,存储过程要打开修改,调用的C#代码要修改。真是有点麻烦,最主要的是容易改错了,误改了不应该动的地方才是最要命的。好吧,我们简单分离一下。每种支付方式一个存储过程,把对于支付方式的判断放在代码中,每种支付对应一个代码中的方法。这样需要增加一种的话,只要改改支付方式判断的代码,然后重新写一个存储过程,重新写一个方法调用一下新的存储过程就可以了。可是还有一个问题,更新订单状态好像大家都在做,如果哪一些还需要加一些大家都需要做的事情呢?或者说修改一些大家都需要做的事情的细节?又或者说某两个支付方式需要增加一个处理流程呢?打开存储过程,狂修改吧!!!!

存储过程有几个不便利的地方:

  • 调试不方便
  • 测试不方便
  • 代码不能折叠,多了之后要拖动滚动条才能找得到
  • 逻辑运算、大规模计算是存储过程的弱项

存储过程的优势至少也有一个,就是修改之后,马上可以见到效果。不用编译。

4中级架构-在代码中分离对每种信息的更新

之前的架构代码中有很多的重复地方,例如:对于订单信息的更新。如何把重复降低呢?降低重复也就集中了代码,集中了将来也好维护。而且把它分离出来,独立出来,好像更好点,在需要的地方调用就可以了。如果需要变更订单的更新细节,只要修改一下更新细节就可以了,不需要动支付的代码。减小犯错误的概率。

首先,将各种更新信息独立出来。

 

使用下面的方法进行支付的后续处理。


 

增加支付方式的话,新建一个HandleService类,写一些处理代码,然后在public void HandlePaymentResult(PaymentManner2 paymentManner, string orderSeqNo)方法的switch中增加一个case就可以了。

但是页面的可选支付方式还是写死了,没有动态的变化,支付方式是否可以动态配置呢?而且可以方便的测试呢?例如:虽然我还没有银联的接口,但是我想测试一些,银联支付之后平台的处理是否正确,该更新的信息是否都更新了呢?没有银联的接口,是不是就不能做了呢?有没有办法解决呢?

答案是:有。

还有就是上面的switch。。。case,好像会很长,也很丑,这个地方能否改进呢?很多人在学习了重构之后,会提出很多的方法来解决这个问题,我们再后面也一块来解决一下。

5高级架构-少用存储过程处理业务的灵活架构

我们的高级架构有几个目标

  • 减少存储过程中的业务逻辑,让存储过程更加纯粹的做事,做它擅长的事情。
  • 可以灵活的增加或者减少支付方式。达到在增加或者减少支付方式的时候,尽量少的修改代码,尽量减少依赖。减少支付对于支付方式的依赖,支付方式对于后续处理的依赖。
  • 代码结构更加清晰。

为了达到上面的几个目标,计划独立几个部分。

  • 支付方式的管理。
  • 每一种支付方式的处理过程。这个在中级架构里面已经做的差不多了,这里会做的更好一点,抽象这个支付处理过程。

还有就是要隐藏支付方式和具体的支付方式处理过程映射代码。具体的支付方式指的是:银联或者是支付宝这种具体的一种支付方式。目的就是让对于支付订单的处理独立化,固定化,支持变化。

5.1支付方式的管理

    
通过FindAvailableManner方法获取支付方式。每种支付方式PaymentManner,都带有一个参数实体PaymentMannerParams,里面的UriOrFunction来决定是通过网页还是内部方法来支付,Uri就跳转到Uri就可以了,Function就调用FunctionName中的方法就可以了。支付的时候用下面的Pay先获取支付方式信息,然后根据每种支付方式的参数来决定具体的支付。

之前说的,如果银联还没有接口,或者接口暂时不能用了,想测试一下后续的处理,就可以将银联这种Manner的UriOrFunction设置为Function,现用内部的方法来测试后续的处理是否正确。等可以用的时候,在变更为Uri就可以了。

5.2支付过程的抽象

通过建立支付处理的接口,将支付处理的代码抽象成下面的样子。


这个处理的代码,原则来说以后都不需要修改了。后面要做的就是定义一种新的支付方式枚举量,然后实现IPaymentResultHandleService1 接口,写一些处理的代码就可以了。

5.3完整代码


6总结

类的依赖最好使用抽象,避免具体类的直接引用。

尽量不要再存储过程中处理业务,随着系统越做越大,你会越来越赞同我的说法。原因至少两点:1维护累死人,2数据库不擅长数值计算和处理。

职责单一,功能独立,代码分离。

Technorati 标签: 架构演进
分享到:
评论

相关推荐

    艾编程:中小企业到亿级流量从组织架构到系统15次架构演进

    15次架构演进实战手册,让你清晰明白了解大型互联网平台是如何进行架构演进过程的!本期内容主要是以电商为实例来做的体系!

    TiDB-Binlog架构演进与实现原理

    TiDB-Binlog组件用于收集TiDB的binlog,并提供实时备份和同步功能。...TiDB-Binlog这个组件已经发布了2年多时间,经历过几次架构演进,去年十月到现在大规模使用的是Kafka版本,架构图如下:TiDB-B

    ArchSummit北京 2016年全球架构师峰会PPT合集(84份).zip

    10年演变:高交易量下的订单系统架构演进及实践 电商平台融合之路 核心中间件是如何支撑业务快速发展 如何实现高并发高可用的选购系统---选购系统架构设计实践 大规模下的存储解决方案和迁移实例分析 高可用架构演进...

    Serverless 架构如何演进详细介绍

    Serverless 架构演进 Serverless架构风格挑战了软件设计和软件部署基础的现状,以实现最佳开发、最优运营和最优的管理开销。虽然它继承了微服务架构MSA的基本概念,但它已被赋予了新的架构模式,尽可能实现最高效的...

    大数据架构规划.pptx

    产品页面开发 平台能力构建 数据开发、可视化产品开发 诸葛 决策支持 鹰眼 …… 组件实例化 页面组装 权限管理 组件开发 控件开发 指标管理服务 指标库模型 指标审核 元数据管理平台 大数据架构规划全文共20页,当前...

    Java思维导图xmind文件+导出图片

    大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么是分布式架构下的高可用设计 构架高性能的分布式架构 ...

    CNUTCon北京 2016年全球运维技术大会PPT合集(24份).zip

    云化微服务架构演进历程 一个云计算人对容器技术现在以及未来的冷思考 万级规模容器平台架构和实战 容器化:构建拥抱改变的金融技术系统 容器管理系统的实践之路——专注持续集成和持续部署 让每天的1亿2千万小时更...

    Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级

    2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。 2020 年,推出 Sentinel Go ...

    数据库架构一致性最佳实践

    不一致的优化历程,也是我们数据库架构演进的一个过程。从单库到现在,有哪些坑在等着我们呢?先看一下,最初的数据库架构,最早是这个样子的。那个时候没有什么微服务分层,web通过DAO访问一个单库数据库,最早我...

    华泰证券混合云服务体系研究与实践.pdf

    多云布局和挑战 ...服务能力描述参考模型 场景分类 服务场景实例化示意 场景化交付实践 实践心得 能力建设 迭代推进 应用生命周期管理平台建设 小组建设 分工与协作 以服务为中心高效运维体系 风险控制

    QCon广州 2019年全球软件开发大会PPT合集(30份).zip

    信息流广告的排序算法演进 小游戏质量保证测试实践之路 物流仓储数据分发平台架构实践及挑战 万亿规模下高吞吐低时延查询系统架构设计 数字化转型提升企业核心竞争力-“云”会吞噬一切 日均百万订单下的高可用拼购...

    论文研究-一种新型的可重构路由交换通用平台.pdf

    分析了当前网络节点设备平台化、开放架构以及构件技术的研究现状。...通过两个实例表明,该平台能够为今后电信网、广电网、互联网及其演进的各种先进网络架构提供支持,为构建柔性网络基础设施提供平台支撑。

    大数据离线计算的架构与组件.pdf

    ⼤数据离线计算的架构与组件 ⼤数据离线计算的架构与组件 ⼤数据离线计算的架构与组件 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 ⼀.什么是⼤数据离线计算 1>.⼤数据离线计算概述 (1)所谓⼤...

    微服务设计与解决方案.docx

    目录: 一、微服务架构演进过程 二、微服务架构的好处 三、微服务应用4个设计原则 四、微服务架构带来的问题 五、微服务平台的19个落地实践 六、总结展望 微服务设计与解决方案全文共18页,当前为第1页。...

    gogen-avro:生成Go代码以序列化和反序列化Avro模式

    戈根阿夫罗 根据您的Avro架构生成类型安全的Go代码,包括支持Avro架构演进规则的序列化器和反序列化器。 还支持反序列化通用Avro数据(测试版)。目录使用gogen-avro的公司/项目报告问题备择方案 安装gogen-avro有两...

    精通LINUX设备驱动程序开发

    1.1 演进 1 1.2 gnu copyleft 2 1.3 kernel.org 2 1.4 邮件列表和论坛 3 1.5 linux发行版 3 1.6 查看源代码 4 1.7 编译内核 7 1.8 可加载的模块 8 1.9 整装待发 9 第2章 内核 11 2.1 启动过程 ...

    NFV业务链资源分配技术

    SDN/NFV为运营商实现网络重构和架构演进提供了支撑技术,业务链及其组网技术是NFV的一个重要应用场景,相关的业务链资源分配问题是业界的研究热点。首先对业务链现状进行了梳理,重点分析了已有的资源分配机制和存在...

Global site tag (gtag.js) - Google Analytics