SpringCloud Zuul过滤器和谷歌Gauva实现限流

 更新时间:2020年03月17日 14:07:07   作者:玉天恒  
这篇文章主要介绍了SpringCloud Zuul过滤器和谷歌Gauva实现限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前提:

已经配置Zuul网关

参考:

https://www.jb51.net/article/182894.htm

限流方式:

1)nginx层限流

2)网关层限流

1.添加限流过滤器

import com.alibaba.fastjson.JSON;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;

/**
 * 订单限流接口
 */
@Component
public class OrderRateLimiterFilter extends ZuulFilter {

  //每秒产生1000个令牌
  private static final RateLimiter RATE_LIMITER = RateLimiter.create(1000);

  @Override
  public String filterType() {
    return PRE_TYPE;
  }

  @Override
  public int filterOrder() {
    return -4;
  }

  @Override
  public boolean shouldFilter() {

    RequestContext context = RequestContext.getCurrentContext();
    HttpServletRequest request = context.getRequest();

    ///apigateway/order/api/v1/order/test
    System.out.println(request.getRequestURI());
    //http://127.0.0.1:9000/apigateway/order/api/v1/order/test
    System.out.println(request.getRequestURL());

    //限流的接口
    List<String> noFIlter = new ArrayList<>();
    noFIlter.add("/apigateway/order/**");

    AntPathMatcher matcher = new AntPathMatcher();
    for (String pattern : noFIlter) {//pattern--/user/**
      if (StringUtils.isNotEmpty(pattern)
          && matcher.match(pattern, request.getRequestURI())) {
        return true;
      }
    }

    return false;
  }

  @Override
  public Object run() throws ZuulException {

    //可以用JMeter来进行测试
    RequestContext context = RequestContext.getCurrentContext();
    //tryAcquire达到最大流量时,立刻限流,也可以配置参数
    if (!RATE_LIMITER.tryAcquire()) {
      Map<String, Object> result = new HashMap<>();
      result.put("code", 429);
      result.put("msg", "目前访问量过大,限流了...");

      context.setSendZuulResponse(false);
      context.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());
      context.setResponseBody(JSON.toJSONString(result));
      //解决中文乱码
      context.getResponse().setCharacterEncoding("UTF-8");
      context.getResponse().setContentType("text/html;charset=UTF-8");
    }

    return null;
  }
}

令牌桶限流图解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MyBatis实现MySQL批量插入的示例代码

    MyBatis实现MySQL批量插入的示例代码

    本文主要介绍了MyBatis实现MySQL批量插入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 谈谈对Java多态性的一点理解

    谈谈对Java多态性的一点理解

    多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定
    2017-08-08
  • 简单解析java方法在调用在内存中的执行过程

    简单解析java方法在调用在内存中的执行过程

    这篇文章主要介绍了简单解析java方法在调用在内存中的执行过程,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 浅析java移位符的具体使用

    浅析java移位符的具体使用

    这篇文章主要介绍了浅析java移位符的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • spring boot实现上传图片并在页面上显示及遇到的问题小结

    spring boot实现上传图片并在页面上显示及遇到的问题小结

    最近在使用spring boot搭建网站的过程之中遇到了有点小问题,最终解决方案是在main目录下新建了一个webapp文件夹,并且对其路径进行了配置,本文重点给大家介绍spring boot实现上传图片并在页面上显示功能,需要的朋友参考下吧
    2017-12-12
  • Java 时间转换的实例代码

    Java 时间转换的实例代码

    下面小编就为大家带来一篇Java 时间转换的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 入门到精通Java SSO单点登录原理详解

    入门到精通Java SSO单点登录原理详解

    这篇文章主要介绍了入门到精通Java SSO单点登录原理详解,本文主要对SSO单点登录与CAS、OAuth2.0两种授权协议的关系和原理进行详细说明
    2022-09-09
  • JAVA JDK8 List分组的实现和用法

    JAVA JDK8 List分组的实现和用法

    今天小编就为大家分享一篇关于JAVA JDK8 List分组的实现和用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 从java中调用matlab详细介绍

    从java中调用matlab详细介绍

    这篇文章主要介绍了从java中调用matlab,有需要的朋友可以参考一下
    2013-12-12
  • 初识MyBatis及基本配置和执行

    初识MyBatis及基本配置和执行

    这篇文章主要介绍了初识MyBatis的基本知识,文中给大家提到了mybatis基本配置和执行过程,需要的朋友可以参考下
    2017-11-11

最新评论