iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 15
0
Modern Web

Nest.js framework 30天初探系列 第 15

Nestjs framework 30天初探:Day15 MicroServices_RabbitMQ

  • 分享至 

  • xImage
  •  

MicroServices_RabbitMQ

MQ全稱為消息隊列,消息隊列(MQ)是一種應用程序對應用程序的通信方式。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指示的是應用程序通過隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。(整理自知乎)
RabbitMQ的是一個AMQP實現,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等。另外,AMQP協議更多用在企業系統內,對數據一致性,穩定性和可靠性要求很高的場景,對性能和吞吐量還在其次。(整理自知乎)

  1. 這次透過RabbitMQ,做MicroService傳遞訊息。
  2. 先至CloudAMQP,創一個RabbitMQ雲端Server,創好後,請看Detail頁面,注意AMQP URL,後續會用到。
    https://ithelp.ithome.com.tw/upload/images/20171219/20107195g1RqFJ2ES5.png
  3. 請修改server.ts,程式碼如下。
    src/server.ts
import { NestFactory } from '@nestjs/core';
import { ApplicationModule } from './modules/app.module';
import { Transport } from '@nestjs/microservices';
import { INestMicroservice } from '@nestjs/common/interfaces';
import { RabbitMQServer } from './modules/Shared/Services/rabbitmq.server';

async function bootstrap() {
	const app = await NestFactory.create(ApplicationModule);
	app.connectMicroservice({
		transport: Transport.TCP,
		//連接雲端的RabbitMQ server
		strategy: new RabbitMQServer('amqp://rmtahlzz:Jqyq1OnzF7qWPzQXmcwAQly_aRsTrd1z@mustang.rmq.cloudamqp.com/rmtahlzz', 'example'),
	});
  
	await app.startAllMicroservices();
	await app
	.listen(3001).then(()=>{
		console.log('MicroService is starting.');
	})
	.catch((error)=>{
		console.error('Something wrong happened,',error);
	})
  }
  bootstrap();

RabbitMQServer第一個參數請複製第2點的AMQP URL,是我們稍早創建的AMQP Server的 URL,第二個參數是queue,queue是儲存訊息的架構,訊息會被客戶端拿走。

  1. modeules資料夾新增Shared/Services資料夾,底下再新增官網兩隻範例程式(rabbitmq-client.ts、rabbitmq-server.ts)。
    cmd 指令
cd src/modules & mkdir Shared/Services

rabbitmq-client.ts、rabbitmq-server.ts 程式碼請見nestjs github,nestjs作者寫的已經處理好pub、sub,我們只需要無腦呼叫使用即可。

  1. 修改AppController,部分程式碼如下。
    src/modules/app.controller.ts
import { RabbitMQClient } from './Shared/Services/rabbitmq.client';

//策略模式,自定義一個策略名稱amqp
  @MessagePattern({ cmd: 'amqp' })
  //傳入data
  useRabbitMQ(data: string): Observable<string> {
    return Observable.of(data);
  }

  @Get('/rabbitMQ')
  callRabbitMQ(): Observable<string> {
    //呼叫使用一個策略,選定amqp
    const pattern = { cmd: 'amqp' };
    //send()要傳入兩個參數,pattern 和 data,pattern選擇哪種策略,data則是要傳遞的訊息。
    const data = 'use RabbitMQ';
    //透過RabbitMQ消息隊列方式傳遞訊息,注意queue要跟server.ts建立的RabbitMQServer的queue一樣
    this.client = new RabbitMQClient('amqp://rmtahlzz:Jqyq1OnzF7qWPzQXmcwAQly_aRsTrd1z@mustang.rmq.cloudamqp.com/rmtahlzz', 'example');
    return this.client.send<string>(pattern, data);
  }

說明:詳見程式碼註解說明。

  1. 啟動server,並打開CloudAMQP主控台,看到連線已經建立。
    cmd指令
npm start

https://ithelp.ithome.com.tw/upload/images/20171219/20107195Z4GEegGBtr.png
7. 打開Postman,對http://localhost:3001/rabbitMQ 做GET請求。
結果如下
https://ithelp.ithome.com.tw/upload/images/20171219/20107195izlp5GyPRq.png

成功使用了RabbitMQ作為訊息傳遞的方式!

程式碼都在github


上一篇
Nestjs framework 30天初探:Day14 MicroServices
下一篇
Nestjs framework 30天初探:Day16 SQL (Sequelize) PART 1
系列文
Nest.js framework 30天初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言