Ocelot学习
Ocelot是什么
Ocelot是一个开源的API网关库,主要用于在微服务架构中统一管理API请求。
能做什么
- 路由转发
在微服务架构中,一个系统是由多个微服务组成的,而每个服务由独立的API。如果客户端直接调用这些服务,会面临地址混乱、权限管理复杂等问题。而Ocelot可以做到所有的外部请求先经过它,由它智能地分发给对应的服务。
// 示例
{
"DownstreamPathTemplate": "/api/users", //目标微服务真实路径
"UpstreamPathTemplate": "/api/users", //客户端请求的路径(对外暴露路径)
"UpstreamHttpMethod": [ "GET" ], //监听的HTTP方法
"DownstreamHostAndPorts": [
{
"Host": "userservice", //目标服务的主机名或IP
"Port": 80 //目标服务端口号
}
],
"LoadBalancerOptions": {
"Type": "RoundRobin" // 策略:轮询(还有LeastConnection、CookieStickySessions等)
}
}
- 统一认证
可集成JWT等鉴权机制,在网关层统一处理,避免每个微服务重复处理。 - 负载均衡
可自动将流量分配到多个相同的服务实例(其实就和Nginx一样) - 限流与熔断
防止突发流量压垮服务,比如限制每秒100次请求,超限则返回错误或启用备用方案 - 聚合请求
可以将多个API返回结果合并,减少客户端请求次数。
使用
安装
在一个.net WebAPI项目中安装,命令:dotnet add package Ocelot
添加配置文件ocelot.json
在项目根目录创建文件ocelot.json:
{
"Routes": [
{
"DownstreamPathTemplate": "/api/users",
"UpstreamPathTemplate": "/users",
"UpstreamHttpMethod": [ "GET" ],
"DownstreamHostAndPorts": [
{ "Host": "localhost", "Port": 5001 }
]
},
{
"DownstreamPathTemplate": "/api/orders",
"UpstreamPathTemplate": "/orders",
"UpstreamHttpMethod": [ "GET", "POST" ],
"DownstreamHostAndPorts": [
{ "Host": "localhost", "Port": 5002 }
]
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:5000" // 网关自身地址
}
}
修改Program.cs
var builder = WebApplication.CreateBuilder(args);
// 添加Ocelot配置
builder.Configuration.AddJsonFile("ocelot.json");
builder.Services.AddOcelot();
var app = builder.Build();
app.UseOcelot().Wait();
app.Run();
运行与测试
启动
dotnet run --urls=http://localhost:5000
验证路由转发
- 访问
http://localhost:5000/users-> 应转发至User服务(5001端口) - 访问
http://localhost:5000/orders-> 应转发至Order服务(5002端口)
配置解释
全局配置(GlobalConfiguration)
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
| BaseUrl | string | 网关自身的地址 | http://localhost:5000 |
| ReuqestIdKey | string | 定义传递请求ID的Header名称(用于链路追踪) | X-Request-Id |
| ServiceDiscoveryProvider | object | 服务发现配置(如:Consul、Eureka) | { "Host": "localhost", "Port": 8500, "Type": "Consoul", "Token": "" } |
| RateLimitOption | object | 全局限流配置 | { "ClientIdHeader": "ClientId", "QuotaExceededMessage": "请求过多" } |
| LoadBalancerOptions | object | 全局负载均衡策略(优先级低于路由级配置) | { "Type": "RoundRobin" } |
| DownstreamScheme | string | 统一下游服务协议(http/https) | http |
路由配置(Routes[])
每个路由对象定义一组请求转发规则。
基础路由
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
| DownStreamPathTemplate | string | 下游服务路径模板(支持占位符,供Restful风格API使用) | /api/users/ |
| DownStreamHostAndPorts | array | 下游服务地址列表(Host+Port) | [{ "Host": "localhost", "Port": 5001 }] |
| UpstreamPathTemplate | string | 上游请求路径模板(客户端访问网关的路径) | /users/ |
| UpstreamHttpMethod | string[] | 监听的HTTP方法 | ["GET"] |
| Priority | int | 路由优先级(越小优先级越高,默认0) | 1 |
高级控制
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
| AuthenticationOptions | object | 路由级认证配置 | { "AuthenticationProviderKey": "Bearer" } |
| RateLimitOptions | object | 路由级限流配置 | { "EnableRateLimiting": true, "Period": "1s", "Limit": 5 } |
| LoadBalanceOptions | object | 路由级负载均衡策略 | { "Type": "LeastConnection" |
| QoSOptions | object | 熔断机制配置 | { "ExceptionsAllowedBeforeBreaking": 3, "DurationOfBreak": 10 } |
| DangerousAcceptAnyServerCertificateValidator | bool | 是否跳过SSL证书验证 | true |
| DelegatingHandlers | string[] | 自定义请求处理中间件 | `["LoggingHandler"]`` |
请求头/参数处理
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
| AddHeadersToRequest | object | 添加Header到下游请求 | [{ "X-User-Id": "Claims[UserId]value"}] |
| AddClaimsToRequest | object | 添加声明到下游请求 | { "UserId": "Claims[sub]value" |
| RouteClaimsRequirement | object | 声明必须满足的条件,否则返回403 | {"Role": "admin"} |
进阶应用
- 负载均衡
{
"DownstreamHostAndPorts": [
{ "Host": "localhost", "Port": 5001 },
{ "Host": "localhost", "Port": 5003 } // 启动另一个用户服务实例
],
"LoadBalancerOptions": {
"Type": "RoundRobin" // 轮询策略
}
}
- 统一JWT认证
Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.Authority = "https://auth-server.com";
options.Audience = "api-gateway";
});
builder.Services.AddOcelot();
ocelot.json:
{
"Routes": [
{
"AuthenticationOptions": {
"AuthenticationProviderKey": "Bearer"
}
}
]
}

浙公网安备 33010602011771号