会员服务 登录 注册
×
资讯活动

五分钟了解微服务架构通信模式

发布时间:2024-09-24 来源:金属加工

通信是微服务架构中的关键要素,人们广泛讨论的焦点是如何选择最有效的方法进行服务间交互。在这篇文章中,将探讨和总结微服务的最佳通信策略,深入探讨如何有效利用每种通信方式。

交互方式

要有效理解微服务架构中的服务通信方式,首先必须熟悉可用的交互方式。每种风格都有其独特的优缺点,在为服务确定最合适的通信机制的明智决定之前,全面了解这些细微差别至关重要。这些基础知识可确保所选方法完全符合系统的具体要求和挑战。

交互方式可以分为两个维度,第一个维度是一对一还是一对多的交互:

  • 一对一(One-to-one) - 每个客户请求由一个服务处理。
  • 一对多(One-to-many) - 每个请求由多个服务处理。

第二个维度是同步还是异步交互。

  • 同步(Synchronous) - 客户端希望服务及时做出响应,甚至可能在等待时阻塞。
  • 异步(Asynchronous) - 客户端不会阻塞,即使有响应,也不一定立即发送。

下表显示了不同维度的组合:

通信维度

下面分别简要介绍一下。

一对一交互:

  • 请求/响应 - 客户端向服务端提出请求并等待响应。客户端希望响应能及时到达,甚至可能在等待时阻塞。这种交互方式通常会导致服务紧耦合。
  • 异步请求/响应 - 客户端向服务端发送请求,服务端以异步方式回复。客户端在等待时不会阻塞,而服务端可能很长时间都不会发送响应。
  • 单向通知 - 客户端向服务端发送请求,但不期望立即获得回复。

一对多交互:

  • 发布/订阅 - 客户端发布一条通知消息,由零个或多个感兴趣的服务消费。
  • 发布/同步响应 - 客户端发布请求信息,然后等待相关服务的响应。

记住,一种服务可以有多种通信方式!

使用同步远程过程(Remote Procedure Invocation)调用模式进行通信

客户端向服务端发送请求,服务处理请求并发回响应。有些客户端可能会阻塞等待响应,有些客户端则可能采用反应式非阻塞架构。但与使用消息传递不同的是,客户端假定响应会及时到达。

下图显示了 RPI 的工作原理。客户端中的业务逻辑会调用 PRI 代理适配器类实现的代理接口,RPI 代理向服务发出请求。

请求由 RPI 服务端适配器类处理,该类通过接口调用服务的业务逻辑,然后将回复发送给 RPI 代理,后者将结果返回给客户端的业务逻辑。

代理接口通常封装了底层通信协议。我们将重点介绍最流行的 REST 和 gRPC 协议。

REST API

REST 的关键概念是资源,通常代表单个业务对象(如客户或产品)或业务对象集合。REST 通过 HTTP 动词来操作资源,资源使用 URL 引用。例如,GET 请求返回资源的表示形式,通常是 XML 文档或 JSON 对象,也可以使用二进制等其他格式。POST 请求创建新资源,PUT 请求更新资源。

1.REST API 的挑战:

(1) 在一次请求中获取多个资源:

REST 资源通常以客户和订单等业务对象为重点,这给在一次请求中获取多个相关对象带来了挑战。例如,获取订单及其关联的客户通常需要多次 API 调用。常见的解决方法是增强应用程序接口,使客户端可以在一次调用中获取相关资源,例如使用带有扩展查询参数的 GET 请求来指定相关资源。虽然这种方法在很多情况下都很有效,但实施起来可能会很复杂、很耗时,这也是 GraphQL 等用于更简化数据检索的替代技术兴起的原因之一。

(2) 将操作映射到 HTTP 动词

一个值得注意的 REST API 设计挑战是如何将业务对象上的特定操作分配给正确的 HTTP 动词。例如,更新订单可能涉及取消或修改订单等各种操作,而且并非所有更新都必须是幂等的,而这正是使用 HTTP PUT 方法所必需的。一种常见的方法是为不同的更新操作创建子资源,例如使用 POST 取消订单(POST /orders/{orderId}/cancel )或修改订单(POST /orders/{orderId}/revise )。另一种方法是将操作作为 URL 查询参数。不过,这些方法可能并不完全符合 REST 原则。将操作映射到 HTTP 动词上的这种困难,促成了 gRPC 等替代技术的流行。

REST 的优点和缺点

使用 REST 有很多好处:

  • 使用简单,大部分工程师都比较熟悉。
  • 可以在浏览器中使用 Postman 插件等工具测试 HTTP API,也可以在命令行中使用 curl 进行测试(假设使用的是 JSON 或其他文本格式)。
  • 直接支持请求/响应式通信。
  • HTTP 对防火墙是友好的。
  • 不需要中间代理,从而简化了系统架构。

使用 REST 有一些缺点:

  • 只支持请求/响应式通信。
  • 可用性低。由于客户端和服务端直接通信,没有中间组件缓冲信息,因此在交互过程中,客户端和服务端必须同时运行。
  • 客户端必须知道服务端实例的位置(URL)。在现代应用中,这是一个非同小可的问题。客户端必须使用所谓的服务发现机制来定位服务实例。
  • 在一次请求中获取多个资源具有挑战性。
  • 有时很难将多个更新操作映射到 HTTP 动词。

3.使用 gRPC

gRPC 提供了另一种选择,它使用基于二进制消息的协议,强调 API 优先的方法。gRPC 采用协议缓冲区(Protobuf),一种由谷歌开发的语言中立的序列化系统,允许开发人员在基于Protobuf的接口定义语言(IDL)中定义 API。gRPC API 在 HTTP/2 上运行,支持简单的请求/响应和流式 RPC,因此服务端可以向客户端发送消息流,反之亦然。该技术支持创建定义明确的服务接口和强类型方法,为处理微服务架构中各种复杂的通信模式提供了强大的框架。

gRPC 的优点和缺点

gRPC 有几个好处:

  • 设计一个拥有丰富更新操作的应用程序接口非常简单。
  • 具有高效、紧凑的 IPC 机制,尤其是在交换大型信息时。
  • 双向数据流可实现 RPI 和消息传递两种通信方式。
  • 可实现客户端与用多种语言编写的服务之间的互操作性。

gRPC 也有若干缺点:

  • 与基于 REST/JSON 的应用程序接口相比,JavaScript 客户端在使用基于 gRPC 的应用程序接口时需要花费更多的时间。
  • 老式防火墙可能不支持 HTTP/2。
  • gRPC 是 REST 的一个令人信服的替代方案,但与 REST 一样,它也是一种同步通信机制,因此也存在部分失效的问题。