RabbitMQ 与 ASP.NET Core – 与 MassTransit 的微服务通信

作者 : 慕源网 本文共4266个字,预计阅读时间需要11分钟 发布时间: 2022-03-16 共261人阅读

在本文中,我们将看到使用 RabbitMQ 和 ASP.NET Core 进行微服务通信。我们将学习如何使用 RabbitMQ 和 MassTransit 启用微服务之间的通信。

我们将使用 MassTransit Helpers 从我们的 RabbitMQ 服务器发布/接收消息,

什么是消息代理

在进入主题 RabbitMQ 之前,我们将了解 Message Broker。Message Broker 的主要职责是在发布者和订阅者之间代理消息。

消息代理从生产者收到消息后,会将消息路由到订阅者。在解耦微服务时,消息代理模式是最有用的模式之一。

  • 生产者:负责发送消息的应用程序。
  • 消费者:负责消息的应用程序。
  • 队列:存储消息的存储

什么是 RabbitMQ?

RabbitMQ 是使用最广泛的开源消息代理服务之一。它基本上为您的应用程序提供了一个用于发送和接收消息的通用平台。这确保了我们的消息(数据)永远不会丢失并被消费者成功接收,并且它支持各种消息传递协议。

强烈推荐

海量程序代码,编程资源,无论你是小白还是大神研究借鉴别人优秀的源码产品学习成熟的专业技术强势助力帮你提高技能与技能。在此处获取,给你一个全面升级的机会。只有你更值钱,才能更赚钱

海量源码程序,学习别人的产品设计思维与技术实践

RabbitMQ 的优点

使用队列而不是直接发送数据更好,有一些原因,

  • 更高的可用性和更好的错误处理
  • 更好的可扩展性
  • 极其轻量级且非常易于部署
  • 与想要/需要的人共享数据
  • 异步处理带来更好的用户体验

RabbitMQ 设置演示

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

RabbitMQ 设置的简单演示。如果有任何消费者离线一段时间,消息仍然在 RabbitMQ 中等待消费者上线并接收消息。

支持的协议

RabbitMQ 支持多种协议,

  • AMQP 0-9-1:RabbitMQ 最初开发为 AMQP 0-9-1。AMQP 0-9-1 是一个二进制协议,定义了非常强大的消息传递语义。
  • STOMP:是一种基于文本的消息传递协议。
  • MQTT:主要针对发布/订阅场景的二进制协议。
  • AMOP 1.0
  • HTTP 和 WebSocket:虽然 HTTP 不是真正的消息传递协议,但 RabbitMQ 可以通过 HTTP 传输消息

什么是MassTransit

MassTransit 本质上帮助开发人员通过消息服务总线路由消息,并支持 RabbitMQ。MassTransit 没有具体的实现。它基本上像一个接口一样工作,是整个消息总线概念的抽象。

设置环境

对于安装 RabbitMQ,有多种方法,我推荐方法 1,即通过 docker 镜像安装,

方法一

在本地机器上安装 ErLang 和 RabbitMQ,

  • ErLang
  • RabbitMQ

方法二

或者使用管理 Web 控制台运行 docker rabbitMQ。

docker run -dit --name Myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management

启用 RabbitMQ 管理插件-仪表板

要激活 RabbitMQ 管理仪表板,请使用管理员在命令提示符下运行以下命令。

cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.17\sbin
rabbitmq-plugins enable rabbitmq_management
net stop RabbitMQ
net start RabbitMQ

现在导航到 http://localhost:15672,您可以在其中找到正在运行的 RabbitMQ 管理仪表板。

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

管理的默认用户 ID 和密码是 guest/guest。

入门

应用程序中使用的 Nuget 库。

Install-Package MassTransit
Install-Package MassTransit.AspNetCore
Install-Package MassTransit.RabbitMQ

克隆 源代码 ,您可以通过解决方案资源管理器查看项目结构。我们遍历代码。

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

CrossCuttingLayer

这是所有应用程序的通用类库。这里我们有Model(即Todo 类)和Constant(用于RabbitMQ 配置)。

下面是 Todo 和 Constant 类的代码片段。

Todo.cs

using System;

namespace CrossCuttingLayer
{
    public class Todo
    {
        public string Id { get; set; }
        public DateTime CreatedTime { get; set; } = DateTime.UtcNow;
        public string TaskDescription { get; set; }
        public bool IsCompleted { get; set; }
    }

}

RabbitMqConsts.cs

public class RabbitMqConsts
{
    public const string RabbitMqRootUri = "rabbitmq://localhost";
    public const string RabbitMqUri = "rabbitmq://localhost/todoQueue";
    public const string UserName = "guest";
    public const string Password = "guest";
    public const string NotificationServiceQueue = "notification.service";
}

Publisher 类库

我们将在我们的 Asp.net Core Web API 应用程序的 startup.cs 文件中配置 MassTransit。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{

    services.AddMassTransit(x =>
    {
        x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(config =>
        {
            config.Host(new Uri(RabbitMqConsts.RabbitMqRootUri), h =>
            {
                h.Username(RabbitMqConsts.UserName);
                h.Password(RabbitMqConsts.Password);
            });
        }));
    });
    services.AddMassTransitHostedService();
    services.AddControllers();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "Microservice.Todo.Publisher", Version = "v1" });
    });
}

在我们的发布者控制器中,我们将创建一个发布方法来发布消息。

TodoController.cs

[HttpPost]
public async Task<IActionResult> CreateTicket(Todo todoModel)
{
    if (todoModel is not null)
    {
        Uri uri = new Uri(RabbitMqConsts.RabbitMqUri);
        var endPoint = await _bus.GetSendEndpoint(uri);
        await endPoint.Send(todoModel);
        return Ok();
    }
    return BadRequest();
}

Notification类库

为了测试,我们将看到一个控制台应用程序。在下面的代码片段中,我们将在 Program.cs 文件中注册消费,并在 TodoConsumerNotification.cs 文件中编写消费方法来显示消息。

static void Main(string[] args)
{
    Console.Title = "Notification";
    var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        cfg.Host(new Uri(RabbitMqConsts.RabbitMqRootUri), h =>
        {
            h.Username(RabbitMqConsts.UserName);
            h.Password(RabbitMqConsts.Password);
        });
        cfg.ReceiveEndpoint("todoQueue", ep =>
        {
            ep.PrefetchCount = 16;
            ep.UseMessageRetry(r => r.Interval(2, 100));
            ep.Consumer<TodoConsumerNotification>();
        });

    });

    bus.StartAsync();
    Console.WriteLine("Listening for Todo registered events.. Press enter to exit");
    Console.ReadLine();
    bus.StopAsync();
}
public class TodoConsumerNotification : IConsumer<Todo>
{
    public async Task Consume(ConsumeContext<Todo> context)
    {
        await Console.Out.WriteLineAsync($"Notification sent: todo id {context.Message.Id}");
    }
}

测试我们的应用程序

方案 1

保持Publisher和Consumers/Notification作为多个启动项目运行。

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

通过 Swagger 调用 post 方法 API/todo,如下图所示,

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

输出

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

方案 2

保持 Publisher 设置为启动项目,Consumer/Notification 运行为离线。

通过 Swagger 调用 post 方法 API/todo,如下图所示,

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

您可以看到我们的 Queue 有 1 个新的 Message Ready 尚未交付。它将消息保存在内存中,直到连接消费者。

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

现在让我们的 Consumer 上线,我们可以看到消息已传递,Queue 为 0。

RabbitMQ 与 ASP.NET Core - 与 MassTransit 的微服务通信

总结

在本文中,我们介绍了消息代理、RabbitMQ、优势、使用 MassTransit 将 RabbitMQ 与 ASP.NET Core 集成。我们还构建了一个小型原型应用程序来通过 RabbitMQ 服务器发送数据。从 GitHub 下载源代码


慕源网 » RabbitMQ 与 ASP.NET Core – 与 MassTransit 的微服务通信

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录