亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Dapr+NestJs編寫Pub及Sub裝飾器

發布時間:2022-08-01 14:09:10 來源:億速云 閱讀:74 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么使用Dapr+NestJs編寫Pub及Sub裝飾器”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么使用Dapr+NestJs編寫Pub及Sub裝飾器”吧!

Dapr 是一個可移植的、事件驅動的運行時,它使任何開發人員能夠輕松構建出彈性的、無狀態和有狀態的應用程序,并可運行在云平臺或邊緣計算中,它同時也支持多種編程語言和開發框架。Dapr 確保開發人員專注于編寫業務邏輯,不必分神解決分布式系統難題,從而顯著提高了生產力。Dapr 降低了構建微服務架構類現代云原生應用的門檻。

系列

本地使用 Docker Compose 與 Nestjs 快速構建基于 Dapr 的 Redis 發布/訂閱分布式應用

NodeJS 基于 Dapr 構建云原生微服務應用,從 0 到 1 快速上手指南

Dapr JavaScript SDK

用于在 JavaScript 和 TypeScript 中構建 Dapr 應用程序的客戶端庫。 該客戶端抽象了公共 Dapr API,例如服務到服務調用、狀態管理、發布/訂閱、Secret 等,并為構建應用程序提供了一個簡單、直觀的 API。

安裝

要開始使用 Javascript SDK,請從 NPM 安裝 Dapr JavaScript SDK 包:

npm install --save @dapr/dapr

?? dapr-client 現在已棄用。 

結構

Dapr Javascript SDK 包含兩個主要組件:

  • DaprServer: 管理所有 Dapr sidecar 到應用程序的通信。

  • DaprClient: 管理所有應用程序到 Dapr sidecar 的通信。

上述通信可以配置為使用 gRPC 或 HTTP 協議。

實戰

創建一個小應用程序來生成有關網站中用戶行為的統計信息。

Demo 源碼

github.com/Hacker-Linn…

準備環境和項目結構

npm install -g @nestjs/cli
nest new api
mv api nest-dapr
cd nest-dapr
nest generate app page-view
npm install dapr-client
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

創建一個 decorators.ts 文件(apps/shared/decorators.ts),這樣所有微服務都可以從我們即將編寫的基礎架構中受益。

注入 Dapr 賴項

注入 DaprClient 和 DaprServer,我們需要提供它們到 nest.js

在 app.module.ts 中讓我們注冊 DaprClient:

providers: [
...
  {
    provide: DaprClient,
    useValue: new DaprClient()
  }
]

在 page-view.module.ts 中以同樣的方式添加 DaprServer:

providers: [
...
  {
    provide: DaprServer,
    useValue: new DaprServer()
  }
]

配置 Dapr 組件(rabbitMQ)

用 docker compose 啟動 rabbitmq:

version: '3.9'
services:
  pubsub:
    image: rabbitmq:3-management-alpine
    container_name: 'pubsub'
    ports:
      - 5674:5672
      - 15674:15672 #web port

我們還需要配置 Dapr 組件。在根文件夾中創建一個 component/pubsub.yml:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.rabbitmq
  version: v1
  metadata:
    - name: host
      value: 'amqp://guest:guest@localhost:5674'

每個 Dapr 微服務都需要自己的 config。

api/dapr/config.yml:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: api
  namespace: default

page-view/dapr/config.yml:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: page-view
  namespace: default

API/Gateway 服務

app.controller.ts 中,我們將公開一個簡單的 API — /add-page-view

 @Post('/add-page-view')
 async prderAdd(@Body() pageViewDto: PageViewDto): Promise<void> {
   try {
      console.log(pageViewDto);
      await this.daprClient.pubsub.publish('pubsub', 'page-view-add', pageViewDto);
    } catch (e) {
      console.log(e);
    }
  }

內部監聽微服務

在我們將數據發布到隊列之后,我們需要監聽它并調用它:

在 page-view.controller.ts 添加:

@DaprPubSubSubscribe('pubsub', 'add')
addPageView(data: PageViewDto) {
    console.log(`addPageView executed with data: ${JSON.stringify(data)}`);
    this.data.push(data);
}

注意我們現在需要創建的新裝飾器:@DaprPubSubscribe

@DaprPubSubscribe 裝飾器

在 shared/decorators.ts 中:

import { INestApplication } from '@nestjs/common';
import { DaprServer } from 'dapr-client';
export type PubsubMap = {
  [pubSubName: string]: {
    topic: string;
    target: any;
    descriptor: PropertyDescriptor;
  };
};
export const DAPR_PUB_SUB_MAP: PubsubMap = {};
export const DaprPubSubSubscribe = (
  pubSubName: string,
  topic: string,
): MethodDecorator => {
  return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
    DAPR_PUB_SUB_MAP[pubSubName] = {
      topic,
      target,
      descriptor,
    };
    return descriptor;
  };
};
export const useDaprPubSubListener = async (app: INestApplication) => {
  const daprServer = app.get(DaprServer);
  for (const pubSubName in DAPR_PUB_SUB_MAP) {
    const item = DAPR_PUB_SUB_MAP[pubSubName];
    console.log(
      `Listening to the pubsub name - "${pubSubName}" on topic "${item.topic}"`,
    );
    await daprServer.pubsub.subscribe(
      pubSubName,
      item.topic,
      async (data: any) => {
        const targetClassImpl = app.get(item.target.constructor);
        await targetClassImpl[item.descriptor.value.name](data);
      },
    );
  }
};

運行應用程序

運行:

docker-compose up -d # 啟動 rabbitmq
npm run dapr:api:dev # 啟動 api/gateway
npm run page-view:dev # 啟動內部微服務監聽 dapr rabbitmq 隊列

執行請求:

curl --location --request POST 'http://localhost:7001/v1.0/invoke/api/method/statistics/add-page-view' \
--header 'Content-Type: application/json' \
--data-raw '{
    "pageUrl" : "https://test.com/some-page",
    "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"
}'

感謝各位的閱讀,以上就是“怎么使用Dapr+NestJs編寫Pub及Sub裝飾器”的內容了,經過本文的學習后,相信大家對怎么使用Dapr+NestJs編寫Pub及Sub裝飾器這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广丰县| 恩施市| 抚顺市| 孟州市| 赤峰市| 扎兰屯市| 土默特右旗| 教育| 望城县| 共和县| 桂阳县| 盖州市| 偃师市| 临沧市| 清河县| 桐乡市| 开鲁县| 全椒县| 马关县| 自治县| 虹口区| 山东省| 阜阳市| 通山县| 饶平县| 德昌县| 土默特左旗| 海盐县| 宽城| 正镶白旗| 成安县| 双桥区| 上犹县| 灵璧县| 万全县| 秦皇岛市| 施秉县| 三门县| 黄骅市| 胶南市| 武汉市|