微服务架构设计模式(5种主流模式详解)

微服务架构设计模式(5种主流模式详解)-mikechen

微服务架构

之前谈过微服务是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间采用轻量级的通信机制互相沟通,每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境。

微服务架构设计模式(5种主流模式详解)-mikechen

 

什么时候需要微服务架构

从生产力和系统的复杂性这两个方面来看,公司一开始的时候,业务复杂性不高,这时候是验证商业模式的时候,业务简单,用单体服务反而生产力很高。

这个时候系统业务量较小,可以直接Java应用程序打包为War包部署在一台服务器上,整体架构如下图所示:
微服务架构设计模式(5种主流模式详解)-mikechen
这种将所有功能,都部署在一个web容器中运行的系统,就叫做单体架构,也叫巨石型应用。

单体应用的优点在于:单一架构模式在项目初期很小的时候开发方便,测试方便,部署方便,运行良好。

随着公司的发展,业务复杂性慢慢提高,以及访问量越来越大,会出现如下情况:

  • 编译时间过长;
  • 回归测试周期过长;
  • 开发效率降低,因为所有业务都混在一起;
  • 团队扩展了,需要分工明确了,按照业务来发展,大家都高效;

这时候就可以采用微服务来提升生产力了,至于这个转化的点,需要团队的架构师来进行各方面衡量,就个人经验而言,团队发展到百人以上,采用微服务就很有必要了。

有些架构师是具有微服务架构能力,所以设计系统时就直接设计成了微服务,而不是通过单服务慢慢演化发展成微服务。

下面我谈谈微服务架构演变过程中的5种设计模式。

 

聚合设计模式

为了尽量减少服务之间的通信,我们可以使用服务聚合模式。

基本上服务聚合设计模式,是接收来自客户端或 API 网关的请求,然后分配给内部多个后端微服务,再将结果合并,并在一个响应结构中发给请求发起人。

如下图左侧所示:

微服务架构设计模式(5种主流模式详解)-mikechen

代理设计模式

在微服务架构中代理服务是必然存在的,常用的代理服务是网关服务。

微服务的各个服务是没有状态的,需要通过统一的入口:代理服务,经过权限的校验、请求的过滤,比如:非法请求、SQL注入等。

最后再请求具体的服务,如下图左侧所示:

微服务架构设计模式(5种主流模式详解)-mikechen

异步消息传递设计模式

如果通信只是在少数几个微服务之间进行,那么同步通信就很好,但当涉及到多个微服务相互调用,并且要等待一些长时间的操作完成时,我们应该使用异步通信。

虽然REST设计模式非常流行,但它是同步的会造成阻塞,因此部分基于微服务的架构可能会选择使用消息队列代替REST请求/响应。

如下图所示:

微服务架构设计模式(5种主流模式详解)-mikechen
如果你有多个微服务需要彼此交互,而且,你希望这种交互没有任何依赖性或是松耦合的,那么我们就应该在微服务架构中使用基于异步消息的通信。

链式设计模式

单个服务或者微服务将会有多级依赖,举个例子:Sale 的微服务依赖 Product 微服务和 Order 微服务。

在这种情况下,服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。

所有服务都使用同步消息传递,在整个链式调用完成之前,客户端会一直阻塞,因此,服务调用链不宜过长,以免客户端长时间等待。

微服务架构设计模式(5种主流模式详解)-mikechen

数据共享设计模式

我们已经说过,在微服务里,为每个服务分配一套单独的数据库是理想方案。

采用共享数据库在微服务里属于反模式,但是,如果应用程序是一个单体应用而且试图拆分成微服务,那么反正规化就不那么容易了。

在后面的阶段里,我们可以转到每个服务一套数据库的模式,直到我们完全做到了这一点。

但在重构现有的单体应用时,SQL数据库反规范化可能会导致数据重复和不一致。

因此,在单体应用到微服务架构的过渡阶段,可以使用这种设计模式。

如下图所示:

微服务架构设计模式(5种主流模式详解)-mikechen

在这种情况下,部分微服务可能会共享缓存和数据库存储。

不过,这只有在两个服务之间存在强耦合关系时才可以,对于基于微服务的新建应用程序而言,这是一种反模式。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法