NestJS 中的 gRPC 微服务通信

本文详细介绍了在NestJS中如何利用gRPC进行微服务间的高效通信,探讨了gRPC的优势以及微服务架构中通信的挑战。通过实例展示了如何在NestJS项目中实现gRPC服务,并阐述了其在强类型协定、互操作性和易用性等方面带来的益处。

想象一下,你回家过节,你的家人决定聚会。而不是让一个人做所有的烹饪,每个人都同意带上他们擅长制作的特色菜。目标是通过组合所有这些菜肴来制作一顿完整的饭菜。你同意做鸡肉炒饭,你哥哥做甜点蛋糕,妹妹做沙拉。

每个菜代表一个具有特定功能或用途的微服务。例如,炒饭代表一道丰盛的主菜;沙拉代表新鲜健康的配菜,蛋糕代表甜蜜甜点。在微服务架构中,开发人员可以独立于其他微服务开发、部署和维护每个微服务,确保每个微服务保持独立和独立。

就像家庭聚会上的每道菜都代表具有不同功能或目的的微服务一样,软件系统中的每个微服务都必须与其他微服务进行有效的通信,以形成功能齐全的应用程序。类似于每道菜都需要与其他菜肴协调以创建美味佳肴一样,随着微服务数量的增加,微服务之间的通信变得越来越重要。我们可以确保微服务可以无缝运行,通过使用高效的通信框架(如 gRPC)来构建持久且可缩放的系统。

在这里插入图片描述

在本文中,我们将了解 gRPC(一种高性能的开源远程过程调用框架)如何允许 NestJS 应用程序中的微服务进行通信。我们将介绍使用 gRPC 的优势,如何在 NestJS 应用程序中执行此操作,并举例说明微服务如何使用它进行通信。

先决条件

让我们首先介绍一下我们需要的先决条件和工具:

  • Node.js 与 NPM – 运行和处理我们应用程序的依赖项。
  • NestJS CLI – 用于构建、管理和运行 NestJS 应用程序。
  • 协议缓冲区 – 在 gRPC 中定义消息和服务。
  • gRPC – 允许 NestJS 应用程序中的微服务相互通信。
  • grpcurl – 允许您测试简单的微服务通信。

微服务及其通信方式

微服务以多种方式相互通信。由于微服务架构中的每个微服务都执行特定的功能或任务,因此需要通信以确保完整的应用程序正常运行。由于每个微服务的独立性,微服务架构使开发人员能够创建更灵活、可扩展和容错的应用程序。此外,微服务的模块化设计使其成为复杂应用程序的理想选择,因为不同的系统组件可能有不同的需求和要求。

微服务通信的挑战

微服务通常通过定义明确的 API 和协议相互通信,使每个微服务都能可靠、高效地进行通信。但是,微服务间通信可能有点挑战性和棘手性。当许多微服务相互通信时,开发人员可能会遇到几个问题,包括:

  • 延迟:由于通信和数据传输效率低下而导致的网络拥塞。
  • 安全性:潜在的漏洞和威胁可能是由于访问控制管理不善或没有必要的安全协议造成的。
  • 服务发现:随着系统中服务数量的增加,管理和查找适当的服务变得困难。更糟糕的是,拥有硬编码的端点可能会导致系统变脆。
  • 容错:由于多个服务相互交互,任何服务故障都可能对整个系统产生涟漪效应。

总体而言,微服务之间的通信可能具有挑战性且复杂。开发人员可以通过在设计系统时考虑以下因素来创建高度可扩展、容错和弹性的微服务体系结构:

  • 沟通在心。
  • 高效的通信协议。
  • 适当的安全协议。
  • 用于动态定位服务并与之通信的服务发现机制。

微服务中的通信模式

在这里插入图片描述

微服务使用各种通信模式相互通信。我们将研究其中的一些:发布-订阅、请求-响应、事件驱动体系结构和消息队列。

  • 发布-订阅模式:涉及一对多通信,其中它将消息发布到多个订阅者。例如,一家公司向其各种时事通讯订阅者发送电子邮件。
  • 请求-响应模式:一个服务向另一个服务发送请求,接收方服务发回响应。例如,当 API 收到请求并发回请求的数据或错误消息作为响应时。
  • 消息队列模式:在此模式中,消息被发送到队列并存储,直到服务可用于处理它们。例如,送货公司可以使用此模式来接收和组织客户交货请求,并根据其位置分配可用的司机。
  • 事件驱动架构:在此模式中,服务在事件发生时交换消息。例如,当用户从其移动银行应用汇款时,帐户更新服务会收到扣除金额的通知。

gRPC 概述

gRPC 是由 Google 开发的高性能开源远程过程调用 (RPC) 框架。它使客户端应用程序能够调用位于远程计算机上的服务器应用程序上的方法,其方式与在本地对象上调用方法一样容易。它通过在客户端和服务器应用程序之间提供高效且独立于语言的通信,简化了构建和扩展分布式应用程序的过程。

微服务中的 gRPC vs REST vs SOAP

微服务体系结构中使用的通信协议包括 gRPC、REST 和 SOAP。以下是它们之间的一些主要区别:

  • 语言支持:REST 和 SOAP 通常用于基于 Web 的编程语言,而 gRPC 支持多种编程语言,包括 C++、Java、Python 等。
  • 性能:由于 gRPC 使用二进制序列化、压缩数据格式和双向流式处理,因此它比 REST 和 SOAP 更快、更有效。因此,客户端和服务器应用程序可以实时通信。
  • 数据格式:REST 和 SOAP 使用 XML 或 JSON,而 gRPC 使用 Protocol Buffers,这是一种二进制序列化标准。
  • 强类型和服务协定:为了建立服务协定,gRPC 使用协议缓冲区,该缓冲区提供强类型并有助于服务版本控制和维护。REST 和 SOAP 在其服务契约中使用表达力较低且灵活的 WSDL 或 OpenAPI 定义。
  • 可伸缩性:gRPC 是微服务体系结构的绝佳选择,因为它是为处理大规模分布式系统而构建的,并具有开箱即用的负载平衡和运行状况检查等功能。

在 NestJS 中使用 gRPC

在本节中,您将学习如何创建一个简单的 NestJS 微服务,该服务使用 gRPC 返回“Hello, World!”:

首先,你需要安装 NestJS CLI 和 gRPC 工具:

npm install -g @nestjs/cli
npm install @nestjs/microservices @grpc/grpc-js

你需要使用 CLI 创建一个新的 NestJS 项目:

nest new hello-world-demo

此示例中的项目名称为“hello-world-demo”。

现在,导航到项目文件夹:

cd hello-world-demo

接下来,您需要创建一个新的模块和服务。服务是为应用程序提供特定类型功能的类,而模块是相关服务、控制器和提供程序集合的容器。通过这样做,你基本上是在向你的NestJS应用程序添加一个新的可管理,可测试的功能层。这有助于将来添加其他功能,并有利于应用程序的常规体系结构和可维护性。

nest g module hello
nest g service hello

然后,您需要使用以下代码更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Willin 老王躺平不摆烂

感谢你这么好看还这么慷慨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值