ASP.NET Core设置Ocelot网关限流
作者:暗断肠
这篇文章介绍了ASP.NET Core设置Ocelot网关限流的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
1.限流(Rate Limiting)
很多时候为了防止DoS攻击,我们会通过限流方式对上游请求进行限制,以保护下游服务不会负荷过载,为客户端提供高质量的资源服务。在Ocelot限流项目示例中,通过APIGateway项目路由RateLimitOptions选项可以配置限流。对解决方案的示例APIServices项目Get方法进行限流,文件配置具体代码如下:
{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/values",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9001
        }
      ],
      "UpstreamPathTemplate": "/customers",
      "UpstreamHttpMethod": [ "Get" ],
      "RateLimitOptions": {
        //客户端白名单。名单中的客户端不会被限流。
        "ClientWhitelist": [],
        //是否启用限流。
        "EnableRateLimiting": true,
        //限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。
        "Period": "1s",
        //限流时间间隔,限流后多少秒后才可以再次发起请求。
        "PeriodTimespan": 3,
        //限制请求数。
        "Limit": 1
      }
    }
  ],
  //全局配置,所有下游服务都执行如下限流配置
  "GlobalConfiguration": {
    "RequestIdKey": "OcRequestId",
    "AdministrationPath": "/administration",
    "RateLimitOptions": {
      //是否禁用X-Rate-Limit和Retry-After标头。
      "DisableRateLimitHeaders": false,
      //限流返回的消息。
      "QuotaExceededMessage": "Customize Tips!"
    }
  }
}下面来介绍下RateLimitOptions选项几个参数:
- ClientWhitelist:客户端白名单。名单中的客户端不会被限流。
 - EnableRateLimiting:是否启用限流。
 - Period:限流时间(1s,5m,1h,1d)。在限流时间内限制请求数,需要等PeriodTimespan时间过去了,才能再次发起请求。
 - PeriodTimespan:限流时间间隔,限流后多少秒后才可以再次发起请求。
 - Limit:限制请求数。
 - DisableRateLimitHeaders:是否禁用X-Rate-Limit和Retry-After标头。
 - QuotaExceededMessage:限流返回的消息。
 - HttpStatusCode:限流时候,指定返回的HTTP状态代码。
 - ClientIdHeader:允许您指定应用于标识客户端的标头。默认情况下为“ClientId”。
 
2.项目演示
2.1APIGateway项目
添加Ocelot服务注入和Logging信息输出:
public class Startup
{
    public Startup(IWebHostEnvironment env)
    {
        var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder();
        builder.SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json")
                //add configuration.json
                .AddJsonFile("configuration.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
        Configuration = builder.Build();
    }
    public IConfigurationRoot Configuration { get; }
    public void ConfigureServices(IServiceCollection services)
    {
        //输出Logging信息;
        services.AddLogging(logging =>
        {
            logging.AddConsole();
            logging.AddDebug();
        });
        //添加Ocelot服务;
        services.AddOcelot(Configuration);
    }
    public void Configure(IApplicationBuilder app)
    {
        //使用Ocelot;
        app.UseOcelot().Wait();
    }
}2.2APIServices项目
项目添加一个Get方法,对应APIGateway项目的路由上下游配置,具体代码如下:
[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}2.3项目运行
输入dotnet run --project 项目路径\项目文件.csproj把两个项目启动起来,通过在浏览器不断刷新上游服务地址,会看到如下信息:


根据上述信息可以知道在1秒时间内,如果请求数超过路由配置限制数,那么Ocelot网关就会直接返回429状态码和全局给客户端,不会再转发到对应下游服务方法去,防止了客户端恶意攻击,保证了下游服务不会负荷过载!
到此这篇关于ASP.NET Core设置Ocelot网关限流的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
