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();
@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

结束
Spring cloud微服务安全实战-3-3 API安全机制之流控的更多相关文章
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
- Spring cloud微服务安全实战-6-4权限控制改造
授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...
- Spring cloud微服务安全实战-6-2JWT认证之认证服务改造
首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递 ...
- Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)
授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. ord ...
随机推荐
- 神经网络MNIST数据集分类tensorboard
今天分享同样数据集的CNN处理方式,同时加上tensorboard,可以看到清晰的结构图,迭代1000次acc收敛到0.992 先放代码,注释比较详细,变量名字看单词就能知道啥意思 import te ...
- CH5E26 扑克牌
题意 5E26 扑克牌 0x5E「动态规划」练习 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 张牌中的若干张,请计算将它们排成一列, ...
- Oracle密码过期 ORA-28002:口令将过期 解决方法
登录Pl/sql或导出数据时,得到的提示信息: UDE-28002: 操作产生了 Oracle 错误 28002ORA-28002: the password will expire within 7 ...
- git教程——简单总结
1 创建版本库: 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: (1)使用命令git add <file>,注意,可反复多次使用,添加多个文件: (2) ...
- 题解 UVa11889
题目大意 \(T\) 组数据,每组数据给定两个正整数 \(A,C\),求使 \(LCM(A,B)=C\) 的最小的 \(B\),若无解则输出NO SOLUTION. 分析 当 \(C\%A=0\) 时 ...
- python logging 重定向print(标准输入输出)
重定向print输出到Mongo celery 本身用到logging.info 会输出 是celery的问题,还是logging初始化的时候就会有输出? 好像是celery 配合logging的问题 ...
- python同时取每个列表的第一个元素
在实际爬虫开发中, 经常用到列表保存数据, 在使用这些数据的时候,需要要取每个列表里的第一个元素进行拼接. 就需要用到python的内置方法:“zip()" # 现在有3个列表:li_1, ...
- Linux 文件系统缓存 -针对不同数据库有不同作用
文件系统缓存 filesystem cache 许多人没有意识到.文件系统缓存对于性能的影响.Linux系统默认的设置倾向于把内存尽可能的用于文件cache,所以在一台大内存机器上,往往我们可能发现没 ...
- mpvue搭建小程序框架
http://mpvue.com/mpvue/ 美团开源了mpvue 由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler) 运行时框架 runtime 和代码编译器 c ...
- php-fpm 参数调优
php-fpm 进程池优化方法 php-fpm进程池开启进程有两种方式,一种是static,直接开启指定数量的php-fpm进程,不再增加或者减少:另一种则是dynamic,开始时开启一定数量的php ...