成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Springboot使用redis實現接口Api限流的實例

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

Springboot使用redis實現接口Api限流的實例

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

正文

慣例,先看下我們的實戰目錄結構:

Springboot使用redis實現接口Api限流的實例

首先是pom.xml 核心依賴:

<!--用于redis數據庫連接--><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:#連接池最大連接數 使用負值代表無限制 默認為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);//序列化設置 ,這樣為了存儲操作對象時正常顯示的數據,也能正常存儲和獲取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 { /** * 時間內 秒為單位 */ int second() default 10; /** * 允許訪問次數 */ int maxCount() default 5; //默認效果 : 10秒內 對于使用該注解的接口,只能總請求訪問數 不能大于 5次 }

接下來是攔截器 RequestLimitInterceptor.java:

攔截接口的方式 是通過 ip地址+接口url ,做時間內的訪問計數

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();//時間內的 最大次數int maxCount = requestLimit.maxCount();String ipAddr = IpUtil.getIpAddr(request);// 存儲keyString key = ipAddr+':'+request.getContextPath() + ':' + request.getServletPath();// 已經訪問的次數Integer count = (Integer) redisTemplate.opsForValue().get(key);log.info('檢測到目前ip對接口={}已經訪問的次數', 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();//這里傳提示語可以改成自己項目的返回數據封裝的類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('/**')//再設置 放開哪些路徑.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 '你好,如果對你有幫助,請點贊加關注。'; } }

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

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

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

Springboot使用redis實現接口Api限流的實例

Springboot使用redis實現接口Api限流的實例

第四次:

Springboot使用redis實現接口Api限流的實例

到此這篇關于Springboot使用redis實現接口Api限流的實例的文章就介紹到這了,更多相關Springboot redis接口Api限流內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品欧美黑人一区二区三区| 不卡视频在线看| 久久狠狠亚洲综合| 国产精品毛片在线| 国产三级一区二区三区| 成人激情免费网站| 宅男在线国产精品| 看片的网站亚洲| 一本一道久久a久久精品综合蜜臀| 亚洲日本在线天堂| 欧美精品v日韩精品v国产精品| www国产精品av| 波多野结衣中文字幕一区二区三区 | 狠狠色综合播放一区二区| 色成年激情久久综合| 亚洲一区二区三区在线看| 亚洲二区三区四区| 亚洲人成电影网站色mp4| 国内精品久久国产| 中日韩免费视频中文字幕| 欧美一区二区三区四区在线观看地址| 欧美大片一区二区| 成人av电影在线| 精品久久久久一区| 你懂的一区二区| 国产精品女主播av| 悠悠资源网久久精品| 亚洲视频一区在线观看| 亚洲午夜精品国产| 亚洲综合偷拍欧美一区色| 99av国产精品欲麻豆| 亚洲一区欧美一区| 一本色道久久综合精品竹菊| 日韩中文字幕不卡| 欧美日韩在线不卡| 国产一区二区日韩精品| 日韩手机在线导航| 色综合中文综合网| 99国产精品久| 国产精品看片你懂得| 亚洲免费大片| 日韩福利视频网| 欧美三区在线观看| 丁香婷婷综合激情五月色| 久久精品亚洲精品国产欧美 | 欧美一级一级性生活免费录像| 成人av在线一区二区三区| 国产亚洲成aⅴ人片在线观看| 国产欧美一级| 欧美aaaaaa午夜精品| 日韩一区二区三区四区| 欧美一区二区三区久久精品| 亚洲色图欧美在线| 一本一本大道香蕉久在线精品| 国产一区二区日韩精品| 久久精品一区蜜桃臀影院| 亚洲精品黄色| 另类调教123区| 精品少妇一区二区三区视频免付费| 欧美三区在线| 日韩精品福利网| 精品国产免费视频| 一本一本a久久| 狠狠色狠狠色综合| 欧美韩国日本一区| 久久久久高清| 不卡的av在线| 亚洲香肠在线观看| 日韩免费观看2025年上映的电影 | 国产精品夜夜爽| 欧美日韩国产色综合一二三四| 亚洲一区二区三区爽爽爽爽爽| 欧美视频一区二| 99久久精品99国产精品| 亚洲日本韩国一区| 欧美色精品在线视频| 91免费版pro下载短视频| 亚洲高清免费一级二级三级| 在线综合视频播放| 在线观看成人一级片| 免费成人av在线| 久久久久久久综合| 午夜亚洲福利在线老司机| 国产精品自拍毛片| 国产精品久久久久aaaa| 欧美三片在线视频观看| 欧美视频亚洲视频| 亚洲欧美影音先锋| 91精品国产91热久久久做人人 | 精品噜噜噜噜久久久久久久久试看| 亚洲国产一区二区三区在线播| 美国一区二区三区在线播放| 中文字幕高清不卡| 欧美日韩精品福利| 国产日韩欧美一区二区三区四区| 国产大陆精品国产| 亚洲一区二区在线免费看| 欧美tickling网站挠脚心| 亚洲一区激情| 97久久久精品综合88久久| 三级久久三级久久| 亚洲国产高清在线| 制服丝袜激情欧洲亚洲| 国产精品视区| 色综合久久综合网| 国模无码大尺度一区二区三区| 亚洲老妇xxxxxx| 精品国产乱子伦一区| 日本黄色一区二区| 亚洲国产欧美日韩| 成人免费av网站| 秋霞国产午夜精品免费视频| 中文字幕一区二区视频| 欧美一级生活片| 色哟哟在线观看一区二区三区| 欧美性天天影院| 国产91在线观看| 蜜桃av噜噜一区| 一区二区三区不卡视频| 久久久噜噜噜久久中文字幕色伊伊| 欧美色涩在线第一页| 国产精品一区二区三区四区五区 | 美女网站在线免费欧美精品| 国产精品黄色在线观看| 日韩欧美另类在线| 欧美视频第二页| 99在线热播精品免费99热| 欧美激情精品久久久六区热门| 国内偷窥港台综合视频在线播放| 一区二区三区 在线观看视频| 国产亚洲欧美色| 日韩一级欧美一级| 欧美日韩亚洲综合一区| 久久网站免费| 亚洲开发第一视频在线播放| 91麻豆福利精品推荐| 懂色av一区二区夜夜嗨| 奇米精品一区二区三区在线观看一 | 成人美女视频在线观看| 免费欧美日韩国产三级电影| 亚洲夂夂婷婷色拍ww47| 亚洲人成网站精品片在线观看| 欧美一区二区三区在线| 欧美专区亚洲专区| 久热精品在线| 国产乱人伦精品一区二区| 亚洲欧洲精品一区| 国产中文一区| 欧美日韩亚洲一区三区| 99热精品国产| 国产成人99久久亚洲综合精品| 久久99精品久久久久婷婷| 日韩在线卡一卡二| 亚洲成a天堂v人片| 亚洲午夜国产一区99re久久| 亚洲欧美偷拍卡通变态| 最近日韩中文字幕| 亚洲欧洲在线观看av| 国产精品福利电影一区二区三区四区| 日本一区二区视频在线观看| 久久久久久久免费视频了| 久久影院电视剧免费观看| 欧美精品一区二区三区在线播放| 欧美视频一区二区三区在线观看| 精品亚洲成av人在线观看| 亚洲精品中文字幕乱码三区 | 亚洲欧美日韩国产一区| 日韩一级精品| 一区二区三区精品视频在线观看| 亚洲高清成人| 亚洲经典三级| 亚洲精品视频一区二区三区 | 亚洲一区免费观看| 亚洲国产中文字幕在线视频综合 | 水野朝阳av一区二区三区| 性做久久久久久久免费看| 亚洲小说欧美激情另类| 午夜视频一区在线观看| 日韩不卡免费视频| 久草热8精品视频在线观看| 国内成人免费视频| 国产精品99久久不卡二区| 成人免费观看视频| 北条麻妃一区二区三区| 99精品桃花视频在线观看| 暖暖成人免费视频| 欧美精品三区| 亚洲激情一区二区| 亚洲一区二区在线看| 久久久久久网| 欧美日韩一区二区三区在线| 亚洲精品视频一区| 午夜影院在线观看欧美| 老司机午夜精品99久久| 国产黄色91视频| 91在线视频在线| 激情综合亚洲| 西西人体一区二区| 欧美体内she精视频| 91精品国产综合久久福利软件|