Skip to content

消息与事件集成 ​

更新: 2026-10-16 15:20:09   字数: 0 字   时长: 0 分钟

事件驱动架构里,消息中间件通常是「最难在本地跑起来」的一环。Aspire 把它变成一行代码。

支持的中间件 ​

中间件托管集成包添加方法本地实现
RabbitMQAspire.Hosting.RabbitMQAddRabbitMQ(name)容器
KafkaAspire.Hosting.KafkaAddKafka(name)容器(KRaft)
NATSAspire.Hosting.NATSAddNats(name)容器
Azure Service BusAspire.Hosting.Azure.ServiceBusAddAzureServiceBus(name)本地模拟器或真实资源

RabbitMQ ​

csharp
var builder = DistributedApplication.CreateBuilder(args);

var rabbit = builder.AddRabbitMQ("rabbitmq")
    .WithManagementPlugin()       // 启用管理界面
    .WithDataVolume();

var api = builder.AddProject<Projects.Api>("api")
    .WithReference(rabbit)
    .WaitFor(rabbit);

builder.Build().Run();

服务端消费:

csharp
builder.AddServiceDefaults();
builder.AddRabbitMQClient("rabbitmq");

RabbitMQ 的密码与数据卷

与数据库一样,RabbitMQ 使用数据卷时必须固定密码,否则每次运行生成的新密码会让旧数据无法访问:

bash
aspire secret set Parameters:rabbitmq-password "your-password"

Kafka ​

csharp
var kafka = builder.AddKafka("kafka")
    .WithDataVolume()
    .WithKafkaUI();               // 附带 Kafka UI

var worker = builder.AddProject<Projects.Worker>("worker")
    .WithReference(kafka)
    .WaitFor(kafka);

服务端消费:

csharp
builder.AddServiceDefaults();
builder.AddKafkaProducer<string, string>("kafka");
builder.AddKafkaConsumer<string, string>("kafka", settings =>
{
    settings.Config.GroupId = "orders";
    settings.Config.AutoOffsetReset = AutoOffsetReset.Earliest;
});

NATS ​

csharp
var nats = builder.AddNats("nats");

builder.AddProject<Projects.Notifier>("notifier")
    .WithReference(nats);

Azure Service Bus ​

csharp
var serviceBus = builder.AddAzureServiceBus("messaging")
    .RunAsEmulator();             // 本地运行时使用模拟器

var queue = serviceBus.AddServiceBusQueue("orders");
var topic = serviceBus.AddServiceBusTopic("events")
    .AddServiceBusSubscription("billing");

builder.AddProject<Projects.Api>("api")
    .WithReference(queue)
    .WithReference(topic);

RunAsEmulator 的价值

RunAsEmulator() 让「本地开发」与「云端部署」使用同一套资源定义:本地跑模拟器,发布时自动切换为真实的 Azure 资源。这是 Aspire「同一模型、两种环境」理念最典型的体现。

在非 .NET 服务中使用 ​

消息中间件同样通过环境变量注入连接信息:

typescript
// Node.js(amqplib)
const url = process.env.ConnectionStrings__rabbitmq
python
# Python(pika)
import os
url = os.getenv("ConnectionStrings__rabbitmq")

完整的变量命名规则见环境变量与配置注入。

设计建议 ​

  • 用 WaitFor 而不是重试:服务启动时中间件往往还没就绪,WaitFor 能把这类竞态消除在编排层。
  • 把队列/主题当作资源声明:AddServiceBusQueue、AddServiceBusTopic 会让它们在部署时被一并创建,避免「上线忘建队列」。
  • 本地不要图省事直连生产中间件:容器化的本地实例是 Aspire 最推荐的形态。

下一步 ​

你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度