C# 微服务简介
\n微服务架构已成为构建复杂、可扩展且高可用应用程序的事实标准。与所有代码都整合在单个进程中的单体架构不同,微服务将系统拆分为多个小型、可独立部署的服务。.NET (C#) 平台提供了创建专业微服务所需的所有工具:从用于 Web API 的 ASP.NET Core,到用于队列、容器化和编排的库。
\n在本文中,我们将探讨从架构设计到使用 C# 实际实现微服务的完整路径,并附有代码示例。
\n\n1. 微服务架构基础
\n原则与反模式
\n在编写代码之前,理解关键原则很重要:
\n- \n
- 单一职责 (SRP): 每个服务负责一个业务功能(例如,订单服务、支付服务)。 \n
- 松耦合: 服务通过网络(HTTP、gRPC、队列)进行通信,并且不了解彼此的内部实现。 \n
- 独立部署: 您可以更新一个服务而无需停止其他服务。 \n
- 数据去中心化: 每个服务拥有自己的数据库(每个服务一个数据库)。 \n
应避免的反模式: 过于细粒度的服务(纳米服务)、共享数据库、同步调用链(聊天式通信)。
\n\n服务间通信
\n对于 C# 微服务之间的交互,使用:
\n- \n
- 同步: REST API (HTTP/JSON) 或 gRPC(二进制协议,速度更快)。 \n
- 异步: 消息队列(RabbitMQ、Azure Service Bus、Kafka)——这是实现松耦合的首选方式。 \n
2. 使用 C# 实际实现微服务
\n示例:订单管理服务
\n我们将使用 ASP.NET Core 8 创建一个简单的微服务。使用整洁架构来分离各层。
\n\n步骤 1:项目和结构
\ndotnet new webapi -n OrderService\ncd OrderService\n创建文件夹:Controllers、Models、Services、Data。
步骤 2:数据模型
\n// Models/Order.cs\npublic class Order\n{\n public int Id { get; set; }\n public string CustomerName { get; set; }\n public decimal TotalAmount { get; set; }\n public DateTime CreatedAt { get; set; }\n}\n\n步骤 3:数据库上下文(Entity Framework Core)
\n// Data/OrderDbContext.cs\npublic class OrderDbContext : DbContext\n{\n public OrderDbContext(DbContextOptions<OrderDbContext> options) : base(options) { }\n public DbSet<Order> Orders { get; set; }\n}\n\n步骤 4:服务层
\n// Services/IOrderService.cs\npublic interface IOrderService\n{\n Task<Order> CreateOrderAsync(Order order);\n Task<List<Order>> GetAllOrdersAsync();\n}\n\n// Services/OrderService.cs\npublic class OrderService : IOrderService\n{\n private readonly OrderDbContext _context;\n public OrderService(OrderDbContext context)\n {\n _context = context;\n }\n\n public async Task<Order> CreateOrderAsync(Order order)\n {\n _context.Orders.Add(order);\n await _context.SaveChangesAsync();\n return order;\n }\n\n public async Task<List<Order>> GetAllOrdersAsync()\n {\n return await _context.Orders.ToListAsync();\n }\n}\n\n步骤 5:控制器
\n// Controllers/OrdersController.cs\n[ApiController]\n[Route("api/[controller]")]\npublic class OrdersController : ControllerBase\n{\n private readonly IOrderService _orderService;\n public OrdersController(IOrderService orderService)\n {\n _orderService = orderService;\n }\n\