C# (.NET) 微服务:从理论到实践
在现代软件开发中,微服务架构已成为构建可扩展和容错系统的标准。.NET 平台提供了在 C# 中创建可靠微服务所需的所有工具。在本文中,我们将探讨架构的关键原则、实际代码示例以及最佳实践,帮助您开始使用 C# 构建微服务。
1. .NET 微服务架构基础
微服务是一种开发方法,将应用程序拆分为小型、独立的服务,每个服务负责其自身的业务功能。在 .NET 生态系统中,使用 ASP.NET Core(一个轻量级、跨平台的框架)来实现这一点。
C# 微服务的关键原则:
- 独立部署 — 每个服务都可以在不停止其他服务的情况下进行更新。
- 松耦合 — 服务通过 API(REST、gRPC)或消息队列进行通信。
- 自有数据库 — 每个微服务拥有自己的数据(Database per Service)。
- 容错性 — 一个服务的故障不应阻塞整个系统。
让我们从创建一个简单的 C# 微服务开始。使用 ASP.NET Core Web API 模板。
// 创建新的微服务项目dotnet new webapi -n OrderServicecd OrderService
// 简单控制器示例[ApiController][Route("api/[controller]")]public class OrdersController : ControllerBase{ private readonly IOrderRepository _repository;
public OrdersController(IOrderRepository repository) { _repository = repository; }
[HttpGet("{id}")] public async Task<IActionResult> GetOrder(int id) { var order = await _repository.GetByIdAsync(id); if (order == null) return NotFound(); return Ok(order); }
[HttpPost] public async Task<IActionResult> CreateOrder(OrderDto orderDto) { var order = new Order(orderDto.CustomerId, orderDto.TotalAmount); await _repository.AddAsync(order); return CreatedAtAction(nameof(GetOrder), new { id = order.Id }, order); }}2. 服务间通信:REST、gRPC 和队列
微服务需要相互通信。在 .NET 中有三种主要方法:
REST API (HTTP)
最简单且最常用的方式。使用带有工厂的 HttpClient 来正确管理连接。
// 通过 HttpClient 调用另一个微服务的示例public class InventoryServiceClient{ private readonly HttpClient _httpClient;
public InventoryServiceClient(HttpClient httpClient) { _httpClient = httpClient; }
public async Task<bool> CheckStockAsync(int productId, int quantity) { var response = await _httpClient.GetAsync( $"/api/inventory/check?productId={productId}&quantity={quantity}"); return response.IsSuccessStatusCode; }}
// 在 Program.cs 中注册builder.Services.AddHttpClient<InventoryServiceClient>(client =>{ client.BaseAddress = new Uri("http://inventory-service:5001");});gRPC
对于高性能的同步通信,请使用 gRPC。它基于 HTTP/2 和 Protocol Buffers。
// 在 .proto 文件中定义服务syntax = "proto3";
service OrderProcessor { rpc ProcessOrder (OrderRequest) returns (OrderResponse);}
message OrderRequest { int32 order_id = 1; string customer_email = 2;}
message OrderResponse { bool success = 1; string message = 2;}
// C# 服务端部分public class OrderProcessorService : OrderProcessor.OrderProcessorB
```