SpringCloud Zuul過(guò)濾器和谷歌Gauva實(shí)現(xiàn)限流
前提:
已經(jīng)配置Zuul網(wǎng)關(guān)
參考:
https://www.jb51.net/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;/** * 訂單限流接口 */@Componentpublic 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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 淺談SpringMVC jsp前臺(tái)獲取參數(shù)的方式 EL表達(dá)式2. jsp+servlet簡(jiǎn)單實(shí)現(xiàn)上傳文件功能(保存目錄改進(jìn))3. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)4. XML入門(mén)的常見(jiàn)問(wèn)題(四)5. HTML5 Canvas繪制圖形從入門(mén)到精通6. XML入門(mén)的常見(jiàn)問(wèn)題(一)7. JavaWeb Servlet中url-pattern的使用8. 微信開(kāi)發(fā) 網(wǎng)頁(yè)授權(quán)獲取用戶(hù)基本信息9. XML解析錯(cuò)誤:未組織好 的解決辦法10. asp批量添加修改刪除操作示例代碼
