SpringCloud Zuul過(guò)濾器和谷歌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.添加限流過(guò)濾器
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來(lái)進(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", "目前訪問(wèn)量過(guò)大,限流了...");
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本身是無(wú)狀態(tài)的,這點(diǎn)有別于傳統(tǒng)的session,不在服務(wù)端存儲(chǔ)憑證。這種特性使其在分布式場(chǎng)景,更便于擴(kuò)展使用。接下來(lái)通過(guò)本文給大家分享SpringBoot JWT實(shí)現(xiàn)token登錄刷新功能,感興趣的朋友一起看看吧2021-09-09
Java簡(jiǎn)單實(shí)現(xiàn)農(nóng)夫過(guò)河問(wèn)題示例
這篇文章主要介紹了Java簡(jiǎn)單實(shí)現(xiàn)農(nóng)夫過(guò)河問(wèn)題,簡(jiǎn)單描述了農(nóng)夫過(guò)河問(wèn)題的概念、原理并結(jié)合簡(jiǎn)單實(shí)例形式分析了java解決農(nóng)夫過(guò)河問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
mapstruct的用法之qualifiedByName示例詳解
qualifiedByName的意思就是使用這個(gè)Mapper接口中的指定的默認(rèn)方法去處理這個(gè)屬性的轉(zhuǎn)換,而不是簡(jiǎn)單的get?set,今天通過(guò)本文給大家介紹下mapstruct的用法之qualifiedByName示例詳解,感興趣的朋友一起看看吧2022-04-04
Java 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-03
mybatis?plus中如何編寫(xiě)sql語(yǔ)句
這篇文章主要介紹了mybatis?plus中如何編寫(xiě)sql語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法詳解
這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Word文檔的實(shí)現(xiàn)方法,在日常的開(kāi)發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷(xiāo)售報(bào)表等等,需要的朋友可以參考下2023-08-08
你所不知道的Spring的@Autowired實(shí)現(xiàn)細(xì)節(jié)分析
這篇文章主要介紹了你所不知道的Spring的@Autowired實(shí)現(xiàn)細(xì)節(jié)分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator
這篇文章主要介紹了基于Mybatis Plus實(shí)現(xiàn)代碼生成器CodeGenerator,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

