日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Springboot使用redis實現(xiàn)接口Api限流的實例

瀏覽:49日期:2023-02-22 11:36:09
前言

Springboot使用redis實現(xiàn)接口Api限流的實例

該篇介紹的內(nèi)容如題,就是利用redis實現(xiàn)接口的限流( 某時間范圍內(nèi) 最大的訪問次數(shù) ) 。

正文

慣例,先看下我們的實戰(zhàn)目錄結(jié)構(gòu):

Springboot使用redis實現(xiàn)接口Api限流的實例

首先是pom.xml 核心依賴:

<!--用于redis數(shù)據(jù)庫連接--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--用于redis lettuce 連接池pool使用--><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>

然后是application.yml里面的redis接入配置:

spring: redis: lettuce: pool:#連接池最大連接數(shù) 使用負值代表無限制 默認為8max-active: 10#最大空閑連接 默認8max-idle: 10#最小空閑連接 默認0min-idle: 1 host: 127.0.0.1 password: 123456 port: 6379 database: 0 timeout: 2000msserver: port: 8710

redis的配置類, RedisConfig.java:

ps:可以看到日期是18年的,因為這些redis的整合教程,在這個系列里面一共有快10篇,不了解的看客如果感興趣可以去看一看。

import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext;import org.springframework.data.redis.serializer.StringRedisSerializer; import static org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig; /** * @Author: JCccc * @CreateTime: 2018-09-11 * @Description: */@Configuration@EnableCachingpublic class RedisConfig { @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration cacheConfiguration =defaultCacheConfig().disableCachingNullValues().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer(Object.class)));return RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).build(); } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(factory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);//序列化設(shè)置 ,這樣為了存儲操作對象時正常顯示的數(shù)據(jù),也能正常存儲和獲取redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);return redisTemplate; } @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();stringRedisTemplate.setConnectionFactory(factory);return stringRedisTemplate; }}

自定義注解:

import java.lang.annotation.*; /** * @Author JCccc * @Description * @Date 2021/7/23 11:46 */@Inherited@Documented@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface RequestLimit { /** * 時間內(nèi) 秒為單位 */ int second() default 10; /** * 允許訪問次數(shù) */ int maxCount() default 5; //默認效果 : 10秒內(nèi) 對于使用該注解的接口,只能總請求訪問數(shù) 不能大于 5次 }

接下來是攔截器 RequestLimitInterceptor.java:

攔截接口的方式 是通過 ip地址+接口url ,做時間內(nèi)的訪問計數(shù)

import com.elegant.testdemo.annotation.RequestLimit;import com.elegant.testdemo.utils.IpUtil;import com.fasterxml.jackson.databind.ObjectMapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;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;import java.io.IOException;import java.util.concurrent.TimeUnit; /** * @Author JCccc * @Description * @Date 2021/7/23 11:49 */ @Componentpublic class RequestLimitInterceptor implements HandlerInterceptor { private final Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired private RedisTemplate<String, Object> redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {try { if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;// 獲取RequestLimit注解RequestLimit requestLimit = handlerMethod.getMethodAnnotation(RequestLimit.class);if (null==requestLimit) { return true;}//限制的時間范圍int seconds = requestLimit.second();//時間內(nèi)的 最大次數(shù)int maxCount = requestLimit.maxCount();String ipAddr = IpUtil.getIpAddr(request);// 存儲keyString key = ipAddr+':'+request.getContextPath() + ':' + request.getServletPath();// 已經(jīng)訪問的次數(shù)Integer count = (Integer) redisTemplate.opsForValue().get(key);log.info('檢測到目前ip對接口={}已經(jīng)訪問的次數(shù)', request.getServletPath() , count);if (null == count || -1 == count) { redisTemplate.opsForValue().set(key, 1, seconds, TimeUnit.SECONDS); return true;}if (count < maxCount) { redisTemplate.opsForValue().increment(key); return true;}log.warn('請求過于頻繁請稍后再試');returnData(response);return false; } return true;} catch (Exception e) { log.warn('請求過于頻繁請稍后再試'); e.printStackTrace();}return true; } public void returnData(HttpServletResponse response) throws IOException {response.setCharacterEncoding('UTF-8');response.setContentType('application/json; charset=utf-8');ObjectMapper objectMapper = new ObjectMapper();//這里傳提示語可以改成自己項目的返回數(shù)據(jù)封裝的類response.getWriter().println(objectMapper.writeValueAsString('請求過于頻繁請稍后再試'));return; } }

接下來是 攔截器的配置 WebConfig.java:

import com.elegant.testdemo.interceptor.RequestLimitInterceptor;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; /** * @Author JCccc * @Description * @Date 2021/7/23 11:52 */ @Configurationpublic class WebConfig implements WebMvcConfigurer { @Autowired private RequestLimitInterceptor requestLimitInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(requestLimitInterceptor) //攔截所有請求路徑.addPathPatterns('/**')//再設(shè)置 放開哪些路徑.excludePathPatterns('/static/**','/auth/login'); } }

最后還有兩個工具類

IpUtil:

https://www.jb51.net/article/218249.htm

RedisUtil :

https://www.jb51.net/article/218246.htm

最后寫個測試接口

TestController.java

import com.elegant.testdemo.annotation.RequestLimit;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController; /** * @Author JCccc * @Description * @Date 2021/7/23 11:55 */@RestControllerpublic class TestController { @GetMapping('/test') @RequestLimit(maxCount = 3,second = 60) public String test() {return '你好,如果對你有幫助,請點贊加關(guān)注。'; } }

這個/test接口的注解,我們設(shè)置的是 60秒內(nèi) 最大訪問次數(shù)為 3次 (實際應用應該是根據(jù)具體接口做相關(guān)的次數(shù)限制。)

然后使用postman測試一下接口:

前面三次都是請求通過的:

Springboot使用redis實現(xiàn)接口Api限流的實例

Springboot使用redis實現(xiàn)接口Api限流的實例

第四次:

Springboot使用redis實現(xiàn)接口Api限流的實例

到此這篇關(guān)于Springboot使用redis實現(xiàn)接口Api限流的實例的文章就介紹到這了,更多相關(guān)Springboot redis接口Api限流內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品乱码日韩| 亚洲一区二区小说| 亚洲主播在线| 亚洲一区二区网站| 综合在线一区| 国产精品1区| 欧美激情91| 亚洲一区久久| 中文字幕成在线观看| 久久uomeier| 91精品国产自产精品男人的天堂| 国产精品a级| 精品伊人久久久| 国产精品人人爽人人做我的可爱| 麻豆国产精品一区二区三区| 久久aⅴ国产紧身牛仔裤| 精品亚洲成人| 亚洲高清久久| 亚洲一区二区av| 91亚洲无吗| 91精品电影| 国产精品久久久久久av公交车| 日韩综合一区| 欧美偷窥清纯综合图区| 久久精品国产68国产精品亚洲| 国产精品毛片在线| 成人国产综合| 日韩国产精品久久久| 麻豆国产欧美一区二区三区| 亚洲免费资源| 久久婷婷亚洲| 日本在线不卡视频一二三区| 高清不卡一区| 伊人久久亚洲美女图片| 日韩精品视频在线看| 国产一区91| 免费观看久久av| 免费的成人av| 欧美在线亚洲| 欧美久久天堂| 午夜久久av| 老司机久久99久久精品播放免费| 精品国产一区二区三区噜噜噜| 国产激情在线播放| 日韩精品一页| 免费观看在线综合| 精品99在线| 日韩专区一卡二卡| 在线亚洲免费| 国产一区二区三区网| 91精品尤物| 国产欧美一区二区三区国产幕精品 | 欧洲在线一区| 精品九九久久| 国产伦精品一区二区三区千人斩| 国产在线视频欧美一区| 成人国产精选| 中文字幕在线视频久| 99精品视频在线| 亚洲高清二区| 亚洲深夜av| 你懂的网址国产 欧美| 国产剧情一区| 精品久久美女| 欧美精品三级在线| 国产精品s色| 成人亚洲一区二区| 日韩精品国产欧美| 青青草视频一区| 麻豆久久久久久久| 日韩欧美三级| 青青久久av| 影音先锋国产精品| 久久高清精品| 鲁大师精品99久久久| 最新亚洲国产| 国产精品久久久久久久久久齐齐| 国产一区日韩一区| 亚洲啊v在线免费视频| 欧美日本久久| 日韩区欧美区| 麻豆国产精品视频| 成人午夜精品| 久久精品国产99国产| 日韩专区精品| 免费观看久久久4p| 国产亚洲午夜| 69精品国产久热在线观看| 香蕉久久一区| 久久国产精品99国产| 日韩av中文字幕一区| 岛国av在线播放| 国产aⅴ精品一区二区四区| 欧美va亚洲va日韩∨a综合色| 久久国产主播| 天堂中文av在线资源库| 影音先锋久久| 少妇精品久久久一区二区| 免费黄网站欧美| 麻豆国产精品一区二区三区| 久久精品一区二区国产| 婷婷丁香综合| 精品欧美日韩精品| 国产精品网站在线看| 水蜜桃久久夜色精品一区| 红桃视频国产一区| 影院欧美亚洲| 久久女人天堂| 亚洲神马久久| 一区二区国产在线观看| 加勒比视频一区| 国产伦一区二区三区| 国产在线欧美| 老牛国内精品亚洲成av人片| 福利一区视频| 亚洲精品进入| 日韩精品网站| 国产亚洲一区在线| 久久国产三级| 狠狠干成人综合网| 色综合视频一区二区三区日韩| 亚洲精品**中文毛片| 免费观看不卡av| 免播放器亚洲一区| 99免费精品| 日韩在线观看一区二区| 久久男女视频| 国产精品一区二区免费福利视频 | 亚洲一区二区三区无吗| 日韩在线视频精品| 欧美一区网站| 欧美有码在线| 午夜在线一区二区| 中文在线а√天堂| 夜久久久久久| 日韩免费久久| 国产精品欧美一区二区三区不卡| 99国产精品自拍| 日韩精品永久网址| 精品欧美日韩精品| 美国三级日本三级久久99| 久久国产毛片| 日韩在线看片| 精品视频久久| 日韩精品一级中文字幕精品视频免费观看 | 国产精品亚洲欧美一级在线| 另类综合日韩欧美亚洲| 日韩动漫一区| 日韩在线卡一卡二| 久久久91麻豆精品国产一区| 亚洲一区二区三区无吗| 日韩毛片在线| 亚洲最新无码中文字幕久久 | 国产一区视频在线观看免费| 麻豆成人91精品二区三区| 久久激情中文| 国产欧美一区二区三区精品酒店| 国产精品久久| 欧美美女一区| 精品国产麻豆| 日韩毛片视频| 国产欧洲在线| 国产精品麻豆久久| 亚洲精品一级| 99亚洲视频| 神马午夜在线视频| 日韩精品一页| 日韩精品一区二区三区中文| 日本中文字幕一区二区| 91精品综合| 99精品视频精品精品视频| 国产精品毛片久久久| 国产精品久久| 美女久久久久久| 少妇精品久久久一区二区| 日韩欧美久久| 日韩av电影一区| 精品国产午夜肉伦伦影院| 久久久国产精品入口麻豆| 爽爽淫人综合网网站| 激情婷婷久久| 欧美~级网站不卡| 精品国产免费人成网站| 久久精品91| 另类综合日韩欧美亚洲| 亚洲美女久久精品| 狠狠色综合网| 欧美日韩99| 免费亚洲婷婷| 欧美亚洲一区二区三区| 久久一区视频| 中文另类视频| 福利一区在线| 伊人成人网在线看| 99久久亚洲精品蜜臀| 精品日韩视频| 日韩一区二区免费看| 日本精品影院| 欧美不卡视频| 亚洲免费一区二区|