zoukankan      html  css  js  c++  java
  • (6)ASP.NET Core3.1 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状态码和全局给客户端,不会再转发到对应下游服务方法去,防止了客户端恶意攻击,保证了下游服务不会负荷过载!

    参考文献:
    Ocelot官网

  • 相关阅读:
    设计模式
    Lambda表达式
    网络通信
    排序
    可变参数
    反弹shell学习总结
    Apache Flink任意Jar包上传导致远程代码执行漏洞复现
    定时执行rsync同步数据以及mysql备份
    python练习
    django 模型生成sql(多对多)
  • 原文地址:https://www.cnblogs.com/wzk153/p/13998663.html
Copyright © 2011-2022 走看看