我们需要什么样的微服务

微服务到底应该是多大,一种简单的划分方法是项目代码在100-300行。这个划分方式肯定是不合理的,但也表现了微服务的一个核心思想——服务尽量的小。

1. 微服务架构的特点

  • 领域驱动设计
  • 单一职责原则:每个服务只负责自己单独的部分,这也是SOLID原则之一;
  • 明确发布接口:每个服务都会发布一个定义明确的接口,消费者只需要关心接口即可;
  • 独立部署、升级、扩展和替换:每个服务都可以单独部署及重新部署而不影响整个系统。这使得服务很容易升级;
  • 服务相互解耦;
  • 轻量级通信:服务通信使用轻量级的通信协议,例如,同步的REST,异步的AMQP、STOMP、MQTT等。

这些使得微服务具有以下优点:

  • 开发易于开发、理解和维护
  • 比单体应用启动快,
  • 局部修改很容易部署,
  • 故障隔离,一个服务出现问题不会影响整个应用,
  • 不会受限于任何技术栈

这些让微服务看起来像是银弹一样,但是微服务更多的是将开发的工作量推到了运维侧,采用微服务架构使得运维工作量巨大。

另外微服务使得接口升级的工作量也非常大,因为一旦接口的定义发生修改,则会影响到所以使用此接口的其他系统,所以升级中需要考虑到升级的各种影响,反而使得上线的成本进一步加大。

2. 微服务的设计模式1

2.1 聚合器微服务设计模式

聚合器调用多个服务实现应用程序所需的功能。它可以是一个简单的Web页面,将检索到的数据进行处理展示。它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。另外,每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展。

2.2 代理微服务设计模式

在这种情况下,客户端并不聚合数据,但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求,也可以进行数据转换工作。

2.3 链式微服务设计模式

在这种情况下,服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。所有服务都使用同步消息传递。在整个链式调用完成之前,客户端会一直阻塞。因此,服务调用链不宜过长,以免客户端长时间等待。

2.4 分支微服务设计模式

这种模式是聚合器模式的扩展,允许同时调用两个微服务链。

2.5 数据共享微服务设计模式

自治是微服务的设计原则之一,就是说微服务是全栈式服务。但在重构现有的“单体应用(monolithic application)”时,SQL数据库反规范化可能会导致数据重复和不一致。在这种情况下,部分微服务可能会共享缓存和数据库存储。不过,这只有在两个服务之间存在强耦合关系时才可以。对于基于微服务的新建应用程序而言,这是一种反模式。

2.6 异步消息传递微服务设计模式


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

3. 我们需要何种大小的服务

微服务的小该小到何种地步,按照代码行数来划分,在300行一下。这种划分方式有一定道理,但这种方式显然是不合理的,因为不同的语言在写起功能来所需的行数是不一样的。
划分微服务最好的方式是按照系统的边界(领域)来划分。比如a服务只负责创建订单,b服务只负责查询订单。系统的实现大小根据业务领域的需求而变化,如果业务领域慢慢变大,则可以将业务领域继续细分,如创建订单服务,又可以划分为创建酒店订单,创建电影订单,随着业务的需要而不断细分。

4. 服务分级

微服务虽小,也是有级别的。简单划分可以按照服务的依赖情况来划分:

  • 基础服务
    这种服务除了对数据库的依赖之外就不再依赖其他的微服务,只向外提供接口。
  • 集成服务
    集成服务是指主要依赖与其他服务(基础服务和集成服务)进行业务处理,更多的是作为流程管理的角色,一般不维护自身数据。例如用户提交订单,集成服务首先去调用验证服务,之后再调用创建订单服务。

    References

Goodbye Microservices, Hello Right-sized Services
微服务架构解析
微服务架构的设计模式
解析微服务架构(二)微服务架构综述
解析微服务架构(一)单块架构系统以及其面临的挑战
微服务实战(一):微服务架构的优势与不足
单体应用与微服务优缺点辨析
SOLID