Ocelot学习

Ocelot是什么

Ocelot是一个开源的API网关库,主要用于在微服务架构中统一管理API请求。

能做什么

  1. 路由转发
    在微服务架构中,一个系统是由多个微服务组成的,而每个服务由独立的API。如果客户端直接调用这些服务,会面临地址混乱、权限管理复杂等问题。而Ocelot可以做到所有的外部请求先经过它,由它智能地分发给对应的服务。
// 示例
{
	"DownstreamPathTemplate": "/api/users", //目标微服务真实路径
	"UpstreamPathTemplate": "/api/users", //客户端请求的路径(对外暴露路径)
	"UpstreamHttpMethod": [ "GET" ], //监听的HTTP方法
	"DownstreamHostAndPorts": [
		{
			"Host": "userservice", //目标服务的主机名或IP
			"Port": 80 //目标服务端口号
		}
	],
	"LoadBalancerOptions": {
	"Type": "RoundRobin" // 策略:轮询(还有LeastConnection、CookieStickySessions等)
  }
}
  1. 统一认证
    可集成JWT等鉴权机制,在网关层统一处理,避免每个微服务重复处理。
  2. 负载均衡
    可自动将流量分配到多个相同的服务实例(其实就和Nginx一样)
  3. 限流与熔断
    防止突发流量压垮服务,比如限制每秒100次请求,超限则返回错误或启用备用方案
  4. 聚合请求
    可以将多个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"}

进阶应用

  1. 负载均衡
{
  "DownstreamHostAndPorts": [
    { "Host": "localhost", "Port": 5001 },
    { "Host": "localhost", "Port": 5003 } // 启动另一个用户服务实例
  ],
  "LoadBalancerOptions": {
    "Type": "RoundRobin" // 轮询策略
  }
}
  1. 统一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"
      }
    }
  ]
}
posted @ 2025-03-18 23:18  南山有榛  阅读(158)  评论(0)    收藏  举报