C# 微服务:高级架构与实践
从单体架构迁移到 .NET 平台上的微服务架构,不仅仅是一个技术决策,更是迈向可扩展性和容错性的战略步骤。然而,在高级层面,开发者会遇到各种棘手问题:分布式事务、数据一致性以及复杂的编排。在本文中,我们将深入探讨有助于在 C# 中构建可靠微服务生态系统的架构模式,并介绍实用的代码示例。
1. Saga 模式:管理分布式事务
在微服务中,传统的 ACID 事务无法实现。Saga 模式通过将全局操作分解为一系列带有补偿动作的本地事务来解决数据一致性问题。
编排 vs. 协调:
- 编排 — 每个服务发布事件并对其做出响应。适用于简单场景。
- 协调 — 中央协调器管理各个步骤。推荐用于复杂的业务流程。
使用 MassTransit 在 C# 中实现协调器的示例:
public class OrderSaga : MassTransitStateMachine<OrderSagaState>{ public State Submitted { get; set; } public State PaymentPending { get; set; } public State Completed { get; set; }
public Event<OrderSubmitted> OrderSubmitted { get; set; } public Event<PaymentProcessed> PaymentProcessed { get; set; } public Event<PaymentFailed> PaymentFailed { get; set; }
public OrderSaga() { InstanceState(x => x.CurrentState);
Initially( When(OrderSubmitted) .Then(context => context.Saga.OrderId = context.Message.OrderId) .TransitionTo(Submitted) .Publish(context => new ProcessPayment { OrderId = context.Saga.OrderId, Amount = context.Message.Amount }) );
During(Submitted, When(PaymentProcessed) .TransitionTo(Completed) .Finalize(), When(PaymentFailed) .Then(context => Console.WriteLine("补偿:取消订单")) .TransitionTo(Final) ); }}这段代码演示了协调器如何管理订单的生命周期:支付成功时 Saga 结束,出错时则触发补偿。
2. CQRS 和事件溯源:职责分离
CQRS(命令查询职责分离)模式将命令(写入)和查询(读取)分离到不同的模型中。与事件溯源结合使用时,它提供了完整的审计能力和灵活性。
CQRS+ES 架构:
- 命令 — 通过事件改变状态。
- 事件 — 存储在事件存储中(例如 EventStoreDB)。
- 投影 — 构建用于快速查询的读取模型。
命令和处理器的示例:
public class CreateOrderCommand : ICommand{ public Guid OrderId { get; set; } public decimal Amount { get; set; }}
public class CreateOrderHandler : ICommandHandler<CreateOrderCommand>{ private readonly IEventStore _eventStore;
public async Task Handle(CreateOrderCommand command) { var orderCreated = new OrderCreatedEvent { OrderId = command.OrderId, Amount = command.Amount, Timestamp = DateTime.UtcNow };
await _eventStore.AppendEventAsync( $"order-{command.OrderId}", orderCreated ); }