Ocelot是一款基于.NET Core开发的轻量级API网关,专门为微服务架构设计,能够统一接收外部请求,再将请求转发到对应的下游微服务,同时提供路由、负载均衡、认证授权、限流、缓存等一系列网关通用能力,大幅降低微服务架构的复杂度。

Ocelot的核心功能
Ocelot的功能覆盖了API网关的大部分常见需求,主要包括以下几类:
- 请求路由:根据配置的路由规则,将不同路径的请求转发到对应的下游服务地址
- 负载均衡:支持轮询、最少连接等负载均衡策略,将请求分配到多个下游服务实例
- 请求聚合:可以将多个下游服务的响应合并为一个响应返回给客户端,减少客户端请求次数
- 安全能力:支持集成认证授权组件,对请求进行身份校验,也可配置IP白名单、请求头修改等
- 流量控制:支持配置限流规则,限制单位时间内的请求数量,保护下游服务不被过载
在.NET项目中集成Ocelot的步骤
1. 创建网关项目并安装依赖
首先创建一个空的ASP.NET Core Web项目,然后通过NuGet安装Ocelot包,当前最新稳定版本为18.0.0,安装命令如下:
dotnet add package Ocelot
2. 添加Ocelot配置文件
在项目根目录创建ocelot.json配置文件,用于定义路由、下游服务、负载均衡等规则,以下是一个基础配置示例:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "127.0.0.1",
"Port": 5001
},
{
"Host": "127.0.0.1",
"Port": 5002
}
],
"UpstreamPathTemplate": "/service-a/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://127.0.0.1:5000"
}
}
上述配置的含义是:所有访问网关/service-a/路径下的请求,都会被转发到下游的127.0.0.1:5001和127.0.0.1:5002两个服务实例,使用轮询的负载均衡策略,下游服务的实际请求路径为/api/加上原请求的路径后缀。
3. 配置Program.cs启用Ocelot
修改项目的Program.cs文件,加载Ocelot配置文件并注册Ocelot服务,代码如下:
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
var builder = WebApplication.CreateBuilder(args);
// 加载ocelot配置文件
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
// 注册Ocelot服务
builder.Services.AddOcelot();
var app = builder.Build();
// 启用Ocelot中间件
await app.UseOcelot();
app.Run();
4. 启动并验证网关功能
先启动两个下游服务实例,分别监听5001和5002端口,然后启动网关项目监听5000端口。访问http://127.0.0.1:5000/service-a/weatherforecast,可以看到请求会被轮流转发到两个下游服务实例,说明负载均衡和路由功能已经生效。
常见配置扩展
添加认证授权
如果需要为网关添加JWT认证,可以先注册认证服务,再在Ocelot配置中开启认证,代码示例如下:
// Program.cs中添加认证配置
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "http://127.0.0.1:5003"; // 认证服务地址
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
// ocelot.json对应路由中添加认证配置
{
"Routes": [
{
// 其他配置同上
"AuthenticationOptions": {
"AuthenticationProviderKey": "JwtBearer",
"AllowedScopes": []
}
}
]
}
配置限流规则
在路由配置中添加限流相关配置,即可限制对应路由的请求频率:
{
"Routes": [
{
// 其他配置同上
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 10
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://127.0.0.1:5000",
"RateLimitOptions": {
"DisableRateLimitHeaders": false,
"QuotaExceededMessage": "请求过于频繁,请稍后再试",
"HttpStatusCode": 429
}
}
}
上述配置表示对应路由每秒最多允许10次请求,超过后会返回429状态码和自定义提示信息。
使用注意事项
- Ocelot的配置文件修改后,默认会自动重载,不需要重启网关服务
- 下游服务的地址如果是动态变化的,可以结合服务发现组件(如Consul)使用,Ocelot原生支持Consul集成
- 生产环境中建议为网关配置健康检查,及时剔除不可用的下游服务实例
- 如果需要对请求和响应内容做自定义处理,可以通过Ocelot提供的中间件扩展点实现