返回

小白也能玩转:NestJS+gRPC+Docker快速上手指南

后端

跨入微服务新领域,NestJS+gRPC助你一臂之力

随着软件系统的日益复杂,传统的单体架构已无法满足需求,微服务架构应运而生。作为一种现代化的软件架构,微服务以其模块化、灵活性、可扩展性和可维护性等优点,赢得了广大开发者的青睐。

NestJS作为一款备受推崇的Node.js框架,以其优雅的代码结构、强大的功能和丰富的生态系统,成为构建微服务的不二之选。而gRPC作为一种高效的远程过程调用(RPC)框架,能够轻松实现不同语言、不同平台之间的通信,是构建微服务系统的理想工具。

使用NestJS+gRPC构建分布式微服务系统

本文将以一个简单的示例,手把手教你如何使用NestJS+gRPC构建一个分布式微服务系统。该系统将包括一个用户服务和一个订单服务,这两个服务通过gRPC进行通信。

1. 创建NestJS项目

首先,我们需要创建一个新的NestJS项目。我们可以使用NestJS CLI工具来完成这一步:

nest new my-app

2. 安装gRPC库

接下来,我们需要安装gRPC库。我们可以使用以下命令:

npm install @grpc/grpc-js

3. 创建gRPC服务

现在,我们可以创建一个gRPC服务。首先,我们需要创建一个gRPC协议定义文件(.proto文件)。这个文件定义了服务的方法和消息类型。

例如,我们可以创建一个名为user.proto的文件,内容如下:

syntax = "proto3";

package user;

message User {
  int32 id = 1;
  string name = 2;
}

service UserService {
  rpc GetUser(int32 id) returns (User);
  rpc CreateUser(User user) returns (User);
}

4. 生成gRPC代码

接下来,我们需要使用protoc工具生成gRPC代码。我们可以使用以下命令:

protoc --js_out=import_style=commonjs,binary:. user.proto

这将生成两个文件:user.js和user_grpc_web.js。我们将把这些文件放在src/grpc目录中。

5. 创建NestJS模块

现在,我们可以创建一个NestJS模块来使用gRPC服务。首先,我们需要在src/grpc目录中创建一个user.module.ts文件,内容如下:

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { GrpcClientFactory } from '@nestjs/microservices';

@Module({
  providers: [UserService, GrpcClientFactory],
  controllers: [UserController],
})
export class UserModule {}

6. 创建gRPC客户端

接下来,我们需要创建一个gRPC客户端来调用gRPC服务。我们可以使用GrpcClientFactory来完成这一步。

在user.module.ts文件中,添加以下代码:

import { GrpcClientFactory } from '@nestjs/microservices';

const userClientOptions = {
  package: 'user',
  protoPath: './user.proto',
  url: 'localhost:50051',
};

@Module({
  providers: [UserService, GrpcClientFactory, {
    provide: 'USER_CLIENT',
    useFactory: (grpcClientFactory: GrpcClientFactory) => {
      return grpcClientFactory.createClient(userClientOptions);
    },
    inject: [GrpcClientFactory],
  }],
  controllers: [UserController],
})
export class UserModule {}

7. 创建NestJS服务

现在,我们可以创建一个NestJS服务来使用gRPC客户端。首先,我们需要在src/grpc目录中创建一个user.service.ts文件,内容如下:

import { Injectable } from '@nestjs/common';
import { ClientGrpc } from '@nestjs/microservices';
import { Observable } from 'rxjs';
import { User } from './user.pb';

@Injectable()
export class UserService {
  private userService: any;

  constructor(@Inject('USER_CLIENT') private client: ClientGrpc) {
    this.userService = this.client.getService('UserService');
  }

  getUser(id: number): Observable<User> {
    return this.userService.GetUser({ id });
  }

  createUser(user: User): Observable<User> {
    return this.userService.CreateUser(user);
  }
}

8. 创建NestJS控制器

最后,我们可以创建一个NestJS控制器来处理HTTP请求。首先,我们需要在src/grpc目录中创建一个user.controller.ts文件,内容如下:

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.pb';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  getUsers(): Observable<User[]> {
    return this.userService.getUsers();
  }

  @Get(':id')
  getUser(@Param('id') id: number): Observable<User> {
    return this.userService.getUser(id);
  }

  @Post()
  createUser(@Body() user: User): Observable<User> {
    return this.userService.createUser(user);
  }
}

9. 运行NestJS应用程序

现在,我们可以运行NestJS应用程序了。我们可以使用以下命令:

npm run start

这将启动NestJS应用程序,并将其监听在3000端口。

将NestJS+gRPC服务部署到Docker容器中

现在,我们已经成功地构建了一个NestJS+gRPC分布式微服务系统。接下来,我们可以将这个系统部署到Docker容器中。

1. 创建Dockerfile

首先,我们需要创建一个Dockerfile。这个文件定义了如何构建Docker镜像。

例如,我们可以创建一个Dockerfile,内容如下:

FROM node:16

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "run", "start"]

2. 构建Docker镜像

接下来,我们可以使用以下命令构建Docker镜像:

docker build -t my-app .

这将构建一个名为my-app的Docker镜像。

3. 运行Docker容器

最后,我们可以使用以下命令运行Docker容器:

docker run -p 3000:3000 my-app

这将启动一个Docker容器,并将其监听在3000端口。

结论

本文介绍了如何使用NestJS+gRPC构建一个分布式微服务系统,并将其部署到Docker容器中。希望本文能够帮助您快速入门NestJS+gRPC,并构建出强大的微服务系统。