当前位置: 首页 > 科技观察

IntegrationChallengesofMicroservicesArchitecturewithgRPCandREST

时间:2023-03-23 11:28:35 科技观察

本文总结并提出解决目前微服务实现时存在的明显问题,主要包括服务之间的内部通信,一般采用RPC通信。外部第三方系统需要通过HttpRest来访问服务,而这些服务可能只提供RPC接口。简介微服务架构的采用率正在上升,并因其带来的灵活性(包括可维护性和可扩展性)而被广泛接受。通过容器化,微服务架构变得更加强大,允许用户创建专注于其功能而不是解决依赖关系的应用程序。云原生应用程序开发由使用容器的微服务架构提供支持。分布式系统设计是复杂的,并且随着业务需求的不同性质而变得更加复杂。为了实现端到端的业务能力,需要对多个微服务进行互联或调用。集成技术的选择变得至关重要,今天采用的通用方法是利用gRPC(Google远程过程调用)进行任何服务到服务的通信,并利用REST(表述性状态传输)API进行任何面向客户端的服务。gRPC–遵循RPCAPI实现,利用HTTP2.0协议和协议缓冲区进行消息交换。REST–该架构遵循HTTP协议,用于消息传递的数据格式为JSON或XML。设计和开发需要由其他服务在内部使用并向第三方系统或用户公开的功能的挑战让我们考虑一个由订单管理器和产品库存微服务组成的订单管理系统的示例场景。产品库存服务包含所有产品详细信息及其关系,包括各种类别。需要RESTAPI来公开产品详细信息及其与外部系统和用户界面的关系。OrderManager服务与另一个数字渠道连接,该渠道充当客户订购的前端系统。这会在内部调用产品库存服务来验证产品库存详细信息。在当前情况下,有多种方法可以满足此类要求,下面详细介绍了一些此类选项:选项1:遵循任何服务到服务通信都使用gRPC并且任何面向客户端的服务都使用REST的方法。通过gRPC公开产品库存服务以进行服务间通信我们使用Protobuf定义合约和java来生成服务器端实现。需要额外的编码,例如创建REST控制器和响应主体以公开与RESTAPI相同的内容以供第三方系统使用。这种方法需要额外的编码复杂性和依赖管理来处理gRPC和REST。选项2:遵循微服务聚合器模式并创建一个聚合器服务,该服务将通过聚合来自不同服务的响应或实现包装器RESTAPI服务来公开RESTAPI功能。这还将具有与其他内部服务通信以聚合响应所需的gRPC客户端实现。这将包含用于从ProtocolBuffers创建API响应的实体。gRPC和ProtocolBuffers迫使开发人员严格遵守契约,以确保消息安全且不会在通信之间丢失。虽然定义RPC的契约优先性质和相关服务之间共同开发的方法很好,但聚合器服务引入了额外的开销。总结架构师在设计分布式系统时花了不少心思。定义有效的集成模式对于解决方案的成功至关重要。以下是各种集成选项和挑战的总结:以REST(基于JSON)的形式在内部和外部公开数据:这种方法是最流行的,但遗憾的是它不能满足所有要求。由于JSON负载和HTTP协议的限制,这对于数据密集型服务间通信来说并不理想。在内部和外部公开gRPC:数据交换以二进制格式进行,不是人类可读的。gRPC依赖于HTTP2.0,它在现代浏览器中的支持有限。创建REST和gRPC:如前面选项中所述,额外的编码和集成开销。任何广泛采用的开源框架都缺乏跨技术(例如java、python、节点)的成熟gRPC实现。当我们考虑设计下一个基于微服务的解决方案时,考虑和设计这些不同的集成模式非常重要。