精华内容
下载资源
问答
  • 基于gateway网关实现限流

    千次阅读 2020-09-29 19:42:16
    在前面的限流方案介绍中,我们谈到了网关在微服务体系架构中的重要作用,网关不经具备大家熟知的动态路由,请求拦截等功能外,还可以基于网关实现分布式环境下的限流,下面我们以gatway为例,用代码进行实现一下 ...

    前言

    在前面的限流方案介绍中,我们谈到了网关在微服务体系架构中的重要作用,网关不经具备大家熟知的动态路由,请求拦截等功能外,还可以基于网关实现分布式环境下的限流,下面我们以gatway为例,用代码进行实现一下

    实现原理

    • 所有经过网关代理的请求会被网关进行拦截
    • 基于拦截到的请求,可以以IP、请求参数、方法名等作为限流的维度
    • 既然是限流,必然存在一个存储请求信息的地方,我们这里选用redis,简单高效,只需配置一定的策略即可

    代码实现逻辑

    1、添加pom依赖

    		<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
    
     		<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starte
    展开全文
  • 为什么要进行网关限流? 手游的架构通常是客户端通过Socket连接直连网关,所有请求都需要经过网关,然后由网关统一进行转发,所以只需在网关进行限流即可。 常见的算法主要有计数器限流、令牌桶限流和漏桶限流...

    为什么要进行网关限流?

     

    手游的架构通常是客户端通过Socket连接直连网关,所有请求都需要经过网关,然后由网关统一进行转发,所以只需在网关进行限流即可。

     

    常见的算法主要有计数器限流、令牌桶限流和漏桶限流,这些算法都是单机的算法,正好可以用在网关限流。

     

    算法

     

    1、计数器限流

     

    严格意义上来说计数器限流不属于限流算法,使用计数器来进行限流,主要用来限制总并发数,比如数据库连接数;只要全局总请求数或者一定时间段的总请求数设定的阀值则进行限流,是简单粗暴的总数量限流,而不是平均速率限流。

     

     

    2、令牌桶算法(Token Bucket)

     

    令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:

     

    • 假设限制1秒钟生成2个令牌,则按照500毫秒的固定速率往桶中添加令牌;
    • 桶中最多存放a个令牌,当桶满时,新添加的令牌被丢弃或拒绝;
    • 当有n个请求到达,将从桶中删除n个令牌,接着请求被发送到网络上;
    • 如果桶中的令牌不足n个,则不会删除令牌,该请求将被限流(要么丢弃,要么缓冲区等待)。

     

     

    令牌桶算法(图片来自网络)

     

     

    3、漏桶算法(Leaky Bucket)

     

    漏桶算法是一个存放固定水滴的桶,按照固定速率流出水滴,可以用于流量整形和流量控制,漏桶算法的描述如下:

     

    • 一个固定容量的漏桶,按照常量固定速率流出水滴;
    • 如果桶是空的,则不需流出水滴;
    • 可以以任意速率流入水滴到漏桶;
    • 如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃,要么缓冲区等待),而漏桶容量是不变的。

     

    漏桶算法(图片来自网络)

     

    对比

     

    • 令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;漏桶是按照固定速率从桶中流出请求,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝

     

    • 令牌桶限制的是平均流入速率,允许突发请求,只要有令牌就可以处理,支持一次拿5个令牌,6个令牌,并允许一定程度突发流量;漏桶限制的是常量流出速率,即流出速率是一个固定常量值,比如都是2的速率流出,而不能一次是2,下次又是3,从而平滑突发流入速率

     

    基于Golang的算法实现:https://github.com/MaxwellBackend/Games/tree/master/ratelimit

    展开全文
  • Gateway网关过滤器 自定义局部过滤器 自定义全局过滤器 基于网关实现限流

    Spring Cloud Gateway——(二)微服务网关过滤器和网关限流

    1.4 微服务网关过滤器

    Gateway作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作往往是通过网关提供的过滤器来实现的。之前写的给url添加前缀或者去除前缀都是用过滤器实现的。

    • Gateway自带过滤器有几十个,我常用的自带过滤器有:
    过滤器名称说明
    AddRequestHeader对匹配上的请求加上Header
    AddRequestParameters对匹配上的请求路由添加参数
    AddResponseHeader对从网关返回的响应添加Header
    StripPrefix对匹配上的请求路径去除前缀

    更多过滤器和详细的说明在官网链接

    • 配置全局默认过滤器

    这些自带的过滤器可以和之前使用去除url前缀的用法类似,也可以将这些过滤器配置成不只是针对某个路由;而是可以对所有路由生效,也就是配置默认过滤器:

    spring:
      application:
        name: gateway
      cloud:
        gateway:
        # 默认过滤器,对所有路由生效
    	  default-filters:
    		# 响应头过滤器,对输出的响应设置其头部属性名称为X-Response-Default-MyName,值为xm;如果有多个参数多则重写一行设置不同的参数
    	    - AddResponseHeader=X-Response-Default-MyName, xm
    

    1.5 自定义过滤器

    1.5.1 自定义局部过滤器

    自定义一个获取请求头消息的过滤器

    package com.xm.gateway.filter;
    
    import org.springframework.cloud.gateway.filter.GatewayFilter;
    import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
    import org.springframework.http.server.reactive.ServerHttpRequest;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @title: MyParamGatewayFilterFactory
     * @projectName: spring_cloud
     * @description: TODO
     * @author: Tzh
     * @date: 2019/11/25  19:06
     */
    @Component
    public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.MyParam> {
        public static final String PARAM_NAME = "param";
        public MyParamGatewayFilterFactory() {
            super(MyParam.class);
        }
        @Override
        public List<String> shortcutFieldOrder() {
            return Arrays.asList(PARAM_NAME);
        }
        @Override
        public GatewayFilter apply(MyParam config) {
            return (exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                if (request.getQueryParams().containsKey(config.param)) {
                    request.getQueryParams().get(config.param).
                            forEach(value -> System.out.printf("---MyParamGatewayFilterFactory--- %s = %s ---\n",config.param,value));
                }
                return chain.filter(exchange);
            };
        }
        public static class MyParam{
            public String param;
            public String getParam() {
                return param;
            }
            public void setParam(String param) {
                this.param = param;
            }
        }
    }
    

    写好配置类后只需要在yml中配置需要获取请求中key的值就可以了

    spring:
      application:
        name: api-gateway
      cloud:
        gateway:
          routes:
          - id: user-service-route
            uri: lb://user-service
            predicates:
            - Path=/api/user/**
            filters:
              - MyParam=name # 配置后就可以获取请求中key为name的值
    

    1.5.2 自定义全局过滤器

    package com.xm.gateway.filter;
    
    import org.apache.commons.lang.StringUtils;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    /**
     * @title: MyGlobalFilter
     * @projectName: 
     * @description: TODO
     * @author: Tzh
     * @date: 2019/11/25  19:45
     */
    @Component
    public class MyGlobalFilter implements GlobalFilter , Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            System.out.println("-----------------全局过滤器MyGlobalFilter---------------------\n");
            String token = exchange.getRequest().getQueryParams().getFirst("token");
            if (StringUtils.isBlank(token)) {
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
            return chain.filter(exchange);
        }
        //设置过滤器的优先级,值越小优先级越高
        @Override
        public int getOrder() {
            return 1;
        }
    }
    

    1.6 网关限流

    (1)spring cloud gateway 默认使用redis的RateLimter限流算法来实现。所以我们要使用首先需要引入redis的依赖

    <!‐‐redis‐‐>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring‐boot‐starter‐data‐redis‐reactive</artifactId>
    	<version>2.1.3.RELEASE</version>
    </dependency>
    
    

    (2)在工程中创建配置类,定义KeyResolver,KeyResolver用于计算某一个类型的限流的KEY也就是说,可以通过KeyResolver来指定限流的Key。

    	/**
         * 定义一个KeyResolver
         */
        @Bean
        public KeyResolver ipKeyResolver() {
            return new KeyResolver() {
                @Override
                public Mono<String> resolve(ServerWebExchange exchange) {
                    return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
                }
            };
        }
    

    (3)修改application.yml中配置项,指定限制流量的配置以及REDIS的配置

    	  # 商品服务
          - id: goods
            uri: lb://goods # 商品服务在Eureka上注册的名字
            predicates:
            - Path=/goods/** # 拦截的路径
            filters:
            - StripPrefix= 1 # url前缀第一个丢弃
            - PrefixPath=/goods/v1 # 添加url前缀 /goods/v1
            - name: RequestRateLimiter #请求数限流 名字不能随便写
              args:
                key-resolver: "#{@ipKeyResolver}"
                redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率
                redis-rate-limiter.burstCapacity: 1 #令牌桶总容量
    

    解释:

    • burstCapacity:令牌桶总容量。
    • replenishRate:令牌桶每秒填充平均速率。
    • key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。

    通过在replenishRateburstCapacity中设置相同的值来实现稳定的速率。

    设置burstCapacity高于replenishRate时,可以允许临时突发。在这种情况下,需要在这段突发时间之间允许速率限制器(根据 replenishRate),因为 2 个连续的突发将导致请求被丢弃(HTTP 429 - Too Many Requests)。

    key-resolver: “#{@ipKeyResolver}” 用于通过SPEL表达式来指定使用哪一个KeyResolver.
    如上配置:
    表示 一秒内,允许 一个请求通过,令牌桶的填充速率也是一秒钟添加一个令牌。
    最大突发状况 也只允许 一秒内有一次请求,可以根据业务来调整 。

    展开全文
  • 限流 限流可以防止上下游服务器因为过载而崩溃,可以使用RateLimitOptions来... //全局baseUrl,即网关的baseUrl "GlobalConfiguration": { "BaseUrl": "http://localhost:5000/" }, "ReRoutes": [ // 第一个api...

    限流

    在阅读本文之前,建议先阅读 02-01 .net core 3.1 使用 Ocelot搭建api网关

    限流可以防止上下游服务器因为过载而崩溃,可以使用RateLimitOptions来配置限流,修改configuration.json:

    {
      //全局baseUrl,即网关的baseUrl
      "GlobalConfiguration": {
        "BaseUrl": "http://localhost:5000/"
      },
      "ReRoutes": [
        // 第一个api
        {
          "UpstreamPathTemplate": "/first/{controller}/{action}", //上游Api请求路由规则
          "DownstreamPathTemplate": "/{controller}/{action}", //网关转发到下游路由规则
          "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ], //上下游支持请求方法
          "DownstreamScheme": "http", //下游服务配置
          "DownstreamHostAndPorts": [
            {
              "Host": "localhost", //下游地址
              "Port": 5001 //下游端口号
            }
          ],
          // 限流
          "RateLimitOptions": {
            "ClientWhitelist": [], //白名单,不受限流控制。
            "EnableRateLimiting": true, //使用启用限流。
            "Period": "1s", //限流控制的时间段 1s, 5m, 1h, 1d。
            "PeriodTimespan": 1, //超过限流限制的次数后,需要等待重置的时间(单位是秒)。
            "Limit": 2 //在限流控制时间段内最大访问数。
          }
        },
        // 第二个api
        {
          "UpstreamPathTemplate": "/second/{controller}/{action}",
          "DownstreamPathTemplate": "/{controller}/{action}",
          "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
          "DownstreamScheme": "http",
          "DownstreamHostAndPorts": [
            {
              "Host": "localhost",
              "Port": 5002
            }
          ],
          // 限流
          "RateLimitOptions": {
            "ClientWhitelist": ["127.0.0.1"], //白名单,不受限流控制。
            "EnableRateLimiting": true, //使用启用限流。
            "Period": "1s", //限流控制的时间段 1s, 5m, 1h, 1d。
            "PeriodTimespan": 10, //超过限流限制的次数后,需要等待重置的时间(单位是秒)。
            "Limit": 2 //在限流控制时间段内最大访问数。
          }
        }
      ]
    }
    
    • ClientWhitelist:白名单,不受限流控制。
    • EnableRateLimiting:使用启用限流。
    • Period:限流控制的时间段 1s, 5m, 1h, 1d。
    • PeriodTimespan:超过限流限制的次数后,需要等待重置的时间(单位是秒)。
    • Limit:在限流控制时间段内最大访问数。
      再本文例子5002端口中,对于除了请求头中ClientId=127.0.0.1的以外所有求情启用限流,1秒该api最多请求2次,如果达到2次需要从第2次请求闭合后等待10秒进行下一次访问。
      请求api看效果: http://localhost:5000/first/firstapi/getmessage
      在这里插入图片描述
      在这里插入图片描述
      可以在GlobalConfiguration节点下配置自定义信息RateLimitOptions
    "RateLimitOptions": {
          "DisableRateLimitHeaders": false, //是否显示X-Rate-Limit和Retry-After头
          "QuotaExceededMessage": "API is limited!", //提示信息
          "HttpStatusCode": 200, //状态码
          "ClientIdHeader": "ClientId" //用来设别客户请求头,默认为ClientId。
        }
    

    如图:
    在这里插入图片描述

    • DisableRateLimitHeaders:是否显示X-Rate-Limit和Retry-After头
    • QuotaExceededMessage提示信息
    • HttpStatusCode状态码
    • ClientIdHeader:用来设别客户请求头,默认为ClientId。
      效果如图
      在这里插入图片描述
      在这里插入图片描述
      源码地址
    参考文章

    .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换

    展开全文
  • 在上一章节中,我们做了网关的日志请求及全局异常,本章节我们将会介绍限流及断路。 对于很多同学来说,限流跟断路应该都是经常遇见的,但是有很多新同学并不知道,这里先介绍一下限流跟断路。 限流:限制流量,举...
  • 为了防止网关过量负载请求,很多时候会要根据实际的情况对接口进行限流。zuul本身是没有提供限流的功能的,但是你也可以根据它提供的filter自己去做限流,当然也可以使用人家已经写好了的限流组件去集成,因为资源...
  • 网关限流介绍及实现

    2019-08-16 09:34:48
    网关可以做很多的事情,比如,限流,当我们的系统被频繁的请求的时候,就有可能 将系统压垮,所以 为了解决这个问题,需要在每一个微服务中做限流操作,但是如果有了网关,那么就可以在网关系统做限流,因为所有的...
  • 谈谈从网关限流的技术选型到使用Redis+Lua实现分布式并发限流控制的整个过程为啥要做网关限流网关限流选型限流系统设计演进限流逻辑流程限流代码 本文记录了笔者在平时工作中自接到任务后做的需求调研、技术选型、...
  • 微服务开发中有时需要对API做限流保护,防止网络攻击,比如做一个短信验证码API,限制客户端的请求速率能在一定程度上抵御短信轰炸攻击,降低损失。 1.创建项目 2.pom文件 在pom文件内添加对Zuul限流的坐标...
  • 在前面我们知道Spring Cloud Gateway实现了一个RequestRateLimiter的过滤器,该过滤器会对访问到当前网关的所有请求执行限流过滤器、如果被限流,默认情况下回响应Http-429-Too Many Requests。...
  • 主要介绍了spring cloud gateway整合sentinel实现网关限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 【教程】SpringCloud+Nacos+Feign+Gateway ( 八 ) Nacos-Gateway 网关 限流
  • 开放API网关实践(三) —— 限流

    千次阅读 2019-09-30 22:43:51
    开放API网关实践(三) —— 限流 如何设计实现一个轻量的开放API网关限流 文章地址: https://blog.piaoruiqing.com/blog/2019/08/26/开放api网关实践三-限流/ 前言 开发高并发系统时有多重系统保护手段, 如缓存、...
  • (一)什么是微服务网关 后端写完所有的微服务之后,最终是要交给前端去调用。我们都知道每个微服务都有各自的端口号,如果前端直接通过IP加端口的方式去调用微服务会很麻烦。如果想对请求增加限制也会变得十分困难...
  • 不同的微服务一般会有不同的网络地址,而外部客户端可能...实现限流操作; 用户权限认证操作。 实现微服务网关的技术有很多: nginx:一个高性能HTTP和反向代理web服务器,同时提供了IMAP/POP3/SMTP服务;(一般用于
  • php实战kong做微服务架构四(插件之限流、负载均衡、黑白名单)序言kong插件介绍插件列表限流粒度算法配置负载均衡配置黑白名单配置运行示例 序言 为了在多项目管理过程中,让部分统一业务集中管理,比如鉴权、限流...
  • 2.在OCI协议上来看:网关分为两类,一种是面向连接的网关,一种是无连接的网关;3.在TCP协议上来看,网关实质上是一个网络通向其他网络地址的IP地址;不同的网络的主机处在不同的网络里,要实现通信,必须要通过网关...
  • 目录 关键字 Predicate(断言)增强分析 Predicate 内置工厂 --------------------实践案例应用--------------- ... 解析一下网关层面的断言(条件分析) [总代码(配置文件去看最下面▼)] ----...
  • 文章目录1、sentinel网关限流组件 1、sentinel网关限流组件 Sentinel 网关流控 支持针对不同的路由和自定义的 API 分组进行流控, 支持针对请求属性(如 URL 参数,Client IP,Header 等)进行流控。 Sentinel ...
  •   高并发的情况肯定是实际场景中经常碰到的情况,那么这种情况下限流措施肯定是必须的,本文我们就来看看zuul中限流的处理 高并发的限流处理 1.创建项目   创建一个SpringCloud项目 2.添加依赖   必须要添加 ...
  • /** * 网关限流 * * @author bright */ @Configuration public class GatewayConfiguration { private final List<ViewResolver> viewResolvers; private final ServerCodecConfigurer serverCodecConfigurer; ...
  • 因此,我们整合了上述机制来讨论网关服务中的限流熔断和降级等网关策略。 二:熔断降级 1.业务场景:在传统的项目中,当访问一个路径出现不可访问比如404,浏览器不同在加载甚至在10几秒后才会反馈出404,这明 ...
  • 本文介绍Ocelot中的限流限流允许Api网关控制一段时间内特定api的总访问次数。限流的使用非常简单,只需要添加配置即可。1、添加限流修改configuration...
  • Soul 中的请求限流Soul 中的请求限流RateLimiterPlugin 限流插件限流方案:令牌桶算法:Soul 中 RateLimiter 插件的使用常用限流算法漏桶算法令牌桶算法对比限流实现关于限流的一些经验总结 Soul 中的请求限流 ...
  • Spring Cloud Gateway是基于Spring Boot 2.x,Spring WebFlux和Project Reactor 构建的。属于异步非阻塞架构 Spring Cloud Gateway与Spring Data 和Spring Securit ...网关基本的功能 :鉴权、流量控制、熔断、路径重写
  • 在上述的记账中我们讨论使用了Bucket来做限流机制。 /** * 创建一个令牌桶 * @return */ private Bucket createNewBucket() { Refill refill = Refill.of(1, Duration.ofSeconds(1000))...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,409
精华内容 5,763
关键字:

网关全局限流