两年 PHP程序员 聊下架构

前言

2016年很有幸参与了公司内部系统架构3.0的升级,我们把公司的业务进行了四大板块的拆分,分别是应用服务内容服务电商服务支付服务。其他和业务无关的功能拆分到了基础服务,为全公司的业务提供基础服务能力,例如短信、app推送、微信模板消息、图片上传等服务能力。我们还建立我们自己的网关服务,对外提供了统一的服务访问地址。自此之后我对架构的发展和演变也产生了浓厚的兴趣和想法,但是目前接触的有限,与大公司的业务复杂度比还是有很大的差距,一年过去了但是还是想把自己经历的做个总结和自己的想法表达出来,同时也希望大牛们可以指导一番。

备注:“系统架构”是一个很大的范畴,我这里只是把我所经历的小型创业公司的一次架构升级做个分享。

实际架构

直接上最终的架构图,如下:

  • 网关: 企业服务总线,对外暴露统一的资源域,把实际业务中接口中都涉及签名鉴权等一系列鉴权逻辑抽到网关,其次为未来开放第三方服务准备。
  • 协议层: 组装各个服务的结果,把http协议的请求转换成rpc请求(这里我们使用的是phprpc)。
  • 业务服务: 实际的业务方,各种商业逻辑,如图所示。
  • 基础服务: 基础服务能力,和实际商业逻辑无关。

理论架构

上面的架构有什么问题,协议层产生了重度的耦合,协议层耦合各个业务方的逻辑。虽然系统拆分的原则是尽可能的不产生依赖,但是有些还是不可避免的。

三方面:

  • ①透传:明明协议层不需对逻辑做特殊的处理,协议层却要实现一遍代码,增加了工作量
  • ②组装:协议层调用各个服务的组装数据的时候,其实还是下意识涉及了部分业务逻辑
  • ③html5应用直接调用了协议层,没有正真的实现企业总线

其次我认为最恐怖的是负责协议层开发的同学被坑了,写透传的代码没技术含量而且是重复性的工作,涉及数据组装的,还得需要简单的了解各个服务逻辑。从而这个协议层就成了耦合的重灾区,所以我根据自己的想法改进了这个架构设计,架构图如下:

  • 改进一:html5应用也统一走网关,html5应用的请求执行对应的网关策略
  • 改进二:下移协议层到网关,网关直接进行协议转化
  • 改进三:业务服务直接调用所依赖的服务,这样我们的服务就可以业务直接通过网关暴露出去

更进一步的架构

然而上面的架构有什么问题?业务服务内部互相依赖,一旦未来服务拆分的粒度越来越细,以及业务的新增,这些依赖就成了一个网状结构,慢慢变的不可维护。接着我改进了这个架构图,再进一步,应该是这样的:

我把之前服务之间直接的互相依赖转变成了统一对中间件的依赖,这样未来再多的服务整个系统架构都是清晰的。

中间件具备的能力:

  • 同步调用:直接通过对中间件的调用完成对服务的直接调用
  • 异步调用:通过对中间件的调用完成对服务的异步调用

然而,这里有个最大的问题就是所有压力都集中到了中间件,保证中间件的高可用又成为了一个很大的问题。

结语

除了上述的实际架构是真实的生产环境架构,其他的为我个人目前的想法,目前个人未真实在生产环境实现。最后说说实际踩的坑:

  • 服务超时:网关设置了熔断时间,导致服务刚提交事务却被终端请求导致的数据一致性问题。再例如,刚发送短信成功,却被中断请求,客户端返回失败,实际却接收到短信。
  • 分布式事务:跨服务调用使得事务的提交不像以前那么简单
  • 如果开发人少,导致一个人维护多个项目
  • 增加了部署难度
  • 追踪问题难度加深(我们引入了requestId追踪整个链路的调用过程)

Easy PHP:一个极速轻量级的PHP全栈框架:http://easy-php.tigerb.cn

觉得本文对你有帮助?请分享给更多人。

原文发布于微信公众号 - 程序员宝库(chengxuyuanbaoku)

原文发表时间:2018-02-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小程序·云开发专栏

认识小程序云开发

原文链接:https://godbasin.github.io/2018/08/18/wxapp-cloud/

2.4K50
来自专栏服务端技术杂谈

牛B的网站怎么设计Feed流

大型互联网公司招聘的时候总是要求具备:高并发,高负载,大数据处理的能力。我们做了N多的系统项目,互联网产品,究竟哪些项目或者产品能够真正体现出高并发,高负载的处...

58760
来自专栏网站设计制作、数字营销

网站和网页的通俗解释 让普通人都能看得懂

网站和网页即有很大的相关性,却又不是同一个个概念。有时几个网页即可组成个网站,而有的网站非常复杂,可能包含成千上万个不同类型的网页。而在网站制作和网页制作的概念...

14260
来自专栏Youngxj

墨渊浮窗播放器EMLOG插件

20230
来自专栏风中追风

分布式基础_为什么要用分布式架构,又为什么要用微服务?

我用了dubbo后,我就可以这样调接口,巴拉巴拉,说到底还是争不过面试官问:那照你这么说,我不用分布式架构也可以完成啊,你只是说了用了分布式架构后业务处理的方法...

513120
来自专栏架构师之路

互联网架构为什么要做服务化?

近期参加一些业界的技术大会,“微服务架构”的话题非常之火,也在一些场合聊过服务化架构实践,最近几期文章期望用通俗易懂的语言聊聊了个人对服务化以及微服务架构的理解...

62560
来自专栏网站设计制作、数字营销

网站和网页的通俗解释 让普通人都能看得懂

网站和网页即有很大的相关性,却又不是同一个个概念。有时几个网页即可组成个网站,而有的网站非常复杂,可能包含成千上万个不同类型的网页。而在网站制作和网页制作的概念...

16600
来自专栏技术文章

大神告诉你如何理解微服务框架

因为Martin Fowler和Chris Richardson两位大神的布道,及NetFlix和Amazon公司的实践,国内对于微服务的一些基础问题理解基本...

21840
来自专栏Linux Python 加油站

Python自动化测试框架有哪些?

来源:马哥教育链接:https://mp.weixin.qq.com/s/PvlaRmPmGc5b1XIMqMMslA令开发者万分高兴的是,开发自己的测试框架的...

20740
来自专栏PHP在线

说说大型高并发高负载网站的系统架构

转自:Just Do IT (http://www.toplee.com) 我在Cernet做过拨号接入平台的搭建,而后在 Yahoo3721负载搜索引擎前端平...

38850

扫码关注云+社区

领取腾讯云代金券