在.NET生态中,ASP.NET Core是构建微服务分布式系统的核心框架,它支持跨平台部署、自带依赖注入容器、具备高性能的请求处理能力,能够很好地适配微服务架构的轻量化和独立部署要求。微服务架构的核心是将单体应用拆分为多个独立运行、职责单一的服务,各服务之间通过轻量级通信机制交互,共同完成业务功能。

微服务拆分的核心原则
拆分微服务时需要遵循单一职责原则,每个服务只负责一个独立的业务领域,比如订单服务只处理订单相关的创建、查询、取消逻辑,用户服务只处理用户注册、登录、信息修改逻辑。同时要避免拆分过细导致服务间调用链路过长,增加系统复杂度。常见的拆分维度包括业务领域、数据边界、团队职责等。
基于ASP.NET Core创建基础微服务
首先创建一个ASP.NET Core Web API项目作为单个微服务的基础,项目默认已经包含了依赖注入、中间件管道等核心能力,我们只需要根据业务需求添加对应的控制器和逻辑即可。
// 订单服务控制器示例
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
// 模拟订单数据
private static readonly List<Order> _orders = new()
{
new Order { Id = 1, UserId = 1001, ProductName = "笔记本电脑", Amount = 5999 },
new Order { Id = 2, UserId = 1002, ProductName = "无线鼠标", Amount = 199 }
};
// 获取所有订单
[HttpGet]
public ActionResult<List<Order>> GetAllOrders()
{
return Ok(_orders);
}
// 根据ID获取订单
[HttpGet("{id}")]
public ActionResult<Order> GetOrderById(int id)
{
var order = _orders.FirstOrDefault(o => o.Id == id);
if (order == null)
{
return NotFound();
}
return Ok(order);
}
}
// 订单实体类
public class Order
{
public int Id { get; set; }
public int UserId { get; set; }
public string ProductName { get; set; }
public decimal Amount { get; set; }
}
微服务间的通信方式
微服务之间常用的通信方式分为同步通信和异步通信两种,同步通信一般使用HTTP/REST或者gRPC,异步通信一般使用消息队列。
同步通信:HTTP客户端调用
ASP.NET Core中可以使用HttpClientFactory来管理HTTP客户端,避免端口耗尽问题,实现服务间的同步调用。比如订单服务需要获取用户信息时,可以调用用户服务的接口。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
// 注册HttpClientFactory,配置用户服务的基地址
builder.Services.AddHttpClient("UserService", client =>
{
client.BaseAddress = new Uri("http://localhost:5001"); // 用户服务运行地址
});
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();
在订单服务的控制器中注入IHttpClientFactory即可调用用户服务:
[ApiController]
[Route("api/[controller]")]
public class OrdersController : ControllerBase
{
private readonly IHttpClientFactory _httpClientFactory;
public OrdersController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet("with-user/{orderId}")]
public async Task<ActionResult> GetOrderWithUser(int orderId)
{
// 获取订单信息
var order = _orders.FirstOrDefault(o => o.Id == orderId);
if (order == null)
{
return NotFound();
}
// 调用用户服务获取用户信息
var client = _httpClientFactory.CreateClient("UserService");
var userResponse = await client.GetAsync($"/api/users/{order.UserId}");
if (!userResponse.IsSuccessStatusCode)
{
return StatusCode((int)userResponse.StatusCode, "获取用户信息失败");
}
var user = await userResponse.Content.ReadFromJsonAsync<User>();
return Ok(new { Order = order, User = user });
}
}
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}
异步通信:消息队列集成
对于不需要实时返回结果的场景,比如订单创建后发送通知、更新库存,可以使用消息队列实现异步通信,常用的消息队列有RabbitMQ、Kafka等。ASP.NET Core可以通过对应的客户端库集成消息队列,实现事件的发布和订阅。
分布式系统的核心治理组件
微服务分布式系统还需要配套的服务治理组件,保障系统的稳定性和可观测性。
- 服务注册与发现:使用Consul、Nacos等组件,服务启动时注册自身地址,调用方通过注册中心获取可用服务地址,避免硬编码服务地址。
- API网关:使用Ocelot等ASP.NET Core生态的网关组件,统一处理请求路由、认证授权、限流熔断、日志收集等功能,作为所有外部请求的统一入口。
- 分布式链路追踪:使用SkyWalking、Jaeger等工具,追踪请求在各个微服务之间的调用链路,快速定位性能瓶颈和故障点。
- 分布式配置中心:使用Apollo、Nacos等组件,统一管理所有微服务的配置,实现配置的动态更新,不需要重启服务即可生效。
数据一致性处理
微服务架构下每个服务都有自己的数据库,跨服务的数据一致性无法使用本地事务保证,一般采用最终一致性方案,比如基于消息队列的事务消息、TCC补偿事务等。例如订单服务创建订单后,发送消息到消息队列,库存服务订阅消息扣减库存,如果扣减失败则发送补偿消息回滚订单状态。
注意:微服务架构并不是所有场景都适用,对于业务简单、团队规模小的项目,使用单体架构反而能降低开发和运维成本,需要根据实际业务场景选择合适的架构。
ASP.NET_Core微服务架构分布式系统.NET修改时间:2026-07-18 03:57:26