NestJS 中的 gRPC 微服务通信

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

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

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

在这里插入图片描述

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

目录

  • 先决条件
  • 微服务及其通信方式
  • 微服务通信的挑战
  • 微服务中的通信模式
  • gRPC 概述
  • 微服务中的 gRPC vs REST vs SOAP
  • 在 NestJS 中使用 gRPC
  • 使用 gRPC 进行微服务通信的好处
  • 结论

先决条件

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

  • 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

然后,您需要使用以下代码更新 hello-world-demo/src/hello/hello.service.ts 文件:

import { Injectable } from '@nestjs/common';
import { GrpcMethod } from '@nestjs/microservices';@Injectable()
export class HelloService {@GrpcMethod('HelloService', 'SayHello')sayHello(data: any): { message: string } {return { message: 'Hello, World!' };}
}

此服务文件包含一个标记为可注入提供程序的 HelloService 类。 @GrpcMethod 修饰器用于将 sayHello 方法标记为 gRPC 方法,该方法返回“Hello, World!”消息。总的来说,此代码演示了如何使用 NestJS 创建基本的 gRPC 服务。

更新 hello-world-demo/src/app.module.ts 文件以包含 HelloService 和 使用 gRPC:

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { HelloService } from './hello/hello.service';@Module({imports: [ClientsModule.register([{name: 'HELLO_PACKAGE',transport: Transport.GRPC,options: {url: 'localhost:5000',package: 'hello',protoPath: './hello.proto',},},]),],controllers: [AppController],providers: [AppService, HelloService],
})
export class AppModule {}

它具有用于 HelloService 提供程序类、HTTP 控制器和 AppService HelloService 提供程序类的 gRPC 客户端。用于 ClientsModule 使用提供的选项注册 gRPC 客户端,例如描述服务的原型文件的路径、gRPC 服务器的 URL 以及包的名称。在 providers 应用程序中管理业务逻辑的 AppService and HelloService 类包含在字段中。管理 AppController 传入 HTTP 请求的类是该 controllers 属性的成员。

创建一个新文件 hello-world-demo/hello.proto 并添加以下代码:

syntax = "proto3";package hello;oservice HelloService {rpc SayHello (HelloRequest) returns (HelloResponse);
}message HelloRequest {string name = 1;
}message HelloResponse {string message = 1;
}

原型文件用于定义 gRPC 服务的结构和接口。它是一个概述服务的过程以及参数的输入和输出数据格式的文件。gRPC 框架使用用协议缓冲区语言编写的原型文件在 NestJs 中生成客户端和服务器代码。

最后,更新 hello-world-demo/src/main.ts 文件以启动 gRPC 微服务:

import { NestFactory } from '@nestjs/core';
import { Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';async function bootstrap() {const app = await NestFactory.createMicroservice(AppModule, {transport: Transport.GRPC,options: {url: 'localhost:5000',package: 'hello',protoPath: './hello.proto',},});await app.listen();
}
bootstrap();

现在,启动 gRPC 微服务:

npm run start

服务器启动后,它将侦听指定 URL 和端口(在本例中为 5000)上的传入 gRPC 请求。然后,可以从 gRPC 客户端(例如 Web 前端、移动应用或其他微服务)向服务器发送请求。对于我们一直在处理的“Hello World”示例,您可以通过使用 grpcurl 命令行工具发送请求来测试服务器。若要测试微服务,可以使用 grpcurl,这是一个用于与 gRPC 服务交互的命令行工具:

grpcurl -plaintext -d '{"name": "John"}' localhost:5000 hello.HelloService/SayHello

这应返回以下响应:

{"message": "Hello, World!"
}

就是这样!您已经创建了一个使用 gRPC 返回“Hello, World!”的 NestJS 微服务,并且您已经使用 grpcurl 对其进行了测试。当然,在实际应用程序中,微服务可能具有更复杂的功能,而不是简单地返回“Hello, World!”来响应单个请求。但是,启动服务器、侦听传入请求以及根据业务逻辑处理这些请求的基本过程将是相同的。

使用 gRPC 进行微服务通信的好处

使用 NestJS 和 gRPC 进行微服务通信可以产生更快、更可靠、更具可扩展性的系统。以下是一些好处:

  • 强类型协定:gRPC 提供的 API 是强类型,它使用协议缓冲区来构造服务协定。换句话说,服务器和客户端都可以确保它们发送和接收的消息遵循特定的架构。
  • 自动代码生成:NestJS提供的工具使得从gRPC服务定义文件(.proto)自动生成TypeScript代码变得简单,这使得将微服务与NestJS集成变得简单。
  • 互操作性:通过允许 NestJS 和 gRPC 与其他使用不同通信协议的服务一起运行,使它们更容易与 HTTP/REST 等其他协议一起运行。
  • 易用性:NestJS提供了一个易于理解的API来定义gRPC服务,使构建和管理微服务变得简单。

结论

微服务架构正在成为设计复杂且可扩展的应用程序的一种更流行的方式。它通过将应用程序分解为独立和专用的组件来提供灵活性和可扩展性。但是,此设计的有效性取决于微服务之间的有效通信。这就是高性能远程过程调用 (RPC) 框架 gRPC 发挥作用的地方。

在本文中,我们探讨了在 NestJS 中使用 gRPC 进行微服务通信的好处。我们讨论了微服务通信中涉及的挑战,包括延迟、安全性、服务发现和容错。我们还探讨了 gRPC 如何帮助开发人员克服这些挑战并构建可缩放的容错微服务体系结构。此外,我们还将 gRPC 与其他通信协议(如 REST 和 SOAP)进行了比较,重点介绍了其语言支持、性能、数据格式和服务协定优势。

此外,我们在 NestJS 中使用 gRPC 构建了一个简单的“hello world”服务,以演示 Nest 应用程序中的服务如何使用 gRPC 进行有效通信。

最后,我们讨论了在 NestJS 中使用 gRPC 进行微服务通信的好处,包括强类型协定、自动代码生成、互操作性和易用性。

总之,开发人员可以使用 gRPC 的性能和类型安全以及 NestJS 的简单性,构建具有有效通信通道的可扩展且可维护的微服务,从而产生更健壮、更可靠的系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年工作架构分析

mpmw自动化流程工具 schema动态数据 Schema 本身是一个JSON ,Schema 通过一些特定字段描述和定义 JSON的数据结构。 最常见的表单通过类XML语法定义。一些库支持通过一些特定结构的 JSON (Schema)来生成类XML标签。 formily 是其中实现之一。 表单设计器通过可视…

excel统计函数篇2之count系列

1、COUNT(value1,[value2],…):计算参数列表中数字的个数 2、COUNTA(value1,[value2],…):计算参数列表中值的个数 联想在excel之数学函数、excel中的通配符一文中提到求和函数: SUMIF(range,ceriteria,[sum_range]):对范围内符合指定条件的…

【广州华锐互动】牲畜养殖VR模拟实操系统为传统教育注入新的生命力

随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进我们的生活。在农业领域,VR技术的应用也日益广泛,为现代农业人才培养提供了新的途径。 由广州华锐互动开发的“牲畜养殖VR模拟实操系统”引起了广泛关注,系统包含了鸡、猪、牛、马…

MFC140.dll缺失的修复方法,安装MFC140.dll文件

大家好,今天我要和大家分享的是如何正确安装和使用MFC140.dll。MFC140.dll是一种常见的动态链接库文件,它是Microsoft Foundation Classes(MFC)的一部分,被广泛应用于Windows操作系统中的各种应用程序中。在本文中,我们将详细介绍…

「Vue|网页开发|前端开发」01 快速入门:用vue-cli快速写一个Vue的HelloWorld项目

本文主要介绍如何用vue开发的标准化工具vue-cli快速搭建一个符合实际业务项目结构的hello world网页项目并理解vue的代码文件结构以及页面渲染流程。 文章目录 一、准备工作:安装node.js二、项目搭建创建项目目录全局安装vue-cli使用Webpack初始化项目启动项目学会…

STM32 printf函数

printf函数输出流程 用户调用printf()函数到C标准库调用printf函数相关部分,printf函数由编译器提供的stdio.h解析。包含在usart.h文件中。fputc()最终实现输出。用户需要根据最终输出的硬件重新定义该函数,此过程为:printf重定向。 printf的…

html动态爱心代码【四】(附源码)

目录 前言 特效 完整代码 总结 前言 情人节马上就要到了,为了帮助大家高效表白,下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐,可用于520,情人节,生日,表白等场景,可直接使用。…

pytorch中的register_buffer

今天在一个模型的init中遇到了self.register_buffer(‘running_mean’, torch.zeros(num_features)) register_buffer(self, name, tensor)是一个PyTorch中的方法,它的作用是向模块(module)中添加一个持久的缓冲区(buffer&#xf…

校企合作谋发展 合作共赢谱新篇|云畅科技与湖南民族职业学院签订校企合作协议

产业是经济发展的重要引擎,人才是产业发展的重要资源。为积极探索软件人才培育新路径,共商政产学研协同新机制,8月8日,云畅科技与湖南省民族职业学院教育技术学院软件技术专业签订校企合作协议。 会上,学院副校长王志平…

小象课堂在线授课教育系统

此项目包含后端全部代码,前端包括后台和web界面的源码,数据库用的mysql,可当作课设或者毕设,还可写入自己的简历中 web界面展示: 前端后台界面展示: 用户管理 课程管理 内容配置 订单管理 系统管理 系统监控

STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作

今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理: 红外遥控特点: …

AI让儿童绘画动起来-程序员带娃必备

项目效果演示 项目描述 很多小朋友在学习绘画的过程中,创作出来很多比较有创意的作品,那么怎么让这些作品,动起来,甚至是和拍摄的视频进行互动呢,今天分享的这个项目,能够完美解决这个问题。 项目地址http:…

爬虫ip带你探索无限可能

各位程序猿大佬们,今天我要为大家带来一个备受关注的话题:爬虫ip的应用范围!你可能会好奇,什么是爬虫ip?它在我们的日常生活中有哪些神奇的应用呢?让我们一起来揭开这个神秘的面纱,探索无限可能…

2023-腾讯QQ客户端远程代码执行漏洞

2023-腾讯QQ客户端远程代码执行漏洞 一、漏洞详情二、威胁程度三、影响范围四、漏洞复现五、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用…

macOS上编译obs-studio

前言 最近基于obs的1个二开程序,需要移植到macOS平台上,由于遇到些问题,本文记录下如何在macOS上配置&编译&运行obs程序完整过程。 下载 首先下载cmake-gui工具,下载CMAKE,选择对应macOS平台的cmake版本&…

PostgreSQL父子建表查询所有的子数据-利用自定义函数查询

pgsql 函数查询代码 select find_space_tree_list_by_nodeid(1,1) 查询结果示意图 获取子集函数代码 CREATE OR REPLACE FUNCTION "public"."find_space_tree_list_by_nodeid"("nodeid" varchar, "viewid" varchar)RETURNS "…

特斯拉Model 3的七年狂飙

‍ 作者 | 张祥威 编辑 | 德新 发布一周拿下32万张订单,之后用时五年,交付量突破100万辆。粗略计算,自2016年发布至今,特斯拉Model 3已交付超150万辆。 放眼新能源赛道,如此战绩 别无二家。 Model 3踩中纯电动车的…

常用的电参数

电参数根据电流的特点可以分为直流电参数和交流电参数,在电参数中有些是可以通过电参数表测得,有些参数则为通过测得的参数计算而来。 一、电参数 1.1 直接可测电参数 ——瞬时电压值 ——瞬时电流值 n——采样点数 f——频率 time——时间 其中&…

基于web的服装商城系统java网上购物商店jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于web的服装商城系统 系统有1权限:前台…

【Java转Go】快速上手学习笔记(四)之基础篇三

目录 泛型内置泛型的使用切片泛型和泛型函数map泛型泛型约束泛型完整代码 接口反射协程特点WaitGroupgoroutine的调度模型:MPG模型 channel介绍语法:举例:channel遍历基本使用和协程一起使用案例一案例二 select...casemain.go 完整代码 文件…