点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试资料

作者: 海向
来源: cnblogs.com/haixiang/p/12012728.html

api限流的场景

限流的需求出现在许多常见的场景中

1.秒杀活动,有人使用软件恶意刷单抢货,需要限流防止机器参与活动

2.某api被各式各样系统广泛调用,严重消耗网络、内存等资源,需要合理限流

3.淘宝获取ip所在城市接口、微信公众号识别微信用户等开发接口,免费提供给用户时需要限流,更具有实时性和准确性的接口需要付费。

api限流实战

首先我们编写注解类AccessLimit,使用注解方式在方法上限流更优雅更方便!三个参数分别代表有效时间、最大访问次数、是否需要登录,可以理解为 seconds 内最多访问 maxCount 次。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AccessLimit {int seconds();int maxCount();boolean needLogin() default true;
}

限流的思路

1.通过路径:ip的作为key,访问次数为value的方式对某一用户的某一请求进行唯一标识

2.每次访问的时候判断key是否存在,是否count超过了限制的访问次数

3.若访问超出限制,则应response返回msg:请求过于频繁给前端予以展示

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class AccessLimtInterceptor implements HandlerInterceptor {@Autowiredprivate RedisService redisService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {HandlerMethod hm = (HandlerMethod) handler;AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);if (null == accessLimit) {return true;}int seconds = accessLimit.seconds();int maxCount = accessLimit.maxCount();boolean needLogin = accessLimit.needLogin();if (needLogin) {//判断是否登录}String key = request.getContextPath() + ":" + request.getServletPath() + ":" + ip ;Integer count = redisService.get(key);if (null == count || -1 == count) {redisService.set(key, 1);redisService.expire(seconds);return true;}if (count < maxCount) {redisService.inCr(key);return true;}if (count >= maxCount) {
// response 返回 json 请求过于频繁请稍后再试return false;}}return true;}
}

注册拦截器并配置拦截路径和不拦截路径

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;// extends WebMvcConfigurerAdapter 已经废弃,java 8开始直接继承就可以
@Configuration
public class IntercepterConfig  implements WebMvcConfigurer {@Autowiredprivate AccessLimtInterceptor accessLimtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(accessLimtInterceptor).addPathPatterns("/拦截路径").excludePathPatterns("/不被拦截路径 通常为登录注册或者首页");}
}

Controller层的方法上直接可以使用注解@AccessLimit

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("test")
public class TestControler {@GetMapping("accessLimit")@AccessLimit(seconds = 3, maxCount = 10)public String testAccessLimit() {//xxxxreturn "";}
}

说句题外话,springboot全家桶技术交流群可以加我微信,但是坑位有限哦,由于忙于工作,有时不能及时回复大家,请多包涵。

热门内容:
Mybatis:颠覆你心中对事务的理解为什么强烈推荐 Java 程序员使用 Google Guava 编程!IntelliJ IDEA 快捷键终极大全,速度收藏!「Jenkins+Git+Maven+Shell+Tomcat持续集成」经典教程  线上服务 CPU 又 100% 啦?一键定位 so easy!
GitHub 上有个沙雕开发者,做了款斗图工具后火了...大白话带你认识Kafka
如何参与一个顶级开源项目    深入理解 Spring Cloud 核心组件与底层原理最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

公司的API接口被刷了,那是因为你没这样做相关推荐

  1. 公司的API接口被刷了,那是因为你没这样做!

    作者: 海向 来源: cnblogs.com/haixiang/p/12012728.html api限流的场景 限流的需求出现在许多常见的场景中 1.秒杀活动,有人使用软件恶意刷单抢货,需要限流防止 ...

  2. 用python依赖地图公司的API接口和SDK实现道路数据可视化分析

    今天我们用python来获取道路数据,并根据数据进行简化和可视化分析 当今社会每个人都离不开导航 除了开车用导航外,其实走路.骑车.公交都可以导航 选址和找餐厅.酒店也需要 如果一个城市能够标注所以公 ...

  3. 如何使用用友接口,进行API接口开发, 你烦恼了没?

    本来以前还没有写博客的习惯,最近,很多开发小伙伴联系我,吐槽了一翻,第一次接触U8接口开发,脑袋都是懵的.不是这里报错,就是那里报错,对于U8API开发,是的,这是一项技术活,更是一项体力活.先前没有 ...

  4. A股公司基本面数据API接口(JSON标准格式,Get请求方式)

    数据来源:麦蕊智数(www.mairui.club) 公司简介 ·  API接口:http://api.mairui.club/hscp/gsjj/股票代码(如000001)/您的licence · ...

  5. api接口返回动态的json格式?我太难了,尝试一下 linq to json

    一:背景 1. 讲故事 前段时间和一家公司联调api接口的时候,发现一个奇葩的问题,它的api返回的json会动态改变,简化如下: {"Code":101,"Items& ...

  6. 移动端API接口优化的术和结果

    最近一直在忙工作的事情,所以文章写得有些少. 有3-5篇文章都是写到一半然后被别的事情给打断了,所以,我得找个时间好好补补. 最近一直在关注移动端接口API的可用性问题,在移动时代这个做这个优化能产生 ...

  7. 如何调用股票交易软件api接口?

    随着人们的生活水平越来越高,人们可以通过公司的股票交易软件api接口来查询股票,也可以用股票交易软件api接口来了解股市,采用正规的界面可以确保数据的准确性,及时的根据股价的涨跌幅度做出一些选择,所以 ...

  8. 【免费股票数据接口|实测可用|史上最全】沪深A股实时交易数据数据API接口

    沪深A股基础实时数据API 数据来源:麦蕊智数 请求方式:Get(直接在浏览器打开就可以看到返回的数据) 数据格式:标准Json格式[{},...{}] 数据时效:实时更新 API说明文档:https ...

  9. 最新最全的免费股票数据接口--沪深A股基本面数据API接口(四)

    沪深A股基础实时数据API 数据来源:麦蕊智数 请求方式:Get(直接在浏览器打开就可以看到返回的数据) 数据格式:标准Json格式[{},...{}] 数据时效:实时更新 API说明文档:https ...

最新文章

  1. linux valgrind 安装和使用
  2. 2015/4/24~GET方式和POST方式传值大小的限制
  3. php对象和数组的效率,PHP对象数组和一般数组区别
  4. URLEncoder.encode转译后“空格”变“加号”的问题的解决方案
  5. python中间是什么意思_中间代码说明
  6. bat 实现批量备份文件
  7. c++ list box 字体设置_上海印刷字体展示馆 迎来第一批团队参观
  8. JSON的C语言编解码器——cJSON和json-c
  9. 【面试】 C++ 面试题笔记(不定期更新)
  10. android数据存储心得,android学习心得 轻量级存储SharePreferences
  11. 软件工程博客---团队项目---个人设计2(算法)
  12. android中级组件,第3章 Android组件--3.3 Android中级组件【含答案】 Android应用开发基础...
  13. HTTPS时代全面到来,你准备好了吗?
  14. Word 2003特殊符号录入与编辑(转)
  15. php+mysql_msqli简单实例
  16. [软件工程基础]2017.10.30 第三次 Scrum 会议
  17. JavaScript读取JSON文件
  18. 不靠加速器 路由配置也可扭转网游战局
  19. 电阻的种类以及选型要点
  20. html导出excel加边框,利用js对象Blob导出的excel,有办法把表格的边框给浮现出来...

热门文章

  1. Task02:青少年软件编程(Scratch)等级考试模拟卷(一级)
  2. 【直播】陈信达:零基础计算机视觉之机器学习基础
  3. 02 Scratch等级考试(二级)模拟题
  4. 数据结构与算法:12 数组与稀疏矩阵
  5. 【怎样写代码】参数化类型 -- 泛型(八):泛型委托
  6. Matlab与线性代数--矩阵的LU分解
  7. LeetCode刷题-6
  8. 如何使用 Python 隐藏图像中的数据
  9. 达摩院年终预测重磅出炉:AI for Science 高居榜首,2022 十大科技趋势!
  10. 百度携手同济大学,瞄准AI、智慧交通等核心科技领域攻关