引言:为什么 TypeScript 是微服务的理想选择
微服务架构已成为构建复杂、可扩展且容错应用程序的标准。TypeScript 凭借其严格的类型系统、丰富的生态系统以及对异步操作的支持,成为实现微服务的最佳语言之一。它使您能够编写更易于重构、测试和文档化的代码,这在将系统拆分为数十个独立服务时至关重要。
在本文中,我们将分析架构原则,在 NestJS 上构建一个简单的微服务,通过 RabbitMQ 配置服务间通信,并将所有内容打包到 Docker Compose 中。您将获得一个现成的实用基础来开始。
TypeScript 中的微服务架构
正确的架构是成功的关键。对于 TypeScript 微服务,可以区分出三个关键层:
- 传输层 — 负责接收和发送请求(HTTP、gRPC、消息队列)。
- 业务逻辑层 — 独立于框架的纯函数和服务。
- 数据层 — 仓库和 ORM(TypeORM、Prisma)。
每个微服务应该是自治的:拥有自己的数据库、CI/CD 和部署逻辑。服务间的通信通常通过 异步队列(RabbitMQ、Kafka)或同步调用(gRPC)来实现。
实践:在 NestJS 上创建微服务
步骤 1:项目初始化
安装 NestJS CLI 并创建一个新项目:
npm i -g @nestjs/clinest new user-service --package-manager npmcd user-service步骤 2:添加微服务支持
NestJS 内置了对微服务传输器的支持。让我们安装 RabbitMQ:
npm install @nestjs/microservices amqplib amqp-connection-manager让我们创建 main.ts,以微服务模式运行服务:
import { NestFactory } from '@nestjs/core';import { MicroserviceOptions, Transport } from '@nestjs/microservices';import { AppModule } from './app.module';
async function bootstrap() { const app = await NestFactory.createMicroservice<MicroserviceOptions>( AppModule, { transport: Transport.RMQ, options: { urls: ['amqp://localhost:5672'], queue: 'user_queue', queueOptions: { durable: false }, }, }, ); await app.listen();}bootstrap();步骤 3:实现控制器
让我们创建一个简单的控制器,用于处理来自队列的消息:
import { Controller } from '@nestjs/common';import { MessagePattern, Payload } from '@nestjs/microservices';
@Controller()export class UserController { @MessagePattern('user.create') createUser(@Payload() data: { name: string; email: string }): string { // 创建用户的业务逻辑应写在这里 return `用户 ${data.name} 已创建`; }}现在,任何服务都可以向 user_queue 发送带有模式 user.create 的消息并接收响应。
服务间通信:同步与异步
同步:gRPC
对于需要严格类型化和低延迟的高负载系统,请使用 gRPC。安装包:
npm install @nestjs/microservices @grpc/grpc-js @grpc/proto-loader定义一个 .proto 文件:
syntax = "proto3";package user;service UserService { rpc GetUser (UserId) returns (User);}message UserId { int32 id = 1; }message User { string name = 1; string email = 2; }在控制器中,使用 @GrpcMethod 装饰器来处理请求。