微服务(八)-服务网关zuul(四)

简介: 微服务(八)-服务网关zuul(四)

经典的模型:令牌桶的模型

1、比如说在电商中的抢购:一点就说抢购已结束。其实没有结束,只是你没有获得这个令牌就已经没了,所以说它可以限流,电商里的限流也可以用队列。1.1、限流就是如何去限制它的流量,让这个流量尽量控制在可控制的范围当中。2、在微服务当中,做限流都有成熟的框架,谷歌为我们提供成熟的插件guava=>RateLimiter:这个类里面可以直接做限流。2.1、既然做限流是做所有的过滤器之前来处理的。

代码如下:只要这么做就可以达到很好的限流的作用。create方法中的参数permitsPerSecond, long warmupPeriod, TimeUnit unit  

permitsPerSecond :当请求到来的速度超过了permitsPerSecond,保证每秒只处理permitsPerSecond个请求。

参数warmupPeriod和unit决定了其从冷却状态到达最大速率的时间

  1. package com.example.userapigateway.filter;
  2. import com.netflix.zuul.ZuulFilter;
  3. import com.netflix.zuul.context.RequestContext;
  4. import com.netflix.zuul.exception.ZuulException;
  5. import org.springframework.stereotype.Component;
  6. import java.util.concurrent.TimeUnit;
  7. import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
  8. import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;
  9. @Component
  10. public class RateLimiters extends ZuulFilter {
  11.    //创建一个容量为100的令牌桶
  12.    //每次请求的时候都会获取这个令牌桶
  13.    public static final com.google.common.util.concurrent.RateLimiter RATE_LIMITER =
  14.            com.google.common.util.concurrent.RateLimiter.create(1,2, TimeUnit.SECONDS);
  15.    @Override
  16.    public String filterType() {
  17.        return PRE_TYPE;
  18.    }
  19.    @Override
  20.    public int filterOrder() {
  21.        return SERVLET_DETECTION_FILTER_ORDER-1;
  22.    }
  23.    @Override
  24.    public boolean shouldFilter() {
  25.        return true;
  26.    }
  27.    @Override
  28.    public Object run() throws ZuulException {
  29.        RequestContext context = RequestContext.getCurrentContext();
  30.        //获取令牌桶里的令牌
  31.        //如果为true,就是获取到了令牌,然后就直接放行
  32.        //如果没有获取到的话,直接就抛异常了。
  33.        //如果是10003的话代表请求的速度太快了,我这边接收不了,
  34.        //接收不了的话就拿不到令牌了,相当于拿的时候这个令牌已经没了。
  35.        //所以需要等待放进来的时候才可以拿到。拿不到的原因是流量太大了,一下就拿不到了。
  36.        //限制了流量的速率。一个人可以拿多个令牌,看它的线程。
  37.        boolean flag = RATE_LIMITER.tryAcquire();
  38.        if(!flag){
  39.            context.setSendZuulResponse(false);
  40.            context.setResponseStatusCode(400);
  41.        }
  42.        return null;
  43.    }
  44. }

3、去重启下gateway,然后用postman对接口的压测,一秒钟10次的请求,演示多线程的操作:

总结:zuul的限流就是这个流量不能让你一下子过来得太多,比如不能让10000个流量,或者让1百万个流量去流入到我们的服务里去了,这肯定是不允许的。以固定速率放入令牌,如果发现令牌满的话,直接就丢弃了,相当于就达到了限流的效果了。

相关文章
|
10月前
|
负载均衡 应用服务中间件 API
微服务技术系列教程(25) - SpringCloud- 接口网关服务Zuul
微服务技术系列教程(25) - SpringCloud- 接口网关服务Zuul
146 0
|
监控 负载均衡 安全
解密微服务之Zuul
当今互联网世界中,微服务架构已经成为了一种流行的架构方式,它有助于构建可伸缩、灵活和可维护的应用程序。然而,随着微服务数量的增加,管理它们之间的通信和路由变得越来越复杂。这就是Netflix开发的Zuul微服务网关出现的背景。本文将详细介绍Zuul微服务网关,探讨其作用、功能以及如何在微服务架构中使用它。
|
13小时前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
12小时前
|
负载均衡 前端开发 安全
微服务(六)-服务网关zuul(二)
微服务(六)-服务网关zuul(二)
|
12小时前
|
监控 前端开发 Java
微服务(七)-服务网关zuul(三)
微服务(七)-服务网关zuul(三)
|
1月前
|
安全 前端开发 Java
微服务网关及其配置
微服务网关及其配置
82 4
|
4月前
|
XML 前端开发 JavaScript
【微服务】6、一篇文章学会使用 SpringCloud 的网关
【微服务】6、一篇文章学会使用 SpringCloud 的网关
135 0
|
监控 安全 前端开发
GateWay微服务网关的搭建
GateWay微服务网关的搭建
203 0
|
缓存 负载均衡 监控
微服务 @SentinelResource 服务网关
微服务 @SentinelResource 服务网关
67 0