在微服务架构中,API网关承担着请求路由、流量控制、权限校验等核心职责,Ocelot作为C#生态中成熟的API网关库,除了基础的路由转发功能,还支持很多高级特性,能够满足复杂业务场景的需求。

Ocelot高级配置核心特性
1. 请求聚合配置
请求聚合可以让网关一次性合并多个下游服务的响应,减少前端请求次数。在ocelot.json中配置聚合路由即可实现:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/user/{id}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 5001
}
],
"UpstreamPathTemplate": "/user/{id}",
"UpstreamHttpMethod": [ "Get" ],
"Key": "User"
},
{
"DownstreamPathTemplate": "/api/order/{userid}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 5002
}
],
"UpstreamPathTemplate": "/order/{userid}",
"UpstreamHttpMethod": [ "Get" ],
"Key": "Order"
}
],
"Aggregates": [
{
"RouteKeys": [ "User", "Order" ],
"UpstreamPathTemplate": "/aggregate/{userid}"
}
]
}
上述配置中,访问/aggregate/1时,网关会同时请求用户服务和订单服务,将两个响应合并后返回给前端。
2. 限流与熔断配置
Ocelot内置了限流和熔断功能,通过配置可以限制单个客户端的请求频率,避免下游服务被突发流量击垮:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/product/{id}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 5003
}
],
"UpstreamPathTemplate": "/product/{id}",
"UpstreamHttpMethod": [ "Get" ],
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 10
},
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 3,
"DurationOfBreak": 5000,
"TimeoutValue": 2000
}
}
]
}
配置中RateLimitOptions表示每秒最多允许10次请求,QoSOptions表示连续3次异常后熔断5秒,单次请求超时时间为2秒。
3. 集成服务发现
在微服务场景中,服务实例地址可能动态变化,Ocelot可以集成Consul等服务发现组件,自动获取下游服务地址:
首先安装Consul和Ocelot.Provider.Consul包,然后在Program.cs中配置:
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
using Ocelot.Provider.Consul;
var builder = WebApplication.CreateBuilder(args);
// 添加Ocelot配置,指定ocelot.json路径
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
// 添加Ocelot服务和Consul服务发现
builder.Services.AddOcelot().AddConsul();
var app = builder.Build();
// 使用Ocelot中间件
await app.UseOcelot();
app.Run();
对应的ocelot.json配置如下,无需指定固定的下游服务端口:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/stock/{id}",
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/stock/{id}",
"UpstreamHttpMethod": [ "Get" ],
"ServiceName": "stock-service",
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Scheme": "http",
"Host": "127.0.0.1",
"Port": 8500,
"Type": "Consul"
}
}
}
4. 自定义中间件扩展
如果内置功能无法满足需求,可以编写自定义中间件注入到Ocelot的请求管道中,比如实现全局请求日志、自定义权限校验等:
using Ocelot.Middleware;
using System.Threading.Tasks;
public class CustomRequestMiddleware : OcelotMiddleware
{
private readonly RequestDelegate _next;
public CustomRequestMiddleware(RequestDelegate next, IOcelotLoggerFactory loggerFactory)
: base(loggerFactory.CreateLogger<CustomRequestMiddleware>())
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// 记录请求到达时间
var startTime = DateTime.Now;
// 可以在这里添加自定义逻辑,比如校验请求头中的Token
if (!context.Request.Headers.ContainsKey("X-Request-Token"))
{
context.Response.StatusCode = 401;
await context.Response.WriteAsync("缺少请求令牌");
return;
}
await _next(context);
// 记录请求处理耗时
var endTime = DateTime.Now;
var cost = (endTime - startTime).TotalMilliseconds;
// 这里可以将日志写入日志系统
}
}
然后在Program.cs中注册自定义中间件:
var app = builder.Build(); // 注册自定义中间件 app.UseMiddleware<CustomRequestMiddleware>(); await app.UseOcelot(); app.Run();
高级场景注意事项
- 聚合请求的响应合并逻辑默认是简单拼接,如果有复杂的合并需求,可以实现
IDefinedAggregator接口自定义合并规则 - 限流配置支持基于客户端ID的白名单,生产环境可以将内部服务的客户端ID加入白名单避免被限流
- 服务发现配置中,负载均衡策略支持轮询、最少连接等多种模式,可以根据服务特性选择
- 自定义中间件中如果需要获取Ocelot的路由上下文,可以注入
IOcelotContextAccessor获取当前请求的路由信息