日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

目錄
  • Dapr(分布式應(yīng)用程序運(yùn)行時(shí))介紹
  • 實(shí)戰(zhàn) Dapr 的 Redis 發(fā)布/訂閱應(yīng)用
    • 1. 創(chuàng)建項(xiàng)目
    • 2. 創(chuàng)建 Dapr Placement 服務(wù)
    • 3. 創(chuàng)建 Redis Publish 服務(wù)
    • 4. 創(chuàng)建 Dapr Pub-Sub 組件
    • 5. 創(chuàng)建 Redis Dapr Sidecar
    • 6. 創(chuàng)建 NestJS Server
    • 7. 為 NestJS 訂閱服務(wù)器創(chuàng)建 Dockerfile
    • 8. 將 NestJS 訂閱服務(wù)添加到 docker-compose 文件
    • 9. 創(chuàng)建 Dapr 訂閱
    • 10. 創(chuàng)建 NestJS 服務(wù)器 Dapr Sidecar
    • 11. 測(cè)試它是否有效
    • 12. 允許 NestJS 解析 application/cloudevents+json
    • 13. 完整 docker-compose.yaml

Docker?Compose+Nestjs構(gòu)建Dapr?Redis發(fā)布訂閱分布式應(yīng)用

Dapr(分布式應(yīng)用程序運(yùn)行時(shí))介紹

Dapr 是一個(gè)可移植的、事件驅(qū)動(dòng)的運(yùn)行時(shí),它使任何開發(fā)人員能夠輕松構(gòu)建出彈性的、無狀態(tài)和有狀態(tài)的應(yīng)用程序,并可運(yùn)行在云平臺(tái)或邊緣計(jì)算中,它同時(shí)也支持多種編程語言和開發(fā)框架。

Dapr 官網(wǎng):dapr.io/

實(shí)戰(zhàn) Dapr 的 Redis 發(fā)布/訂閱應(yīng)用

1. 創(chuàng)建項(xiàng)目

首先,我們將創(chuàng)建我們的項(xiàng)目根文件夾來托管我們將在后續(xù)步驟中創(chuàng)建的所有服務(wù)。

mkdir dapr-nestjs-redis-pub-sub

2. 創(chuàng)建 Dapr Placement 服務(wù)

由于我們將創(chuàng)建多個(gè)服務(wù),我們將使用 docker-compose 來運(yùn)行這些服務(wù)。

讓我們?cè)陧?xiàng)目的根文件夾中創(chuàng)建 docker-compose.yml 文件

cd dapr-nestjs-redis-pub-sub
touch docker-compose.yml
version: "3.5"
services:
  dapr-placement:
    image: "daprio/dapr"
    command: ["./placement", "-port", "50006"]

Dapr placement 服務(wù)將負(fù)責(zé)管理 Dapr actors(我們的服務(wù))之間的所有通信。

簡(jiǎn)單來說,它負(fù)責(zé)將所有通信路由到假設(shè)接收通信的相應(yīng) actor。它充當(dāng) message broker(消息代理)。

3. 創(chuàng)建 Redis Publish 服務(wù)

讓我們繼續(xù)通過添加我們的 Redis 服務(wù)來修改我們的 docker-compose.yml 文件。

將以下代碼添加到 docker-compose.yml 的服務(wù)部分:

  redis-publisher: 
    image: redis
    restart: always
    depends_on:
      - dapr-placement

4. 創(chuàng)建 Dapr Pub-Sub 組件

創(chuàng)建一個(gè) dapr/components 文件夾。然后創(chuàng)建組件文件 redis-pubsub.yaml

mkdir -p dapr/components
cd dapr/components
touch redis-pubsub.yaml

然后打開文件并插入我們的 Dapr pub/sub 組件的詳細(xì)信息

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: redis-pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
    - name: redisHost
      value: redis-publisher:6379
    - name: redisPassword
      value: ""

redisHost 是我們的 Redis 服務(wù) redis-pub 的名稱,默認(rèn) Redis 端口為 6379

5. 創(chuàng)建 Redis Dapr Sidecar

正如前面部分反復(fù)提到的,服務(wù)直接與 Dapr 通信,而不是直接與其他服務(wù)通信。Dapr 充當(dāng)所有服務(wù)的中間人。

服務(wù)通過它們自己的 Dapr sidecar 直接與 Dapr 通信,Dapr sidecar 將通信傳遞給 Dapr placement,該 placement 再次將其傳遞給假設(shè)接收通信的服務(wù)的 Dapr sidecar

redis-dapr-sidecar 服務(wù)添加到我們的 docker-compose.yml

  redis-dapr-sidecar:
    image: "daprio/daprd:edge"
    command: [
        "./daprd",
        "-app-id",
        "redis-publisher",
        "-app-port",
        "6379",
        "-dapr-http-port",
        "5000",
        "-components-path",
        "/components",
        "-placement-host-address",
        "dapr-placement:50006"
      ]
    volumes: 
      - "./dapr/components/:/components"
    depends_on:
      - redis-publisher
    network_mode: "service:redis-publisher"

在這里,我們使用 app-idDapr sidecar 分配給 redis-publisher,同時(shí)我們使用 redis 端口 6379

我們還必須將 dapr/components(redis-pubsub.yaml) 文件夾掛載到 docker 容器中。

不要忘記聲明 dapr-http-port。這是我們的 Dapr sidecarapi,允許我們調(diào)用各種 HTTP 方法。

定義您的 dapr-http-port 很重要,因?yàn)槟鷮⒃诖颂幷{(diào)用各種 HTTP 調(diào)用/方法/請(qǐng)求。

最后,注意將 redis-dapr-sidecar 附加到 redis-publisher 網(wǎng)絡(luò)命名空間。

6. 創(chuàng)建 NestJS Server

我們將使用 NestJS 作為我們的 node server 作為我們的 Redis subscriber(訂閱者)。

進(jìn)入到項(xiàng)目文件夾

cd dapr-nestjs-redis-pub-sub

然后執(zhí)行以下命令設(shè)置一個(gè) NestJS node server:

npm i -g @nestjs/cli
nest new nest-subscriber

對(duì)于這個(gè)項(xiàng)目,我們將選擇 yarn 作為包管理器。

接下來,我們將設(shè)置一個(gè) post API 端點(diǎn)。 Dapr 將調(diào)用這個(gè)端點(diǎn),一旦它收到我們的 Redis 服務(wù)發(fā)布,它就被調(diào)用。

轉(zhuǎn)到 nest-subscriber/src/app.controller.ts

將此文件中的代碼替換為以下內(nèi)容:

import { Controller, Post, Body } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}
  @Post('/redis-publisher')
  async postRedisPub(@Body() reqBody) {
    console.log(`Redis 發(fā)布了 ${JSON.stringify(reqBody)} `);
    return `NestJS 訂閱者收到的 ${reqBody} 發(fā)布`;
  }
}

7. 為 NestJS 訂閱服務(wù)器創(chuàng)建 Dockerfile

我們將 NestJS 服務(wù)器作為 Docker 容器運(yùn)行。需要?jiǎng)?chuàng)建一個(gè) Dockerfile

cd nest-subscriber
touch Dockerfile

然后打開文件并粘貼以下代碼:

FROM node:16.13.0-alpine
WORKDIR "/app"
COPY ./nest-subscriber/package.json ./
RUN yarn install
COPY ./nest-subscriber .
RUN yarn run build
EXPOSE 3000
CMD ["yarn","start:prod"]

構(gòu)建鏡像:

docker build -f ./nest-subscriber/Dockerfile -t nest-subscriber:latest . --no-cache

8. 將 NestJS 訂閱服務(wù)添加到 docker-compose 文件

在創(chuàng)建了我們的 NestJS 服務(wù)器和 Dockerfile 之后,我們創(chuàng)建了 nest-subscriber docker 服務(wù)。

將以下內(nèi)容添加到 docker-compose.yml

  nest-subscriber:
    image: "nest-subscriber:latest"
    depends_on:
      - redis-publisher 
      - dapr-placement 
    restart: always

9. 創(chuàng)建 Dapr 訂閱

我們將為我們的 pub/sub 訂閱定義配置。

創(chuàng)建一個(gè) dapr/subscriptions 文件夾。然后創(chuàng)建組件文件 redis-subscription.yaml

mkdir -p dapr/subscriptions
cd dapr/subscriptions
touch redis-subscription.yaml

然后打開文件并插入我們的 Dapr 訂閱組件的詳細(xì)信息

apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:
  name: nest-redis-sub
spec:
  topic: nest-redis-pub-topic
  route: /redis-publisher
  pubsubname: redis-pubsub
scopes:
  - nest-subscriber

路由是發(fā)布 topic 時(shí) Dapr 將調(diào)用的 API

scope 是訂閱該 topic 的服務(wù)。

pubsubname 是 redis-pubsub,它等于我們的 redis-pubsub.yaml 文件中定義的元數(shù)據(jù)名稱。

在這個(gè)項(xiàng)目中,如果發(fā)布了一個(gè) topic nest-redis-pub-topic,Dapr 將在我們的 nest-subscriber 服務(wù)中調(diào)用 API /redis-publisher

10. 創(chuàng)建 NestJS 服務(wù)器 Dapr Sidecar

我們需要為我們的 NestJS 服務(wù)創(chuàng)建一個(gè) sidecar,就像 redis-publisher 服務(wù)一樣。

nest-subscriber-dapr-sidecar 服務(wù)添加到我們的 docker-compose.yml

  nest-subscriber-dapr-sidecar:
    image: "daprio/daprd:edge"
    command: [
        "./daprd",
        "-app-id",
        "nest-subscriber",
        "-app-port",
        "3000",      
        "-components-path",
        "/components",
        "-placement-host-address",
        "dapr-placement:50006", 
      ]
    volumes:
      - "./dapr/components/:/components" 
    depends_on:
      - nest-subscriber
    network_mode: "service:nest-subscriber"

11. 測(cè)試它是否有效

通常 Dapr Docker 容器會(huì)在 Docker 網(wǎng)絡(luò)中進(jìn)行通信。

但是為了我們做測(cè)試,我們將打開映射暴露端口 5000 到我們的本地機(jī)器 5001

  redis-publisher: 
    image: redis
    depends_on:
      - dapr-placement
    restart: always
    ports:
      - 5001:5000

然后在您的終端中執(zhí)行以下命令:

curl --location --request POST 'http://localhost:5001/v1.0/publish/redis-pubsub/nest-redis-pub-topic' \
--header 'Content-Type: application/json' \
--data-raw '{
    "hello": "world"
}'

Dapr 的優(yōu)點(diǎn)之一是它遵循特定的 URL 格式。這里我們只使用 Dapr sidecar HTTP 端口(5001),然后是版本號(hào)(v1.0),然后是 action(publish)。然后是我們 redis-pubsub.yaml 配置文件中定義的 pubsubnameredis-pubsub)和 topic(nest-redis-pub-topic)。

一旦發(fā)出 HTTP post 請(qǐng)求。我們的 NestJS 服務(wù)器應(yīng)該在 /redis-publisher 收到一個(gè) post 請(qǐng)求,這將導(dǎo)致以下日志:

Docker?Compose+Nestjs構(gòu)建Dapr?Redis發(fā)布訂閱分布式應(yīng)用

我們可以看到它正在通過 Dapr 接收 Redis 發(fā)布。但是我們的 NestJS 服務(wù)器無法正確處理消息。

只有 {} 被發(fā)布,而不是我們發(fā)布的消息。

我們將在下一步中解決這個(gè)問題。

注意:我們通過 redis-dapr-sidecar 的 dapr-http-port 調(diào)用發(fā)布服務(wù)。通常會(huì)有一個(gè)單獨(dú)的 Docker 服務(wù)(例如另一個(gè)服務(wù)器),它有自己的 Dapr sidecar,它將調(diào)用 redis 發(fā)布服務(wù)。 在這種情況下,我們將使用該 Docker 服務(wù)的 Dapr sidecar http-port。該請(qǐng)求將由 sidecar 發(fā)送到 Dapr placement 服務(wù),然后該服務(wù)將確定將請(qǐng)求轉(zhuǎn)發(fā)到的正確 Dapr sidecar

12. 允許 NestJS 解析 application/cloudevents+json

我們的 nest-subscriber-dapr-sidecar 向我們的 nest-subscriber 服務(wù)器發(fā)出的 post 請(qǐng)求的 Content-Type 將是 application/cloudevents+json 而不是 application/json

目前我們的 NestJS 服務(wù)器無法解析 application/cloudevents+json。

為了解決這個(gè)問題,我們首先需要安裝 body-parser

cd nest-subscriber
yarn add body-parser

接下來我們需要修改我們的 NestJS 服務(wù)器 main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as bodyParser from 'body-parser';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(bodyParser.json({ type: 'application/cloudevents+json' }));
  app.use(bodyParser.json());
  await app.listen(3000);
}
bootstrap();

當(dāng)我們?cè)俅伟l(fā)送 post 請(qǐng)求時(shí),我們的 NestJS 服務(wù)器將能夠處理請(qǐng)求正文并顯示以下日志:

好了,我們現(xiàn)在有一個(gè)基于 Dapr 工作的 Redis Pub/Sub 分布式應(yīng)用。

13. 完整 docker-compose.yaml

version: "3.5"
services:
  dapr-placement:
    image: "daprio/dapr"
    command: ["./placement", "-port", "50006"]
  redis-publisher: 
    image: redis
    depends_on:
      - dapr-placement
    restart: always
    ports:
      - 5001:5000
  redis-dapr-sidecar:
    image: "daprio/daprd:edge"
    command: [
        "./daprd",
        "-app-id",
        "redis-publisher",
        "-app-port",
        "6379",
        "-dapr-http-port",
        "5000",
        "-components-path",
        "/components",
        "-placement-host-address",
        "dapr-placement:50006"
      ]
    volumes: 
      - "./dapr/components/:/components"
    depends_on:
      - redis-publisher
    network_mode: "service:redis-publisher"
  nest-subscriber:
    image: "nest-subscriber:latest"
    depends_on:
      - redis-publisher 
      - dapr-placement 
    restart: always
  nest-subscriber-dapr-sidecar:
    image: "daprio/daprd:edge"
    command: [
        "./daprd",
        "-app-id",
        "nest-subscriber",
        "-app-port",
        "3000",      
        "-components-path",
        "/components",
        "-placement-host-address",
        "dapr-placement:50006", 
      ]
    volumes:
      - "./dapr/components/:/components" 
    depends_on:
      - nest-subscriber
    network_mode: "service:nest-subscriber"

源碼 github.com/Hacker-Linn…

以上就是Docker Compose+Nestjs構(gòu)建Dapr Redis發(fā)布訂閱分布式應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于Docker Nestjs構(gòu)建Redis分布式的資料請(qǐng)關(guān)注其它相關(guān)文章!

分享到:
標(biāo)簽:分布式 發(fā)布 服務(wù)器 構(gòu)建 訂閱
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定