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 ...
随机推荐
- (java)selenium webdriver学习--打开新窗口,并判断新窗口是否与目标窗口一致
描述:selenium webdriver学习--打开新窗口,并判断新窗口是否与目标窗口一致,若一致则切换到该窗口并获取标题 跳出if判断,获取父级标题,并关闭 HTML标签不太明显时,可以用路径表示 ...
- c# DES 加密解密方法
#region 密钥 private static string key = "abcd1234"; //密钥(长度必须8位以上) #endregion #region DES加密 ...
- Nginx页面图片错误 ERR_CONTENT_LENGTH_MISMATCH
现场:nginx代理的网站有的虚拟目录的图片无法正常显示,提示 ERR_CONTENT_LENGTH_MISMATCH,不断刷新页面图片一条一条的显示出来. 解决方法:找到nginx的缓存文件目录,c ...
- Eclipse的tab键为4个空格完整方法 附:阿里代码开发规范书
开发规范书:http://pan.baidu.com/s/1dESdyox 1.点击 window->preference-,依次选择 General->Editors->Text ...
- 有关 Java (jackson包问题 ,MappingJacksonHttpMessageConverter 和 MappingJackson2HttpMessageConverter问题)
今天这一系列问题吃掉我四个小时,所以现在吸收掉. 一. 整理所有错误信息: 1.错误信息:java.lang.NoClassDefFoundError: Could not initialize cl ...
- set/priority_queue的运算符重载
#include<bits/stdc++.h> using namespace std; struct cmp { bool operator ()(int a, int b) //重载小 ...
- CodeForces - 55D - Beautiful numbers(数位DP,离散化)
链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ...
- SpringMVC的数据效验
Spring MVC本身没有数据校验的功能,它使用Hibernate的校验框架来完成. 1.导入pom节点 <!-- https://mvnrepository.com/artifact/org ...
- S1_搭建分布式OpenStack集群_01 准备虚拟机
Openstack版本:openstack-queen 版本 一.环境准备 网络规划: Management + API Network:10.10.11.0/24 eth1 网桥:br1 VM ...
- web文件上传下载组件
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...