小白也能玩转:NestJS+gRPC+Docker快速上手指南
2024-01-05 12:54:10
跨入微服务新领域,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,并构建出强大的微服务系统。