Spring Cloud限流思路及解决方案
Posted 狂风骤起
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud限流思路及解决方案相关的知识,希望对你有一定的参考价值。
转自: http://blog.csdn.net/zl1zl2zl3/article/details/78683855
在高并发的应用中,限流往往是一个绕不开的话题。本文详细探讨在Spring Cloud中如何实现限流。
在 Zuul
上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法。常见的限流算法有漏桶算法以及令牌桶算法。这个可参考 https://www.cnblogs.com/LBSer/p/4083131.html ,写得通俗易懂,你值得拥有,我就不拽文了。
GoogleGuava
为我们提供了限流工具类 RateLimiter
,于是乎,我们可以撸代码了。
代码示例
-
@Component
-
public class RateLimitZuulFilter extends ZuulFilter {
-
-
private final RateLimiter rateLimiter = RateLimiter.create(1000.0);
-
-
@Override
-
public String filterType() {
-
return FilterConstants.PRE_TYPE;
-
}
-
-
@Override
-
public int filterOrder() {
-
return Ordered.HIGHEST_PRECEDENCE;
-
}
-
-
@Override
-
public boolean shouldFilter() {
-
// 这里可以考虑弄个限流开启的开关,开启限流返回true,关闭限流返回false,你懂的。
-
return true;
-
}
-
-
@Override
-
public Object run() {
-
try {
-
RequestContext currentContext = RequestContext.getCurrentContext();
-
HttpServletResponse response = currentContext.getResponse();
-
if (!rateLimiter.tryAcquire()) {
-
HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS;
-
-
response.setContentType(MediaType.TEXT_PLAIN_VALUE);
-
response.setStatus(httpStatus.value());
-
response.getWriter().append(httpStatus.getReasonPhrase());
-
-
currentContext.setSendZuulResponse(false);
-
-
throw new ZuulException(
-
Spring Cloud Gateway限流实战
这可能是全网Spring Cloud Gateway限流最完整的方案了!
构建基于Spring Cloud向Service Mesh框架迁移的解决方案及思路