NestJS:具有 gRPC、API 网关和身份验证的微服务 — 第 1/2 部分
打字稿
分步指南:使用 TypeScript、gRPC、API 网关、身份验证和验证的 NestJS 应用程序

今天,我想向大家介绍 NestJS (TypeScript) 中的 Microservices 结合 Google 的 gRPC 框架,以及 API Gateway 来处理传入的 HTTP 请求和基于 authentication在 JWT 上。这篇文章很长,所以我把它分成两部分。
- 介绍、准备、数据库、共享原型项目
2.认证微服务、产品微服务、订单微服务
您将在本文的每个部分中找到指向每个存储库的链接。你可以在这里阅读第二部分。
应用基础设施
在本文中,我决定编写一个简单的电子商务微服务项目,其中包含一个 API 网关,用于管理传入的 HTTP 请求并将它们转发到总共 3 个微服务。
-
first service 将是 authentication,在我们验证请求的授权时,用户可以注册并登录。
-
第二个服务会处理products来创建一个新产品,但也会根据它的ID找到一个产品。
-
这对于为我们的小型电子商务应用程序处理传入的订单的第三个服务很重要。
您将看到,这些服务中的每一个都尽可能地精简,以向您介绍 NestJS 和 TypeScript 中的微服务基础知识,同时又不会破坏我们的应用程序。
我们不会处理环境变量、截止日期、深度错误处理、docker 和复杂的配置。所以别担心,我们保持简单!
每个服务都将是一个独立的项目,因此请记住这一点。此外,我们将拥有一个共享存储库,用于存储和管理 Proto 文件,这是您使用 gRPC 时的常见做法。最后但同样重要的是,我们将创建另一个项目,即 API 网关。所以我们一共谈了5个项目。
在开始阅读本指南之前,让我们简要介绍一下我们将在此处使用的框架和概念。这听起来可能很无聊,但请坚持下去,知道接下来会发生什么并理解我们要构建的应用程序是很重要的。
什么是 NestJS?
NestJS是一个用于构建高效、可扩展的 Node.js Web 应用程序的框架。它使用现代 JavaScript 并使用 TypeScript 构建。如果您开发使用 TypeScript 构建的 API,那么 NestJS 就是您的最佳选择!它深受 Spring 和 Angular 的启发。
什么是gRPC?
gRPC是一个现代的、开源的、高性能的 RPC 框架,可以在任何环境中运行。它可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持有效地连接数据中心内和跨数据中心的服务。
什么是API网关?
API 网关是所有客户端的入口点,在我们的例子中,是所有基于 HTTP 的客户端请求,但它不需要仅限于 HTTP。 API 网关以两种方式之一处理请求。一些请求只是简单地代理/路由到适当的服务。它通过扇出多个服务来处理其他请求。

图片来自Maxime HorlavilleonUnsplash
分步指南
正如我所说,我将这篇文章分成两部分。覆盖范围将是这样的:
- 数据库、共享原型项目、API 网关
2.认证微服务、产品微服务、订单微服务
先决条件
需要对已安装在本地机器上的 TypeScript、RPC、Git (+ Github)、PostgreSQL 有基本的了解。我将选择Visual Studio Code作为我的代码编辑器。你可以使用任何你喜欢的东西。
注意
您将在本文中经常看到命令code .。这是一个 Visual Studio Code 命令,它根据当前目录打开 Visual Studio Code。如果您不使用 Visual Studio Code,请确保在 IDE 或代码编辑器中打开正确的目录。
数据库
首先,我们需要创建 3 个 PostgreSQL 数据库。这是因为我们将遵循Database per Service模式。在数据管理方面,每个微服务都将拥有独立的数据库。
每个人的处理方式不同,有些人使用某种 GUI,但我们将使用我们的终端。同样,您需要在您的机器上安装 PostgreSQL。如果您安装了 PostgreSQL,以下四个命令将在 Linux、Mac 和 Windows 机器上运行。
$ psql postgres
$创建数据库微_auth;
$ CREATE DATABASE 微_product;
$ CREATE DATABASE 微_order;
$ \l
$\q
命令说明:
-
psql postgres使用用户 Postgres 打开 psql CLI -
CREATE DATABASE micro_auth;创建数据库 -
CREATE DATABASE micro_product;创建数据库 -
CREATE DATABASE micro_order;创建数据库 -
\l列出所有数据库 -
\q退出 psql CLI
在我们成功执行所有四个命令后,我的终端将如下所示。可以看到,3个数据库都创建成功了。

创建项目
让我们继续使用 NestJS。我们将在全球范围内安装 NestJS CLI。
$ npm i -g @nestjs/cli
我们用它的 CLI 初始化了 4 个新的 NestJS 项目。此外,我们为要通过 Github 共享的 proto 文件创建了一个项目。
我建议创建一个文件夹作为工作区,您将在终端中执行以下命令,将所有项目放在一个地方,但这取决于您。所以它不是本指南的一部分。
$ mkdir grpc-nest-proto
$ 嵌套新 grpc-nest-api-gateway -p npm
$ 嵌套新 grpc-nest-auth-svc -p npm
$ 嵌套新 grpc-nest-product-svc -p npm
$ 嵌套新 grpc-nest-order-svc -p npm
共享原始存储库
所以,正如我所说,我们将从共享原型项目开始。我们需要这样做,因为我们必须在所有其他项目中使用这些文件。
Github:https://github.com/hellokvn/grpc-nest-proto
首先,我们需要在我们的代码编辑器中打开项目,这个命令code .命令在我们的 VSCode 编辑器中打开grpc-proto项目。
$ cd grpc-nest-proto
$ npm 初始化 --y
$ 混帐初始化
$ mkdir 原型
$ touch proto/auth.proto && touch proto/product.proto && touch proto/order.proto
$代码。
该项目将如下所示:

然后,我们将在我们的 proto 文件中添加一些代码。跟着我。
认证原型
首先,我们将为我们的身份验证服务创建 Proto 文件。我们将添加 3 个 RPC 端点:Register、Login和Validate
让我们在proto/auth.proto中添加一些代码
订购原型
其次,我们将为我们的订单服务创建 Proto 文件。我们将只添加 1 个名为CreateOrder的 RPC 端点。
让我们在proto/order.proto中添加一些代码
产品原型
最后但同样重要的是,我们将为我们的产品服务创建 Proto 文件。我们将添加 3 个 RPC 端点:CreateProduct、FineOne和DecreaseStock
让我们在proto/product.proto中添加一些代码
在 Github 上创建仓库
正如我所说,我们需要以某种方式分享这个项目。对于本指南,我选择 Github。所以让我们在这里创建一个公共存储库。顺便说一句,这是您需要在本教程中创建的唯一存储库。稍后我们将在项目中将此存储库安装为 NPM 包。

让我们回到我们的代码,因为我们需要提交和推送我们的项目。
Replace YOUR_USERNAME 用你的 Github 用户名。
$ git remote add origin https://github.com/YOUR_USERNAME/grpc-nest-proto.git
$ 混帐添加。
$ git commit -m "chore(): init nestjs"
$ git 分支 -M 主要
$ git push -u 起源主
而已。现在我们的代码应该在 Github 上。我们这里不再做任何更改,让我们继续 API 网关。
API网关
仓库:https://github.com/hellokvn/grpc-nest-api-gateway
在这个项目中,我们将把 HTTP 请求转发到我们的微服务。有时,需要对传入的请求进行授权,这就是与我们稍后将编写的 Auth 服务相结合的部分情况。
首先,我们需要在我们的代码编辑器中打开项目,所以回到您的终端中的目录,我们存储我们的项目。
$ cd grpc-nest-api-网关
$代码。
安装依赖
让我们安装一些我们需要的依赖项。
$ npm i @nestjs/microservices @grpc/grpc-js @grpc/proto-loader
$ npm i -D @types/node ts-proto
项目结构
与我的指南中的往常一样,我将继续创建最终的文件夹和文件结构。为简单起见,我们在这里只选择一个模块。
$ nest g mo auth && nest g co auth --no-spec && nest g s auth --no-spec
$ 嵌套 g mo 产品 && 嵌套 g co 产品 --no-spec
$ nest g mo order && nest g co order --no-spec
$ touch src/auth/auth.guard.ts
添加脚本
我们需要在我们的package.json中添加一些脚本,以根据我们刚刚完成的共享 proto 项目生成我们的 protobuf 文件。
让我们简单地将这 5 行代码添加到我们的package.json文件的scripts属性中。
Replace YOUR_USERNAME 用你的 Github 用户名。
包.json
这就是它查看我的package.json或查看我的存储库上的文件的方式。

让我们运行这些脚本!
$ npm run proto:install && npm run proto:all
-
proto:install会将我们的共享 proto 存储库安装为 NPM 包 -
proto:all将在我们的模块中生成后缀为.pb.ts的 protobuf 文件:auth、order和product
因此,经过这些步骤后,项目应如下所示:

现在,让我们开始编码。
认证服务
所以我们在这里要做的是让我们的 Authentication Service 调用它的 validate 方法,我们稍后再编写代码。但是,我们已经可以准备它了,因为我们有它的 protobuf 文件。我们知道它的响应和有效载荷。
让我们把src/auth/auth.service.ts从
至
Auth Guard
我们的 AuthGuard 依赖于我们刚刚创建的服务。在这里,我们获得了稍后将要获得的 Bearer Token。然后我们验证这个令牌,如果它是无效的,我们抛出一个未经授权的异常,所以我们阻止一个没有有效授权的用户的请求。
让我们把src/auth/auth.guard.ts从
认证控制器
Auth 微服务还将处理新用户和用户登录,因此我们还在 API 网关中添加了一个控制器来将这些请求转发到我们的 Authentication 微服务。
让我们将src/auth/auth.controller.ts从:
至
认证模块
现在我们需要注册我们的身份验证服务。我们需要将此模块设为全局并导出我们的 AuthService,因为我们需要在其他模块中使用依赖于 AuthService 的 AuthGuard。所以请记住这一点。
让我们更改src/auth/auth.module.ts文件
至
现在我们完成了 API 网关的 auth 模块。让我们继续订单模块。它比我们的 auth 模块简单得多。
订单模块
与我们的 AuthModule 类似,我们需要注册我们的 Order 微服务以便稍后与它进行通信。
您可能会意识到,与身份验证服务相比,我们将使用不同的端口,这是必要的,因为我们不能两次使用同一个端口。
让我们改变src/order/order.module.ts的形式
至
订单控制器
在这里,我们只需要编写 1 个端点,因为我们的订单微服务只拥有 1 个端点。看看,我们将在这里使用我们的 AuthGuard 服务,来验证我们现在要编码的这个 POST 请求的授权。
如果发出此请求的用户被授权,则 AuthGuard 将用户的 ID 添加到请求中,我们将在此处与请求正文合并,因为我们的 protobuf 文件order.pb.ts需要用户 ID。
让我们改变src/order/order.controller.ts形式
至
产品模块
现在让我们对 API 网关的 Product 模块重复这个过程。
让我们把src/product/product.module.ts从
至
产品控制器
产品微服务包含 3 个端点,但 DecreaseStock 不应该可以从我们的 API 网关访问,这就是为什么要添加另外 2 个端点。
让我们改变src/product/product.controller.ts形式
至
伟大的!而已。 API 网关已完成。现在我们可以运行它了。不幸的是,这个 API 网关没有它的微服务是没有用的,所以让我们继续本文的第 2 部分。
$ npm 运行开始:开发

感谢您阅读我关于使用 NestJS 的微服务的文章的第一部分。点击此处进入第 2 部分。
干杯!
我希望你喜欢阅读这篇文章。如果您想支持我作为作家,请考虑注册成为 Medium 会员。每月只需 5 美元,您就可以无限制地访问 Medium。
想支持我吗?给我买杯咖啡。
阅读下一篇
[
NestJS:具有 gRPC、API 网关和身份验证的微服务 — 第 2/2 部分
认证服务(grpc-nest-auth-svc)
levelup.gitconnected.com
](/nestjs-microservices-with-grpc-api-gateway-and-authentication-part-2-2-d67dc8e3b86a)
升级编码
感谢您成为我们社区的一员! 在升级工作平台. 上聘请出色的软件工程师
[
升级工作平台
软件工程师、数据科学家、经理、设计师、构建者和程序员的最佳角色
工作.levelup.dev
](https://jobs.levelup.dev)
更多推荐
所有评论(0)