Dapr PubSub 与 dotnet SDK

     2023-04-13     120

关键词:

【中文标题】Dapr PubSub 与 dotnet SDK【英文标题】:Dapr PubSub with dotnet SDK 【发布时间】:2021-12-10 19:09:46 【问题描述】:

我正在尝试使用 dotnet 运行基本的 Dapr 设置。我关注了文档和示例项目,但现在没有运气。

我用 net5.0 创建了一个简单的 dotnet Web API 应用程序。 API 有一个控制器和三对 get/post 端点。每对都针对特定的 pub-sub 提供者(nats、rabbit、Redis)。

using System.Runtime.Serialization;
using System.Threading.Tasks;
using Dapr;
using Dapr.Client;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Request.Body.Peeker;
namespace live

    [ApiController]
    [Route("/")]
    public class HomeController : ControllerBase
    
        private readonly ILogger<HomeController> logger;
        private readonly DaprClient dapr;
        public HomeController(ILogger<HomeController> logger, DaprClient dapr)
        
            this.dapr = dapr;
            this.logger = logger;

        
        [HttpGet]
        public async Task<ActionResult> Produce()
        
            var message = new Message()  Payload = "Nats Jetstream poruka" ;
            await this.dapr.PublishEventAsync<Message>("nats-pubsub", "orders.new", message);

            return Ok("Sent!");
        


        [HttpPost("nats/subscribe")]        
        [Topic("nats-pubsub", "orders.new")]
        public async Task<ActionResult> SubscribeAsync(Message message)
                  
            
            this.logger.LogInformation("Message received: " + JsonConvert.SerializeObject(message));
            return Ok("Received!");
        


        [HttpGet("rabbit")]
        public async Task<ActionResult> ProduceRabbit()
        
            var message = new Message()  Payload = "Rabbit MQ poruka" ;
            await this.dapr.PublishEventAsync<Message>("rabbit-pubsub", "orders.new", message);

            return Ok("Sent!");
        


        //[HttpPost("rabbit/subscribe")]
        [Route("rabbit/subscribe")]
        [HttpPost()]
        [Topic("rabbit-pubsub", "orders.new")]
        public async Task<ActionResult> SubscribeRabbitAsync(Message message)
                    
            this.logger.LogInformation("ssage received: " + JsonConvert.SerializeObject(message));
            return Ok("Received!");
        


        [HttpGet("redis")]
        public async Task<ActionResult> ProduceRedis()
        
            var message = new Message()  Payload = "Redis poruka" ;
            await this.dapr.PublishEventAsync<Message>("redis-pubsub", "orders.new", message);

            return Ok("Sent!");
        


        [HttpPost("redis/subscribe")]
        [Topic("redis-pubsub", "orders.new")]
        public async Task<ActionResult> SubscribeRedisAsync(Message message)
        
            this.logger.LogInformation("Message received: " + JsonConvert.SerializeObject(message));
            return Ok("Received!");
        
    

    
    public class Message
    
        public string Payload  get; set; 
    

应用程序的 Startup.cs 看起来像

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Live

    public class Startup
            
        public void ConfigureServices(IServiceCollection services)
        
            services.AddControllers()
                .AddNewtonsoftJson()
                .AddDapr();
            services.AddHttpClient();
            services.AddDaprClient(); //Really no need for this
        
                
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            

            app.UseRouting();
            //app.UseCloudEvents();

            app.UseEndpoints(endpoints =>
            
                endpoints.MapSubscribeHandler();
                endpoints.MapControllers();
            );
        
    

Dapr 配置

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: redis-pubsub
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6380
  - name: redisPassword
    value: ""

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: nats-pubsub
  namespace: default
spec:
  type: pubsub.jetstream
  version: v1
  metadata:
  - name: natsURL
    value: "nats://localhost:4222"
  - name: name
    value: "alan"
  - name: durableName
    value: "conversation-durable"
  - name: queueGroupName
    value: "conversation-group"
  # - name: startSequence
  #   value: 1
  # - name: startTime # in Unix format
  #   value: 1630349391
  # - name: deliverAll
  #   value: false
  # - name: flowControl
  #   value: false

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: rabbit-pubsub
  namespace: default
spec:
  type: pubsub.rabbitmq
  version: v1
  metadata:
  - name: host
    value: "amqp://localhost:5672"

我的 docker-compose 文件

version: '3.4'

services: 
  nats:
    container_name: "Nats"
    image: nats
    command: [ "-js", "-m", "8222", "-D", "-V" ]
    ports:
      - "4222:4222"
      - "8222:8222"
      - "6222:6222"

  rabbitmq:
    image: rabbitmq:3-management-alpine
    ports:
      - "5672:5672"
      - "15672:15672"

  postgres:
    container_name: "PostgreSQL"
    image: postgres
    environment:
      - POSTGRES_PASSWORD=rotring123
      - PGDATA=/var/lib/postgresql/data/pgdata
    # volumes:
    #   - .\\docker-volumes\\postgreSQL:/var/lib/postgresql/data
    ports:
      - "8081:8080"
      - "5432:5432"

  redis:
    container_name: Redis
    image: redis
    ports:
      - "6380:6379"
    # volumes:
    #   - .\\docker-volumes\\redis:/usr/local/etc/redis

  # dapr-placement:
  #   container_name: Dapr-service-descovery
  #   image: "daprio/dapr:1.0.0"
  #   command: ["./placement", "-port", "50000", "-log-level", "debug"]
  #   ports:
  #     - "50000:50000"

  # zipkin:
  #   image: openzipkin/zipkin-slim
  #   ports:
  #     - "5411:9411"

我正在使用命令 dapr run -a live -p 5226 dotnet run 从 CLI 启动应用程序

应用程序已启动,当我去获取端点消息时已发送。我可以确认消息已发送到消息代理并且有效负载正常。此外,Dapr 调用我的 post 端点(每个 rabbit、nats 和 redis),但在方法参数中,我收到了 Payload 类的 Payload 属性的 null 值。

我遵循了 TrafficControll 示例,在我看来一切都设置正确。

Dapr 运行时版本:1.4.3 以下是日志截图:https://prnt.sc/1xa8s14

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

[FromBody] 属性添加到操作方法参数中。

例如:

public async Task<ActionResult> SubscribeAsync([FromBody] Message message)

【讨论】:

您好,很抱歉回复晚了。我设法让这个工作,问题出在app.UseCloudEvents()。属性ApiController 也是必需的。如果我设置[FromBody] 属性,它就不起作用。据我了解,Dapr 不会以这种方式发送有效负载。为了确定,我还在运行之前从 nats 中删除了所有消费者。我也在 dapr discord 频道上问过这个问题,所以你可以看到我的问题和讨论there。 [FromBody] 应该可以工作。 link 在“Dapr 发布和订阅构建块”下显示了一个示例。你有对Dapr.AspNetCore NuGet 包的引用吗? 嗯,我在文档中找不到它:)。 prnt.sc/1z4o08g Pub/Sub 部分 - 使用 Dapr .NET SDK - 第 70 页。在 PDF 中搜索这句话:“要发布消息,DaprClient 会公开 PublishEventAsync 方法” 它对我也不起作用,可以将数据发布到服务总线但不会触发控制器订阅方法

与 VS 2017 dotnet-sdk-2.1.4 和 .NET Core 2.0.6 .NET Core SDK 2.1.101 混淆

】与VS2017dotnet-sdk-2.1.4和.NETCore2.0.6.NETCoreSDK2.1.101混淆【英文标题】:ConfusionwithVS2017dotnet-sdk-2.1.4and.NETCore2.0.6.NETCoreSDK2.1.101【发布时间】:2018-03-2016:54:10【问题描述】:我想以最新的.NetCore2.0.6为目标在VisualStudio2017中构建控制台应... 查看详情

贝宝 C# 商人-SDK-dotnet

】贝宝C#商人-SDK-dotnet【英文标题】:PayPalC#merchant-sdk-dotnet【发布时间】:2017-07-1419:04:00【问题描述】:我想通过api下载PayPal活动。(即,只需获得一个月收款的报告)。我们将WooCommerce与PayPalExpressCheckout结合使用。它似乎使用了... 查看详情

带有 apache 梁 python sdk 的 Pubsub 模拟器

】带有apache梁pythonsdk的Pubsub模拟器【英文标题】:Pubsubemulatorwithapachebeampythonsdk【发布时间】:2021-01-2016:49:06【问题描述】:是否可以将在pubsubemulator中创建的主题作为数据源与apachebeampython中的直接运行器一起使用?我已经设置... 查看详情

dapr+.net实战绑定(代码片段)

...交互使代码不受SDK或外部库的强耦合处理重试和故障恢复Dapr提供了很多支持的绑定,请见绑定。绑定分为输入绑定与输出绑定,输入绑定是监听外部事件,触发业务 查看详情

dapr+.netcore实战状态管理(代码片段)

...重试 与数据存储交互 时发生的任何短期暂时性错误。Dapr状态管理解决了这些难题。它简化了跟踪状态,而无需依赖关系或第三方存储SDK 上的学习曲线。工作原理应用程序与Da 查看详情

“处理组件 pubsub 错误:组件 pubsub 的初始化超时超过 5 秒”

】“处理组件pubsub错误:组件pubsub的初始化超时超过5秒”【英文标题】:"processcomponentpubsuberror:inittimeoutforcomponentpubsubexceededafter5s"【发布时间】:2021-07-0707:56:32【问题描述】:我在我的.net核心微服务中使用DAPR和Docker。我... 查看详情

手把手教你学dapr-2.必须知道的概念(代码片段)

Sidecar边车DaprAPI提供Http和gRPC两种通讯方式。运行方式则可以是容器也可以是进程(Windows开发推荐使用SelfHosted,后续会解释)。这样的好处是与运行环境无关,且独立运行不需要应用包含Dapr运行时的代码。只需要... 查看详情

无法为 python SDK appengine / psutil 导入 pubsub

】无法为pythonSDKappengine/psutil导入pubsub【英文标题】:can\'timportpubsubforpythonSDKappengine/psutil【发布时间】:2018-05-2713:04:37【问题描述】:在我使用pubsub和GoogleAppEngine时,我在尝试导入pubsub_v1时遇到了psutil的一些问题。当我单独运行P... 查看详情

使用 GCloud 模拟器的 Google Cloud PubSub V1

】使用GCloud模拟器的GoogleCloudPubSubV1【英文标题】:GoogleCloudPubSubV1usingGCloudEmulator【发布时间】:2019-03-1411:09:45【问题描述】:我正在与GoogleDocs争夺使用PubSub模拟器通过.NET设置CloudPubSub。https://cloud.google.com/dotnet/docs/getting-started/usi... 查看详情

.NET SDK 5.0 版已成功安装,但 dotnet --list-sdks 仅显示 3.1.415 [/snap/dotnet-sdk/148/sdk]

】.NETSDK5.0版已成功安装,但dotnet--list-sdks仅显示3.1.415[/snap/dotnet-sdk/148/sdk]【英文标题】:.NETSDKversion5.0issuccessfullyinstalledbutdotnet--list-sdksshowonly3.1.415[/snap/dotnet-sdk/148/sdk]【发布时间】:2022-01-0817:18:04【问题描述】:我想在Ubunt 查看详情

dapr+.net实战secrets(代码片段)

什么是Secrets应用程序通常会通过使用专用的存储来存储敏感信息,如连接字符串、密钥等。通常这需要建立一个密钥存储,如AzureKeyVault、Hashicorp等,并在那里存储应用程序级别的密钥。要访问这些密钥存储,应... 查看详情

无法在 mac 上安装 dotnet sdk

】无法在mac上安装dotnetsdk【英文标题】:Cannotinstalldotnetsdkonmac【发布时间】:2022-01-1320:51:15【问题描述】:我已经从https://dotnet.microsoft.com/download/download安装了dotnetsdk安装后我在终端上运行:dotnet--version我得到:zsh:commandnotfound:dot... 查看详情

dapr牵手.net学习笔记:开篇

dapr,一个为分布式应用程序的运行时,为开发者在对接分布式组件时,提供了便利。使用dapr带来的好处可扩展性,因为它是通过sidecar的理概念来集成其他运行时的。同时dapr还提供了多种语言的SDK。关于dapr更多... 查看详情

使用 Python SDK 进行数据流流式处理:将 PubSub 消息转换为 BigQuery 输出

】使用PythonSDK进行数据流流式处理:将PubSub消息转换为BigQuery输出【英文标题】:DataflowStreamingusingPythonSDK:TransformforPubSubMessagestoBigQueryOutput【发布时间】:2018-04-0122:11:00【问题描述】:我正在尝试使用数据流来读取pubsub消息并将... 查看详情

通过 azure-sdk-dotnet 查询 Azure 应用密码的过期日期

】通过azure-sdk-dotnet查询Azure应用密码的过期日期【英文标题】:QueryexpirationdateofAzureappsecretviaazure-sdk-dotnet【发布时间】:2022-01-1218:22:26【问题描述】:我有一个dotnet-core应用程序,它使用C#azure-sdk.net通过应用程序机密连接到Azure... 查看详情

无法在 Ubuntu 16.04 服务器上安装 dotnet-sdk2.1

】无法在Ubuntu16.04服务器上安装dotnet-sdk2.1【英文标题】:Cannotinstalldotnet-sdk2.1onUbuntu16.04server【发布时间】:2018-12-0803:15:02【问题描述】:我今天尝试在我的Ubuntu16.04服务器上安装dotnet-sdk2.1.101,但出现以下错误:“dotnet-sdk-2.1.101:D... 查看详情

Spring 集成 pubsub 与 Spring amqp RabbitMQ pubsub

】Spring集成pubsub与SpringamqpRabbitMQpubsub【英文标题】:SpringintegrationpubsubvsSpringamqpRabbitMQpubsub【发布时间】:2015-12-2402:24:51【问题描述】:我正在开发一个MicroBlogspringmvchibernate应用程序。我需要实现像twitter这样的发布订阅功能。我... 查看详情

event与pubsub

如题,这两基本是一个东西,Event是绑在对象上的,PubSub针对全局。使用Event完全可以代替PubSub的工作。我就这么干过,比如 exportdefaultnewMiku.Event() 所以说只要妹妹(Event)就可以了,并不需要姐姐(PubSub)!一个Event对象co... 查看详情