ASSISTANT
Đây là ví dụ về cách sử dụng Microservices trong NestJS để tạo ra một ứng dụng sử dụng nhiều microservices. Trong ví dụ này, chúng ta sẽ tạo ra hai microservices: PostService và CommentService để quản lý bài đăng và bình luận.
1. Cài đặt các package cần thiết:
```bash
npm install --save @nestjs/common @nestjs/core @nestjs/microservices @nestjs/platform-express rxjs
```
2. Tạo module PostModule để quản lý PostService:
```typescript
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { PostController } from './post.controller';
@Module({
imports: [
ClientsModule.register([
{
name: 'POST_SERVICE',
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 3000,
},
},
]),
],
controllers: [PostController],
})
export class PostModule {}
```
Ở module này, chúng ta sử dụng ClientsModule để khai báo một client để gọi đến microservice PostService với TCP transport và port 3000.
3. Tạo PostController để xử lý các request liên quan đến bài đăng:
```typescript
import { Controller, Get } from '@nestjs/common';
import { Client, ClientProxy } from '@nestjs/microservices';
import { Observable } from 'rxjs';
@Controller()
export class PostController {
@Client({ transport: Transport.TCP, options: { port: 3000 } })
client: ClientProxy;
@Get('/posts')
getPosts(): Observable<any> {
return this.client.send({ cmd: 'getPosts' }, {});
}
}
```
Ở đây, chúng ta sử dụng @Client để khai báo một client và sử dụng method `send` để gọi đến microservice PostService với command `getPosts`.
4. Tạo PostService để xử lý các request liên quan đến bài đăng:
```typescript
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostService {
private posts = [
{
id: 1,
title: 'First post',
content: 'This is the first post',
},
{
id: 2,
title: 'Second post',
content: 'This is the second post',
},
];
getPosts(): any {
return this.posts;
}
}
```
Ở đây, chúng ta đơn giản chỉ trả về các bài đăng được lưu trong một mảng.
5. Tạo module CommentModule để quản lý CommentService:
```typescript
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { CommentController } from './comment.controller';
@Module({
imports: [
ClientsModule.register([
{
name: 'COMMENT_SERVICE',
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 4000,
},
},
]),
],
controllers: [CommentController],
})
export class CommentModule {}
```
Ở module này, chúng ta sử dụng ClientsModule để khai báo một client để gọi đến microservice CommentService với TCP transport và port 4000.
6. Tạo CommentController để xử lý các request liên quan đến bình luận:
```typescript
import { Controller, Get } from '@nestjs/common';
import { Client, ClientProxy } from '@nestjs/microservices';
import { Observable } from 'rxjs';
@Controller()
export class CommentController {
@Client({ transport: Transport.TCP, options: { port: 4000 } })
client: ClientProxy;
@Get('/comments')
getComments(): Observable<any> {
return this.client.send({ cmd: 'getComments' }, {});
}
}
```
Tương tự như PostController, ở đây chúng ta sử dụng @Client để khai báo một client và sử dụng method `send` để gọi đến microservice CommentService với command `getComments`.
7. Tạo CommentService để xử lý các request liên quan đến bình luận:
```typescript
import { Injectable } from '@nestjs/common';
@Injectable()
export class CommentService {
private comments = [
{
id: 1,
postId: 1,
content: 'This is the first comment',
},
{
id: 2,
postId: 1,
content: 'This is the second comment',
},
{
id: 3,
postId: 2,
content: 'This is the third comment',
},
];
getComments(): any {
return this.comments;
}
}
```
Ở đây, chúng ta đơn giản chỉ trả về các bình luận được lưu trong một mảng.
8. Tạo app module để kết hợp các module và client:
```typescript
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { PostModule } from './posts/post.module';
import { CommentModule } from './comments/comment.module';
@Module({
imports: [
PostModule,
CommentModule,
ClientsModule.register([
{
name: 'POST_SERVICE',
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 3000,
},
},
{
name: 'COMMENT_SERVICE',
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 4000,
},
},
]),
],
})
export class AppModule {}
```
Ở đây, chúng ta import PostModule và CommentModule và sử dụng ClientsModule để khai báo các client để gọi đến microservices PostService và CommentService.
9. Cuối cùng, chúng ta start ứng dụng như sau:
```typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(5000);
}
bootstrap();
```
Ở đây, chúng ta sử dụng NestFactory để tạo ra một instance của AppModule và start ứng dụng trên port 5000.
Với ví dụ này, chúng ta đã tạo ra một ứng dụng NestJS sử dụng hai microservices để quản lý bài đăng và bình luận. Các module và client được quản lý độc lập và có thể scale riêng biệt.