中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringCloud Zuul過濾器和谷歌Gauva實現限流的方法

發布時間:2021-05-17 11:35:42 來源:億速云 閱讀:184 作者:小新 欄目:編程語言

小編給大家分享一下SpringCloud Zuul過濾器和谷歌Gauva實現限流的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前提:

已經配置Zuul網關

限流方式:

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;
  }
}

令牌桶限流圖解

SpringCloud Zuul過濾器和谷歌Gauva實現限流的方法

以上是“SpringCloud Zuul過濾器和谷歌Gauva實現限流的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陆良县| 准格尔旗| 龙游县| 青神县| 清水县| 阿拉尔市| 绥中县| 健康| 会东县| 惠东县| 汝州市| 祁连县| 永修县| 周至县| 灌南县| 长宁县| 保亭| 涡阳县| 黑水县| 高州市| 交口县| 安远县| 兴海县| 邢台市| 忻州市| 辽源市| 满洲里市| 南川市| 苍梧县| 益阳市| 金阳县| 大竹县| 平安县| 手机| 吴旗县| 普兰县| 利津县| 鞍山市| 襄汾县| 剑阁县| 盱眙县|