使用 Windows 客户端的 RabbitMQ Messaging for .NET 8 Web API 第 1 部分

本文将向您展示如何在 C# 应用程序中使用 Rabbit MQ。我将解释如何使用 WEB API、Rabbit MQ 如何广播以及客户端应用程序如何使用广播消息。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

什么是 Rabbit MQ 及其功能?

RabbitMQ 是一款开源消息代理软件,可促进分布式应用程序各个组件之间的通信和数据交换。RabbitMQ 充当消息队列,管理从发送者(生产者)到接收者(消费者)的消息路由、排队和传递。

解耦应用程序 : RabbitMQ 可用于解耦应用程序,这意味着它们可以相互通信,而无需成为一个整体。
实现异步通信 : RabbitMQ 可用于实现异步通信,这意味着消息的发送和接收不会阻塞发送者或接收者。
实时流 : RabbitMQ 可用于实现实时流,这意味着消息是实时传递的。
负载平衡 : RabbitMQ 可用于在不同的消费者之间平衡消息负载。
故障转移 : RabbitMQ 可以为应用程序提供故障转移功能。这意味着,如果一个 RabbitMQ 节点发生故障,另一个节点可以接管并继续传递消息。
审计 : RabbitMQ 可用于审计消息。这意味着您可以跟踪消息的发送者和接收者,以及消息的发送和接收时间。
监控:可以监控 RabbitMQ 以跟踪其性能和健康状况。

RabbitMQ 的优势

多平台通信意味着消息以 JSON 等常用语言进行序列化/反序列化。

对于这个非常庞大的社区来说,开源可以开发和改进这些问题。

灵活、可靠、可扩展。

支持多种协议(STOMP、MQTT、RPC、HTTPS、HTTP 等)。

RabbitMQ 安装

由于我使用的是 Windows 操作系统,因此请下载适用于 Windows 的 Rabbit MQ。

RabbitMQ下载链接及安装过程

默认配置

端点地址: http://localhost:15672/

登录:访客

密码: guest

Windows 服务名称: RabbitMQ

如果未启动,则启动服务的 Windows 菜单项: RabbitMQ 服务 - 启动

创建 Dotnet core webapi 并广播消息(使用最新的 .Net 8)。

工具: Visual Studio 2022

检查最新的 dotnet 版本

打开 CMD 并输入: dotnet --version

查看所有版本: dotnet --list-SDKs

步骤1.添加新的dotnet webapi项目。

步骤2.选择框架。

步骤3.创建项目,并请检查并确认该项目是.net 8框架。

开始编码

添加NewFolder调用模型,并添加名为Product.cs的产品模型类。

namespace RabbitMQProductApi.Models

{

public class Product

{

public int ProductID { get; set; }

public string ProductName { get; set; }=string.Empty;

public string ProductDescription { get; set; }= string.Empty;

public int ProductPrice { get; set; }

public int ProductStock { get; set; }

}

}

添加NewFolder调用RabbitMQ,添加Rabbitmq接口名称同IRabbitMQProducer.cs。

namespace RabbitMQProductApi.RabbitMQ

{

public interface IRabbitMQProducer

{

public void SendProductMessage<T>(T message);

}

}

添加一个新的 RabbitMQProducer 类并使用 IRabbitMQProducer 接口。请从nuget.org安装最新的RabbitMQ.Client

using RabbitMQ.Client;

namespace RabbitMQProductApi.RabbitMQ

{

public class RabbitMQProducer : IRabbitMQProducer

{

public void SendProductMessage<T>(T message)

{

var factory=new ConnectionFactory() { HostName = "localhost" };

var connection = factory.CreateConnection();

var channel = connection.CreateModel();

channel.QueueDeclare(queue: "ProductQueue", durable: false, exclusive: false, autoDelete: false, arguments: null);

var json= System.Text.Json.JsonSerializer.Serialize(message);

var body = System.Text.Encoding.UTF8.GetBytes(json);

channel.BasicPublish(exchange:"", routingKey: "ProductQueue", basicProperties: null, body: body);

}

}

}

添加一个名为 Data 的新文件夹(用于数据库目的),请确保您已使用 nuget.org 为该项目安装了实体框架

using Microsoft.EntityFrameworkCore;

using RabbitMQProductApi.Models;

namespace RabbitMQProductApi.Data

{

public class DBContextClass:DbContext

{

protected readonly IConfiguration Configuration;

public DBContextClass(IConfiguration configuration)

{

Configuration = configuration;

}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{

optionsBuilder.UseSqlServer("Server=Machine Name;Database=ProductDB;Trusted_Connection=True;");

optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));

}

public DbSet<Product> Products { get; set; }

}

}

添加 NewFolder 服务并使用 IProductService.cs 添加服务接口名称。

namespace RabbitMQProductApi.Services

{

public interface IProductServices

{

public IEnumerable<Product> GetProducts();

public Product GetProduct(int id);

public Product AddProduct(Product product);

public Product UpdateProduct(Product product);

public bool DeleteProduct(int id);

public bool DeleteProduct(Product product);

}

}

添加 ProductService.cs 类使用 IProductServices。

namespace RabbitMQProductApi.Services

{

public class ProductServices : IProductServices

{

private readonly DBContextClass _dbContext;

public ProductServices(DBContextClass dbContext)

{

_dbContext = dbContext;

}

public IEnumerable<Product> GetProducts()

{

return _dbContext.Products.ToList();

}

public Product GetProduct(int id)

{

return _dbContext.Products.FirstOrDefault(x => x.ProductID == id);

}

public Product AddProduct(Product product)

{

var result= _dbContext.Products.Add(product);

_dbContext.SaveChanges();

return result.Entity;

}

public Product UpdateProduct(Product product)

{

var result= _dbContext.Products.Update(product);

_dbContext.SaveChanges();

return result.Entity;

}

public bool DeleteProduct(int id)

{

var result=_dbContext.Products.FirstOrDefault(x => x.ProductID == id);

if (result != null)

{

_dbContext.Products.Remove(result);

_dbContext.SaveChanges();

return true;

}

return false;

}

public bool DeleteProduct(Product product)

{

var result = _dbContext.Products.FirstOrDefault(x => x.ProductID == product.ProductID);

if (result != null)

{

_dbContext.Products.Remove(result);

_dbContext.SaveChanges();

return true;

}

else

{

return false;

}

}

}

}

添加迁移脚本,在包管理器控制台中执行以下命令。

  • add-migration "ProductMigration"

然后通过传递以下命令来更新数据库。

  • update-database

protected override void Up(MigrationBuilder migrationBuilder)

{

migrationBuilder.CreateTable(

name: "Products",

columns: table => new

{

ProductID = table.Column<int>(type: "int", nullable: false)

.Annotation("SqlServer:Identity", "1, 1"),

ProductName = table.Column<string>(type: "nvarchar(max)", nullable: false),

ProductDescription = table.Column<string>(type: "nvarchar(max)", nullable: false),

ProductPrice = table.Column<int>(type: "int", nullable: false),

ProductStock = table.Column<int>(type: "int", nullable: false)

},

constraints: table =>

{

table.PrimaryKey("PK_Products", x => x.ProductID);

});

}

/// <inheritdoc />

protected override void Down(MigrationBuilder migrationBuilder)

{

migrationBuilder.DropTable(

name: "Products");

}

现在添加 NewFolder,以控制器命名,并添加 ProductController.cs。

namespace RabbitMQProductApi.Controllers

{

Route("api/\[controller\]")

ApiController

public class ProductController : ControllerBase

{

private readonly IRabbitMQProducer _rabbitMQProducer;

private readonly ILogger<ProductController> _logger;

private readonly IProductServices _productService;

public ProductController(ILogger<ProductController> logger, IProductServices productService, IRabbitMQProducer rabbitMQProducer)

{

_logger = logger;

_productService = productService;

_rabbitMQProducer = rabbitMQProducer;

}

HttpGet("productlist")

public IActionResult GetProducts()

{

var products = _productService.GetProducts();

return Ok(products);

}

HttpGet("product/{id}")

public IActionResult GetProduct(int id)

{

var product = _productService.GetProduct(id);

if (product == null)

{

return NotFound();

}

return Ok(product);

}

HttpPost("addproduct")

public IActionResult AddProduct([FromBody] Product product)

{

var newProduct = _productService.AddProduct(product);

_rabbitMQProducer.SendProductMessage(newProduct);

return Ok(newProduct);

//return CreatedAtRoute("GetProduct", new { id = newProduct.ProductID }, newProduct);

}

HttpPut("updateproduct")

public IActionResult UpdateProduct([FromBody] Product product)

{

var updatedProduct = _productService.UpdateProduct(product);

return Ok(updatedProduct);

}

HttpDelete("deleteproduct/{id}")

public IActionResult DeleteProduct(int id)

{

var result = _productService.DeleteProduct(id);

if (result)

{

return Ok();

}

return NotFound();

}

HttpDelete("deleteproduct")

public IActionResult DeleteProduct([FromBody]Product product)

{

var result = _productService.DeleteProduct(product);

if (result)

{

return Ok();

}

return NotFound();

}

}

使用下面的代码更新 Program.cs 类。

namespace RabbitMQProductApi

{

public class Program

{

public static void Main(string[] args)

{

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddScoped<IProductServices, ProductServices>();

builder.Services.AddDbContext<DBContextClass>();

builder.Services.AddScoped<IRabbitMQProducer, RabbitMQProducer>();

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.

if (app.Environment.IsDevelopment())

{

app.UseSwagger();

app.UseSwaggerUI();

}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

}

}

}

现在构建项目并在本地机器上运行它。

将项目添加到产品数据库中。

请检查数据库。

完毕

下一部分将会看到如何在客户端应用程序中使用消息。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
用户8307196840822 小时前
Spring ApplicationEventPublisher 异步处理与消息队列全面解析
spring boot·rabbitmq
山沐与山5 小时前
【设计模式】Python观察者模式:用RabbitMQ+Celery实现事件驱动
python·观察者模式·设计模式·rabbitmq
Wang's Blog5 小时前
RabbitMQ: 构建高可靠消息系统之定时重发、消费重试与死信告警全解析
分布式·rabbitmq
csdn_aspnet20 小时前
ASP.NET Core:创建并验证文档上的数字签名
.netcore·数字签名
WebRuntime21 小时前
问世间,exe是何物?直教AI沉默、Web寡言(4)
javascript·c#·.net·web
缺点内向1 天前
如何在 C# 中将 Word 文档转换为 EMF(增强型图元文件)
开发语言·c#·word·.net
zq322061241 天前
若依VUE和NET8的意框架部署到IIS
vue·.net