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 ,于是乎,我们可以撸代码了。

代码示例

  1. @Component

  2. public class RateLimitZuulFilter extends ZuulFilter {

  3.  

  4.    private final RateLimiter rateLimiter = RateLimiter.create(1000.0);

  5.  

  6.    @Override

  7.    public String filterType() {

  8.        return FilterConstants.PRE_TYPE;

  9.    }

  10.  

  11.    @Override

  12.    public int filterOrder() {

  13.        return Ordered.HIGHEST_PRECEDENCE;

  14.    }

  15.  

  16.    @Override

  17.    public boolean shouldFilter() {

  18.        // 这里可以考虑弄个限流开启的开关,开启限流返回true,关闭限流返回false,你懂的。

  19.        return true;

  20.    }

  21.  

  22.    @Override

  23.    public Object run() {

  24.        try {

  25.            RequestContext currentContext = RequestContext.getCurrentContext();

  26.            HttpServletResponse response = currentContext.getResponse();

  27.            if (!rateLimiter.tryAcquire()) {

  28.                HttpStatus httpStatus = HttpStatus.TOO_MANY_REQUESTS;

  29.  

  30.                response.setContentType(MediaType.TEXT_PLAIN_VALUE);

  31.                response.setStatus(httpStatus.value());

  32.                response.getWriter().append(httpStatus.getReasonPhrase());

  33.  

  34.                currentContext.setSendZuulResponse(false);

  35.  

  36.                throw new ZuulException(

  37. Spring Cloud Gateway限流实战

    这可能是全网Spring Cloud Gateway限流最完整的方案了!

    构建基于Spring Cloud向Service Mesh框架迁移的解决方案及思路

    Spring Cloud微服务安全实战_4-10_用spring-cloud-zuul-ratelimit做限流

    Spring Cloud Zuul微服务网关的API限流

    Spring Cloud Alibaba Sentinel