本文假定你已经阅读过之前的文章: 上一篇文章使用微服务架构重构支付网关是从横向的角度来分析如何分解服务以及建立微服务之间的关系。这篇文章从纵向详细介绍如何对SSH框架的支付系统实施具体的技改。这里不涉及具体代码写法,重点在于说明方法论。虽然以SSH(Apache Struts Springframework Hibernate) 框架为例,也适合各种常用的web架构 (Apache Struts/Spring MVC / Apache Velocity Springframework Mybatis/Hibernate) 。 选取入手模块如果遗留系统规模庞大,那应该如何挑选入手点?以支付系统为例,如前文所述,支付系统一般包括账户,交易,订单,优惠券,钱包,支付渠道,清结算,支付网关,运营系统等模块。模块很多,如何选择突破点? 我们采取的方法是寻找对外依赖最小的模块,由此开始调整。 首先模块依赖关系整理出来。从上图可以看出来,账户系统在依赖树中是处于树根的位置,对它的调整相对容易。只要保持对外接口不变即可。 重构策略重构如同飞行中更换引擎,必须非常小心,我们采取的策略是:小步快跑,积小胜为大胜。
API网关在SSH架构下,对API网关一般是通过NGINX的rewtite模块来实现,逻辑简单,人工维护即可。而一旦接口层按照业务来拆分后,网关路由逻辑复杂多了,通过人工维护配置文件难度激增,需要调整成自动注册更新路由的方式。也就是每个服务需要将自己提供的服务和API注册到API网关上, API网关需要自动识别并加载新的路由。 针对这个需求,我们开发了一个connector, 其工作原理如下:
在服务关闭时,执行类似的操作。第一步是在服务关闭前,将服务从zookeeper上删除。注意必须在服务关闭前删除,否则会发生服务不可用的错误。 服务注册项从zookeeper上删除,并且本地服务没有流量后,才能关闭服务。connector可以和nginx部署在同一台机器上。 服务接口调整使用Spring MVC实现的Controller或者使用Apache Struts实现的Action,需要按照业务进行组合,拆分到具体项目中,原则上,一个项目不应该有超过5个接口,避免接口过于复杂。本次调整需要做的工作包括:
业务逻辑层调整在springframework框架下,业务逻辑层被实现为服务层和DAO层之间的桥梁。 对于绝大多数应用来说,业务逻辑层都是非常薄的一层封装,调整为微服务架构下,业务逻辑层有三种处理方式:
DAO层的重构DAO层的重构的工作量比较大。 需要将原来访问数据库的逻辑,调整为远程RPC调用:
性能优化完成上述调整,这才是万里长征走完的第一步。接下来就是码农们最心爱的性能优化了。 对于大部分线上应用来说,性能优化主要的工作是选择合适的存储介质来满足性能的需求。
采用消息中间件目前主流的做法,适合于对数据实时性要求不高的场景。 如下图所示,在数据写入的服务中,完成写入后,抛出消息。其他数据库通过接受消息来更新数据。 优点是系统灵活,无论是同DC还是跨DC的情况都可以正常工作。 对数据同步的情况,可以通过MQ提供的监控系统也能够了解。 缺点是开发工作量大,数据同步实时性不高。 如果时间不够上述重构是非常理想的场景了,那如果时间不足,只能部分重构,应该如何处理?一种方式是针对DAO层来改进。 一般来说,重构往往意味着数据结构的变更。另一方面,由于数据写入的服务相对数据读取服务要少得多,所以可以采用的策略是:
毕竟大部分的服务并不需要太高的性能需求。 只需要将性能要求高的服务进行重构,实现读写分离即可。重构方式如上描述。 总之,技改的难度在于如何梳理出头绪来。 本文算是抛砖引玉,欢迎大家热烈讨论。 感谢您对本文的关注,如需要及时收到凤凰牌老熊的最新作品,或者有相关问题探讨,请扫码关注“凤凰牌老熊”的微信公众号,在公众号里留言或者回复,可以尽快处理,谢谢。 本文欢迎转载,转载时请注明本文来自 微信公众号“凤凰牌老熊”。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|