欢迎光临
我们一直在努力

使用 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();         }     } }

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

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

请检查数据库。

完毕

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

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

赞(0)
未经允许不得转载:171主机测评 » 使用 Windows 客户端的 RabbitMQ Messaging for .NET 8 Web API 第 1 部分
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址