Dapr+NestJs编写Pub及Sub装饰器实战示例

 更新时间:2022年08月01日 10:14:46   作者:为少  
这篇文章主要为大家介绍了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 现在已弃用。 请参阅#259 了解更多信息。

github.com/dapr/js-sdk…

结构

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的资料请关注脚本之家其它相关文章!

相关文章

  • nodejs连接mysql数据库简单封装示例-mysql模块

    nodejs连接mysql数据库简单封装示例-mysql模块

    本篇文章主要介绍了nodejs连接mysql数据库简单封装(mysql模块),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Node.js中Mongodb数据库操作方法(最新推荐)

    Node.js中Mongodb数据库操作方法(最新推荐)

    MongoDB是一种基于分布式文件存储的NoSQL数据库,它允许存储和检索大量结构化数据,MongoDB的核心概念包括数据库、集合和文档,每个集合可以包含多个文档,每个文档是一个键值对的集合,本文介绍Node.js Mongodb数据库操作方法,感兴趣的朋友一起看看吧
    2024-12-12
  • Node.js使用MongoDB的ObjectId作为查询条件的方法

    Node.js使用MongoDB的ObjectId作为查询条件的方法

    这篇文章主要介绍了Node.js使用MongoDB的ObjectId作为查询条件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 使用NVM管理Node版本的详细教程

    使用NVM管理Node版本的详细教程

    Node Version Manager(NVM)是一个非常流行的工具,用于在同一个系统上管理多个 Node.js 版本,NVM 允许你安装、使用和切换不同的 Node.js 版本,这对于开发人员来说非常有用,本文给大家介绍了使用NVM管理Node版本的详细教程,需要的朋友可以参考下
    2025-02-02
  • 提升node.js中使用redis的性能遇到的问题及解决方法

    提升node.js中使用redis的性能遇到的问题及解决方法

    本文中提到的node redis client采用的基于node-redis封装的二方包,因此问题排查也基于node-redis这个模块。接下来通过本文给大家分享提升node.js中使用redis的性能
    2018-10-10
  • node管理统计文件大小并显示目录磁盘空间状态从零实现

    node管理统计文件大小并显示目录磁盘空间状态从零实现

    这篇文章主要为大家介绍了node管理统计文件大小并显示目录磁盘空间状态的从零实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • node.js实现上传文件功能

    node.js实现上传文件功能

    这篇文章主要为大家详细介绍了node.js实现上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Node.js 中使用fetch 按JSON格式发post请求的问题解析

    Node.js 中使用fetch 按JSON格式发post请求的问题解析

    最近在测试一个api,可以用curl命令直接访问,指定header相关配置,request body(JSON),成功后返回一个JSON,这篇文章主要介绍了Node.js 中使用fetch 按JSON格式发post请求,需要的朋友可以参考下
    2023-04-04
  • Node.js中的EventEmitter类使用小结

    Node.js中的EventEmitter类使用小结

    EventEmitter 是 Node.js 中的一个核心模块,它提供了一种实现事件驱动编程的机制,它是一个基于观察者模式的类,用于在应用程序中处理事件和触发事件,这篇文章主要介绍了Node.js中的EventEmitter类介绍,需要的朋友可以参考下
    2023-12-12
  • node.js中的fs.lchmod方法使用说明

    node.js中的fs.lchmod方法使用说明

    这篇文章主要介绍了node.js中的fs.lchmod方法使用说明,本文介绍了fs.lchmod的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12

最新评论