C# 微服务:从理论到 .NET 实践
微服务架构已成为构建可扩展、高容错应用程序的标准。.NET (C#) 平台提供了创建此类系统所需的所有工具:从内置的容器化支持到强大的服务间通信框架。本文将剖析在 C# 中构建微服务的关键原则,并展示实际代码示例。
1. .NET 微服务架构基础
微服务是一种将应用程序拆分为独立、松散耦合服务的方法。每个服务负责自己的业务功能,可以独立于其他服务进行开发、部署和扩展。
.NET 开发者的关键原则:
- 单一职责 (Single Responsibility) — 每个微服务解决一个任务。
- 数据独立性 — 每个服务拥有自己的数据库 (Database per Service)。
- 松散耦合 (Loose Coupling) — 服务通过 API 通信,而非共享内存。
- 自治性 — 服务可以在不停止整个系统的情况下进行修改和重新部署。
要在 C# 中创建新的微服务项目,请使用以下命令:
dotnet new webapi -n UserServicedotnet new webapi -n OrderServicedotnet new webapi -n NotificationService每个项目都有自己的 Program.cs、配置和依赖项。
2. 服务间通信:REST 和 gRPC
在 .NET 中,微服务之间的通信主要有两种方法:同步(REST/gRPC)和异步(通过消息代理)。我们将讨论这两种方法。
使用 HttpClient 的 REST API
最简单的方法是使用 HttpClientFactory 创建类型化客户端。
// 在 OrderService 服务的 Program.cs 中builder.Services.AddHttpClient<IUserServiceClient, UserServiceClient>(client =>{ client.BaseAddress = new Uri("http://userservice:5000");});
// UserServiceClient.cspublic class UserServiceClient : IUserServiceClient{ private readonly HttpClient _httpClient;
public UserServiceClient(HttpClient httpClient) { _httpClient = httpClient; }
public async Task<UserDto> GetUserAsync(int userId) { var response = await _httpClient.GetAsync($"/api/users/{userId}"); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync<UserDto>(); }}建议:使用 Polly(.NET 库)来实现重试策略和 Circuit Breaker。
用于高性能场景的 gRPC
gRPC 运行在 HTTP/2 之上,并使用 Protocol Buffers 进行序列化。这比 JSON 快得多。
// 在 user.proto 中定义服务service UserGrpcService { rpc GetUser (GetUserRequest) returns (UserResponse);}
// C# 服务器代码public class UserGrpcServiceImpl : UserGrpcService.UserGrpcServiceBase{ public override Task<UserResponse> GetUser(GetUserRequest request, ServerCallContext context) { var user = _dbContext.Users.Find(request.UserId); return Task.FromResult(new UserResponse { Id = user.Id, Name = user.Name, Email = user.Email }); }}3. 数据管理和事务
在微服务中,每个数据库仅属于一个服务。这排除了服务之间的直接 SQL 查询。在 .NET 中,处理数据的标准是 Entity Framework Core。
微服务 DbContext 配置示例
public cla