Spring cloud微服务安全实战-3-3 API安全机制之流控


首先要保证你的服务是可用的,其中一个重要的手段就是流控。就是流量控制。比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉。这样我的系统不会被压死

实际的开发中,所要面对的流控场景实际是非常复杂的,在负载均衡上做,反向代理上做,或者自己写代码去做也是可以的。。
负载均衡和反向代理一般是针对集群的。
为什么要做流控:
1.保证系统的可用性,不要被大流量把系统压死,如果你的服务不可用,做什么都没有意义了。
2.流控一定要做在认证审计授权这些安全机制的前面。因为你的认证审计授权都是要消耗系统资源的,能越早把一些请求拒绝掉,资源的浪费就会越少。越能处理更多的请求。所以流控应该是在整个安全机制的最前面。

用guava来做个示例。先查一下最新的版本






粘贴到项目的pom.xml内

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>

创建过滤器

所有的请求都要做流量的统计。我们在一个过滤器里面做这个事




继承OncePerRequestFilter,这是Spring框架提供的Filter。继承这个,可以保证你的过滤器的逻辑在一个请求里面,永远只会被执行一次。因为有些情况下可能在一个请求里面可能会多次执行这个过滤器。这样继承了OncePerRequestFilter。就会保证你的过滤器逻辑不会被多次执行。

首先把它声明称一个Spring 的Component组件。

进入OncePerRequestFilter这个类里

OncePerRequestFilter继承自GenericFilterBean。再进入GenericFilterBean


GenericFilterBean继承了Filter。再进去Filter

再进Filter。这是javax.servlet包下的一个接口。
 
任何继承了Filter这个接口的类。比如说我们写的这个类RateLimitFilter。SpringBoot会自动的把它加到Web应用的过滤器链上,只要把它声明称@Component 其他的不用配置

create是一个静态方法,它会帮你创建一个流控的控制器。

默认情况下就是每秒的请求数为1,1秒一个请求。

它还包含了其他参数,可以指定时间单位。不指定的话默认是就是1秒。

然后在过滤器里面做一个判断就可以了。在http请求里面,当一个请求过多 有一个固定的状态码429,当请求大道了限流,就会设置请求的状态码为429

把错误信息输出,然后刷一下write。最后返回。

以上就是一个最简单的限流器。

@Component
public class RateLimitFilter extends OncePerRequestFilter {
    //create是一个静态方法,它会帮你创建一流控的控制器
    private RateLimiter rateLimit= RateLimiter.create(1);
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        if(rateLimit.tryAcquire()){
            filterChain.doFilter(request,response);
        }else{
            response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());//403错误
            response.getWriter().write("too many request!!!!");
            response.getWriter().flush();
            return;
        }
    }
}

测试



如果很快的去刷新页面

返回的状态码就是429

 

结束

原文地址:https://www.cnblogs.com/wangjunwei/p/11898913.html