您好,登錄后才能下訂單哦!
小編給大家分享一下SpringCloud Zuul過濾器和谷歌Gauva實(shí)現(xiàn)限流的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
前提:
已經(jīng)配置Zuul網(wǎng)關(guān)
限流方式:
1)nginx層限流
2)網(wǎng)關(guān)層限流
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 { //每秒產(chǎn)生1000個(gè)令牌 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來進(jìn)行測(cè)試 RequestContext context = RequestContext.getCurrentContext(); //tryAcquire達(dá)到最大流量時(shí),立刻限流,也可以配置參數(shù) 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實(shí)現(xiàn)限流的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。