TypeScript微服务:迈向模块化架构的第一步
\n\n想象一下,你在建造一栋房子。你可以先砌一堵巨大的墙,然后再添加房间。但如果一个房间坏了,整栋建筑都会受到影响。另一种选择是建造独立的模块:厨房、卧室、客厅,每个模块都有自己的布线和管道。微服务的工作原理大致如此——它们是独立的、松耦合的组件,通过网络进行通信。
\n\nTypeScript用于微服务不仅仅是一种流行趋势,更是一种避免混乱的工具。静态类型检查在编译阶段就能捕获错误,而不是在生产环境中。在本文中,我们将探讨如果你想从单体架构转向TypeScript微服务,应该从哪里开始。没有废话,只有真实的代码示例。
\n\n为什么选择TypeScript而不是纯JavaScript?
\n\n当你编写微服务时,每个服务都是一个独立的项目。没有类型,很容易混淆:服务A期望什么数据格式?服务B返回什么?TypeScript解决了这个问题:
\n\n- \n
- 接口和类型——你清晰地定义了服务之间的契约。 \n
- 自动补全和重构——IDE会提示对象的字段,重命名不会破坏代码。 \n
- 与Node.js的兼容性——TypeScript编译成JavaScript,可以在任何有Node的地方运行。 \n
示例:假设订单服务向配送服务发送数据。没有类型,你可能会不小心传递一个字符串而不是数字。TypeScript会告诉你:“嘿,这里期望的是number,但你发送的是string”。
\n\n入门工具集
\n\n要开始,你需要:
\n\n- \n
- Node.js(版本18+)——运行环境。 \n
- TypeScript——全局安装或在项目中安装。 \n
- NestJS——用于服务器端应用程序的框架。它原生支持微服务架构。 \n
- RabbitMQ或NATS——用于异步通信的消息代理。 \n
- Docker——每个服务的容器化。 \n
别担心,所有这些都可以在15分钟内配置好。
\n\n步骤1:使用NestJS创建第一个微服务
\n\nNestJS就像后端的Angular。它使用装饰器、模块和提供者。安装它:
\n\nnpm i -g @nestjs/cli\nnest new user-service\ncd user-service\nnpm install @nestjs/microservices\n\n现在将普通应用程序转换为微服务。打开main.ts:
import { NestFactory } from '@nestjs/core';\nimport { MicroserviceOptions, Transport } from '@nestjs/microservices';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.createMicroservice<MicroserviceOptions>(\n AppModule,\n {\n transport: Transport.TCP, // 或 Redis, RabbitMQ\n options: {\n host: '0.0.0.0',\n port: 3001,\n },\n },\n );\n await app.listen();\n console.log('User microservice is listening on port 3001');\n}\nbootstrap();\n\n我们创建了一个监听TCP端口3001的微服务。现在在app.controller.ts中添加一个消息处理器:
import { Controller } from '@nestjs/common';\nimport { MessagePattern, Payload } from '@nestjs/microservices';\n\n@Controller()\nexport class AppController {\n @MessagePattern('get_user')\n getUser(@Payload() data: { id: number }) {\n // 模拟数据库查询\n return { id: data.id, name: 'Alice', email: 'alice@example.com' };\n }\n}\n\n搞定!第一个微服务已经准备好了。它接收模式为get_user的消息并返回用户数据。
步骤2:创建第二个服务并组织通信
\n\n我们再创建一个服务——order-service。它将向user-service请求数据。