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

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

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

瀏覽:46日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
激情视频网站在线播放色| 久久久久黄色| 狠狠躁少妇一区二区三区| 欧美成a人片免费观看久久五月天| 国产午夜一区| 国产精品久久久久久久久妇女| 日韩一区欧美| 狠狠久久婷婷| 国产精品视区| 欧美精品国产| 久久久久99| 亚洲精品日韩久久| 欧美激情麻豆| 久久影院一区| 日韩国产欧美在线播放| 欧美黄色一区| 一区二区三区视频免费观看| 中文字幕免费一区二区| 国产乱码精品| 亚洲网站视频| 日本成人中文字幕在线视频| 久久免费精品| 亚洲欧美日本日韩| 日韩中文字幕一区二区高清99| 欧美日韩夜夜| 欧美日韩在线网站| 国产日韩欧美三级| 久久一级电影| 国产精品黄色| 最新亚洲激情| 日韩av专区| 五月国产精品| 久久久久久久久99精品大| 日韩av影院| 国产99精品一区| 国产精品视频一区二区三区四蜜臂| 欧美日韩精品免费观看视欧美高清免费大片 | 石原莉奈在线亚洲二区| 日本午夜精品视频在线观看| 狠狠躁少妇一区二区三区| 亚洲另类av| 九色porny丨国产首页在线| 亚洲日韩视频| 韩国精品主播一区二区在线观看| 日韩国产在线观看一区| 欧美日韩精品一区二区视频| 国产高清日韩| 欧美不卡视频| 久久精品一区二区国产| 欧美成人国产| 国产在线观看91一区二区三区 | 午夜精品婷婷| 国产夫妻在线| 国产精品视频一区二区三区四蜜臂| 夜夜嗨av一区二区三区网站四季av| 精品国产精品久久一区免费式| 精品在线91| 91日韩欧美| 国产精品一国产精品k频道56| 99国产精品视频免费观看一公开| 国内在线观看一区二区三区| 亚洲深深色噜噜狠狠爱网站 | 国产精品黄色片| 在线观看视频免费一区二区三区| 日韩在线第七页| 狂野欧美性猛交xxxx| 亚洲精品三级| 亚洲综合福利| 香蕉久久夜色精品国产| 亚洲成人精品| 日韩在线观看不卡| 福利片在线一区二区| 国产精品一区二区精品| 视频在线观看国产精品| 欧美+亚洲+精品+三区| 欧美片第1页| 中文av在线全新| 国产一区二区精品久| 国产激情精品一区二区三区| 青草国产精品久久久久久| 一区二区三区网站| 久久高清免费观看| 久久亚洲影院| 蜜桃91丨九色丨蝌蚪91桃色| 欧美日韩激情| 99精品网站| 免费精品国产| 亚洲欧美视频| 视频在线观看国产精品| 久色成人在线| 亚洲啊v在线免费视频| 亚洲精品自拍| 日本va欧美va精品发布| 日本不卡在线视频| 日韩一区二区三区免费视频| 蜜桃一区二区三区在线观看 | 日韩影院在线观看| 视频一区二区国产| 涩涩涩久久久成人精品| 日韩精品一区二区三区免费视频 | 亚洲三级毛片| 日韩欧美高清一区二区三区| 亚洲精品福利| 国产精品一区二区精品视频观看 | 日本成人在线视频网站| 欧美午夜网站| 精品国产精品国产偷麻豆| 综合日韩av| 欧美特黄一区| 日韩精品导航| 精品三级国产| 99久久久久国产精品| 好看不卡的中文字幕| 日韩中文字幕91| 亚洲精品黄色| 欧美精品成人| 久久久精品网| 免费人成精品欧美精品| 欧美在线观看天堂一区二区三区| 国产精品一国产精品| 精品在线网站观看| 久久国产免费| 亚洲一区观看| 国产精品一区毛片| 肉色欧美久久久久久久免费看| 在线日韩av| 日韩在线成人| 四虎8848精品成人免费网站| 日韩在线观看不卡| 蜜桃视频第一区免费观看| 国产精品亚洲欧美| 亚洲天堂黄色| 国产精品一页| 欧美va天堂在线| 欧美视频一区| 久久久久午夜电影| 日本免费新一区视频| 中文字幕一区久| 亚洲一区二区三区中文字幕在线观看| 国产极品嫩模在线观看91精品| 欧美亚洲国产精品久久| 欧美亚洲tv| 亚洲成人精选| 国产福利资源一区| 91九色精品| 麻豆成人91精品二区三区| 在线一区免费观看| 91亚洲国产高清| 日韩高清国产一区在线| 亚洲成人精品| 国产精品蜜月aⅴ在线| 亚洲午夜av| 黄色网一区二区| 日本不卡高清| 1000部精品久久久久久久久| 国产精品久久免费视频| 欧美另类综合| 国产一二在线播放| 97久久亚洲| 日韩午夜一区| 日韩成人精品一区| 91精品福利观看| 亚洲综合日本| 久久久久国产精品一区三寸| 国产精品乱战久久久| 视频一区二区中文字幕| 午夜精品成人av| 国产精品麻豆成人av电影艾秋 | 日韩视频二区| 日韩啪啪电影网| 麻豆国产一区| 日本欧美一区| 亚洲欧美日韩国产一区| 欧洲一级精品| 国产成人精品三级高清久久91| 91午夜精品| 亚洲精品第一| 免费精品视频| 国产精品7m凸凹视频分类| 亚洲美女久久精品| 成人国产精品一区二区网站| 国产毛片精品久久| 青青国产精品| 日本一区中文字幕| 亚洲在线观看| 免费欧美一区| 亚洲日本网址| 美女视频网站久久| 国产乱码精品一区二区三区亚洲人 | 亚洲一区国产| 五月天激情综合网| 日韩三区在线| 午夜精品成人av| 天堂中文在线播放| 国产一区二区三区不卡视频网站 | 国产伊人精品| 精品三级久久| 四虎884aa成人精品最新| 亚洲美女久久精品| 色婷婷色综合|