Spring Cloud微服务安全实战_3-3_API安全之流控
这几篇将API安全的 流控、认证、审计、授权 简单的过一遍,对这些概念先有个初步印象。后边还会详细讲解。
本篇说API安全之流控~第一印象。
一、概念
流控,流量控制,只放系统能处理的请求的数量过去,处于api安全链路的第一关。
为什么要做流控?保证系统的可用性,防止大流量把系统给压死。流控的位置做在认证、审计、授权等整个安全机制的最前边,提前控制流量,避免其他无用的资源浪费。
如果没有流控放在第一道档线,攻击者弄一堆肉鸡,发起DDOS攻击,即使你后边的认证、审计、授权 做得再好,也可能把你的服务压死。
比如系统每秒只能处理500个请求,那么每秒就放500个请求过去,多了的请求直接拒绝掉,这样的话系统不会被压死。实际中的流控是非常复杂的,不是简单地设个数就完了。
二,流控做在哪?
实际开发中限流可以在很多地方做的, 比如:
1,在负载均衡上做,
2,在反向代理上做,
在负载均衡或反向代理层面上做限流,实际上一般是针对真个集群做的限流。比如你一个用户服务,实际部署的时候可能是四个机器或者八个机器的集群,在负载均衡或反向代理层面做的集群就是真对整个集群做的限流,整个集群能撑多少流量,做个限流。
3,在自己的应用代码上做。
只针对单个应用的节点做的流控,跟反向代理、负载均衡做的限流不是一个维度的,如果能配的话,把两边都配上,他们并不冲突。后边会介绍通过框架控制集群的流量。
三,使用Guava做简单的限流
在pom引入最新的guava依赖
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.1-jre</version>
</dependency>
项目:

写一个限流的过滤器:
package com.nb.security.filter; import com.google.common.util.concurrent.RateLimiter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* 继承 OncePerRequestFilter 保证过滤器里的逻辑在一个请求里只会被过滤一次
* 在SpringBoot里,任何实现了Filter接口的类,SpringBoot会自动把它加到web应用的过滤器链里,只要声名为Component就行了
*/
@Order(1)//执行顺序
@Component
public class RateLimitFilter extends OncePerRequestFilter {// //每秒1个请求的限流器
private RateLimiter rateLimiter = RateLimiter.create(1); protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.err.println("++++流控++++"); if (rateLimiter.tryAcquire()) {
//如果没达到限流阈值,放行
filterChain.doFilter(request, response);
} else {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());//429请过过多
response.getWriter().write("too many request!");
response.getWriter().flush();
return ;
}
}
}
调用用户查询接口,使劲刷新,就返回429

这个是个简单的例子, 实际中的流控,比这个要复杂的多,比如可以根据用户来限流,VIP用户每秒500请求,普通用户每秒50请求,这样大量请求过来了,VIP用户没什么感觉可以正常访问,普通用户就被拒绝了。
代码:https://github.com/lhy1234/springcloud-security/tree/master/nb-user-api
++++++++++++++++++++++++分割线++++++++++++++++++++++++
小结:
1,流控概念:流量控制
2,流控位置:负载均衡、反向代理、应用逻辑
3,guava做简单的限流,对限流有个第一印象
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-2_常见的微服务安全整体架构
这个图适用于中小公司的微服务架构 微服务:SpringBoot 写的Rest服务 服务注册与发现:微服务所必备的.每个微服务都会到上边去注册.不管是微服务之间的调用,还是服务网关到微服务的转发,都是通 ...
- 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提供了工具,帮你在微服务之间传递 ...
随机推荐
- SpringBoot集成Spring Security(3)——异常处理
源码地址:https://github.com/jitwxs/blog_sample 文章目录 一.常见异常二.源码分析三.处理异常不知道你有没有注意到,当我们登陆失败时候,Spring securi ...
- python数据分析开发中的常用整理
Pandas操作 python使用pandas读取csv import pandas as pd #数据筛选 usetTable = pd.read_csv(filename,header = 0) ...
- 使用Django创建RESTful API
Agenda 1.What is an api Api refers to application programming interface It is a set of subroutine de ...
- bizcharts 图表内容居中
当图表内的数据只有一组时,会紧靠在y轴上,如下图: 想要图表的内容居中,解决方法分两种情况. 第一种:如果x轴是日期,则代码设置如下,图表的内容就居中了 const cols = { x: { ali ...
- ForkJoin和流式操作
Fork/Join框架:在必要的情况下,将一个大任务,进行拆分(fork) 成若干个子任务(拆到不能再拆,这里就是指我们制定的拆分的临界值),再将一个个小任务的结果进行join汇总. 采用juc包的f ...
- C# Thread was being aborted
先重现问题 1.新建一个aspx页面项目,插入两个页面WebForm1.aspx,WebForm2.aspx, WebForm1代码修改如下 protected void Page_Load(obje ...
- Matlab中添加语音处理(voicebox)工具箱
系统环境 win10+Matlab2017b 下载voicebox工具箱 官方下载:http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.zip ...
- centos7安装pyenv
一.安装pyenv: 1.>安装依赖包: yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel ...
- python爬取豆瓣电影首页超链接
什么是爬虫? 我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛.把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息.可以把节点间的连线比作网页与网页之间的链 ...
- C语言语法教程-结构体
2018-09-30 结构体中成员变量地址是连续的,结构体用于描述记录. Create a struct //---------------------------- //struct1.c //创建 ...