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 ...
随机推荐
- 利用Python3的requests和re库爬取猫眼电影笔记
以下笔记,作为参考借鉴,如有疑问可以联系我进行交流探讨! 代码思路很简单,简单概括为: 首先利用requests的get方法获取页面的html文件,之后对得到的html文件进行相对应的正则处理,然 ...
- vscode——配置go插件
前言 这个真的折腾死我了,看了N多博客才弄好 这两个还是比较有用的~ https://www.cnblogs.com/nickchou/p/9038114.html https://www.jians ...
- LightOJ - 1067 - Combinations(组合数)
链接: https://vjudge.net/problem/LightOJ-1067 题意: Given n different objects, you want to take k of the ...
- php自定义函数之参数的引用
在变量这个函数中,我们学习了变量的引用,我们来回顾一下知识:大理石平台支架 <?php $a = 10; $b = &$a; $a = 100; echo $a.'---------'. ...
- ASM磁盘组的监控
ASM磁盘组的监控可以使用oracle数据库查询,需要使用到的是sql语句和oracle数据库的相关操作. 还可以使用命令行进行查询,然后用awk进行文本拆分,拿到需要的值.这个需要使用到的是sudo ...
- 【微信小程序】如何获取用户绑定手机号
用户调用wx.login()方法,获取登录用户凭证code wx.login({ success: function(res) { console.log('loginCode', res.code) ...
- CF gym 100962D Deep Purple [后缀树,树链剖分,线段树]
Codeforces 思路 感觉这个离线的思路好神仙啊qwq 对于每个询问\([l,r]\)其实就是要求\(p_{max}\),使得\(lcs(s[1,p],s[1,r])>p-l\),也就是\ ...
- Atcoder Grand Contest 026 (AGC026) F - Manju Game 博弈,动态规划
原文链接www.cnblogs.com/zhouzhendong/AGC026F.html 前言 太久没有发博客了,前来水一发. 题解 不妨设先手是 A,后手是 B.定义 \(i\) 为奇数时,\(a ...
- [CF 718C] Sasha and Array
传送门 Solution 用线段树维护矩阵 第一个操作相当于区间乘 第二个操作相当于区间求和 Code #include<bits/stdc++.h> #define ll long l ...
- Leetcode84. 柱状图中最大的矩形(单调栈)
84. 柱状图中最大的矩形 前置 单调栈 做法 连续区间组成的矩形,是看最短的那一块,求出每一块左边第一个小于其高度的位置,右边也同理,此块作为最短限制.需要两次单调栈 单调栈维护递增区间,每次不满足 ...