SpringCloud Zuul過濾器和谷歌Gauva實(shí)現(xiàn)限流
前提:
已經(jīng)配置Zuul網(wǎng)關(guān)
參考:
http://www.dbjr.com.cn/article/182894.htm
限流方式:
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; } }
令牌桶限流圖解
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能
JWT本身是無狀態(tài)的,這點(diǎn)有別于傳統(tǒng)的session,不在服務(wù)端存儲(chǔ)憑證。這種特性使其在分布式場(chǎng)景,更便于擴(kuò)展使用。接下來通過本文給大家分享SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能,感興趣的朋友一起看看吧2021-09-09Java簡(jiǎn)單實(shí)現(xiàn)農(nóng)夫過河問題示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)農(nóng)夫過河問題,簡(jiǎn)單描述了農(nóng)夫過河問題的概念、原理并結(jié)合簡(jiǎn)單實(shí)例形式分析了java解決農(nóng)夫過河問題的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12mapstruct的用法之qualifiedByName示例詳解
qualifiedByName的意思就是使用這個(gè)Mapper接口中的指定的默認(rèn)方法去處理這個(gè)屬性的轉(zhuǎn)換,而不是簡(jiǎn)單的get?set,今天通過本文給大家介紹下mapstruct的用法之qualifiedByName示例詳解,感興趣的朋友一起看看吧2022-04-04Java Servlet線程中AsyncContext異步處理Http請(qǐng)求
這篇文章主要介紹了Java Servlet線程中AsyncContext異步處理Http請(qǐng)求及在業(yè)務(wù)中應(yīng)用,AsyncContext是Servlet 3.0使Servlet 線程不再需要一直阻塞,直到業(yè)務(wù)處理完畢才能再輸出響應(yīng),最后才結(jié)束該Servlet線程2023-03-03Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷售報(bào)表等等,需要的朋友可以參考下2023-08-08你所不知道的Spring的@Autowired實(shí)現(xiàn)細(xì)節(jié)分析
這篇文章主要介紹了你所不知道的Spring的@Autowired實(shí)現(xiàn)細(xì)節(jié)分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator
這篇文章主要介紹了基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08