package com.kyle.configuration;
import com.google.common.collect.Lists;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.scripting.support.ResourceScriptSource;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.List;
@Aspect
@Component
public class MyRedisLimiterAspect {
private final Logger logger = LoggerFactory.getLogger(MyRedisLimiter.class);
@Autowired
private HttpServletResponse response;
@Autowired
private StringRedisTemplate stringRedisTemplate;
private DefaultRedisScript<List> redisScript;
@PostConstruct
public void init(){
redisScript = new DefaultRedisScript<List>();
redisScript.setResultType(List.class);
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource(("limit.lua"))));
}
@Pointcut("execution(public * com.kyle.controller.*.*(..))")
public void pointcut(){
}
@Around("pointcut()")
public Object process(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
//使用反射获取MyRedisLimiter注解
MyRedisLimiter myRedisLimiter = signature.getMethod().getDeclaredAnnotation(MyRedisLimiter.class);
if(myRedisLimiter == null){
//正常执行方法
return proceedingJoinPoint.proceed();
}
//获取注解上的参数,获取配置的速率
double value = myRedisLimiter.limit();
//List设置Lua的KEYS[1]
String key = "ip:" + System.currentTimeMillis() / 1000;
List<String> keyList = Lists.newArrayList(key);
//List设置Lua的ARGV[1]
List<String> argvList = Lists.newArrayList(String.valueOf(value));
//调用Lua脚本并执行
List result = stringRedisTemplate.execute(redisScript, keyList, String.valueOf(value));
logger.info("Lua脚本的执行结果:" + result);
//Lua脚本返回0,表示超出流量大小,返回1表示没有超出流量大小。
if("0".equals(result.get(0).toString())){
fullBack();
return null;
}
//获取到令牌,继续向下执行
return proceedingJoinPoint.proceed();
}
private void fullBack() {
response.setHeader("Content-Type" ,"text/html;charset=UTF8");
PrintWriter writer = null;
try{
writer = response.getWriter();
writer.println("回退失败,请稍后阅读。。。");
writer.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
if(writer != null){
writer.close();
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Redis+lua+AOP实现简单的限流 (113个子文件)
MyRedisLimiterAspect.class 5KB
RedisLimiterTest.class 1KB
RedisLimiterApplication.class 1KB
MessageServiceImpl.class 1KB
MyRedisLimiter.class 550B
MessageService.class 212B
RedisLimiter.iml 11KB
MyRedisLimiterAspect.java 3KB
RedisLimiterTest.java 897B
MessageServiceImpl.java 497B
RedisLimiterApplication.java 421B
MyRedisLimiter.java 255B
MessageService.java 109B
inputFiles.lst 465B
createdFiles.lst 0B
limit.lua 354B
limit.lua 354B
uiDesigner.xml 9KB
workspace.xml 8KB
pom.xml 2KB
Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml 946B
compiler.xml 891B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_4.xml 847B
Maven__org_springframework_boot_spring_boot_starter_data_redis_2_4_5.xml 824B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_4_5.xml 824B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 811B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_4.xml 806B
Maven__org_springframework_boot_spring_boot_starter_logging_2_4_5.xml 803B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_4_5.xml 796B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_4.xml 792B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_4_5.xml 789B
Maven__org_springframework_boot_spring_boot_starter_json_2_4_5.xml 782B
Maven__org_springframework_boot_spring_boot_starter_test_2_4_5.xml 782B
Maven__org_springframework_boot_spring_boot_starter_web_2_4_5.xml 775B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_45.xml 771B
Maven__com_google_errorprone_error_prone_annotations_2_3_2.xml 763B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_4.xml 762B
Maven__org_codehaus_mojo_animal_sniffer_annotations_1_18.xml 761B
Maven__org_springframework_data_spring_data_keyvalue_2_4_8.xml 754B
Maven__org_springframework_spring_context_support_5_3_6.xml 748B
Maven__org_springframework_data_spring_data_commons_2_4_8.xml 747B
Maven__org_springframework_boot_spring_boot_starter_2_4_5.xml 747B
Maven__org_junit_platform_junit_platform_commons_1_7_1.xml 744B
Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml 744B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 744B
Maven__com_fasterxml_jackson_core_jackson_databind_2_11_4.xml 741B
Maven__org_junit_platform_junit_platform_engine_1_7_1.xml 737B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_45.xml 736B
Maven__org_springframework_data_spring_data_redis_2_4_8.xml 733B
Maven__org_junit_jupiter_junit_jupiter_engine_5_7_1.xml 726B
Maven__org_springframework_boot_spring_boot_test_2_4_5.xml 726B
Maven__org_junit_jupiter_junit_jupiter_params_5_7_1.xml 726B
Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml 722B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml 719B
Maven__org_mockito_mockito_junit_jupiter_3_6_28.xml 716B
Maven__org_springframework_spring_expression_5_3_6.xml 713B
Maven__com_fasterxml_jackson_core_jackson_core_2_11_4.xml 713B
Maven__org_reactivestreams_reactive_streams_1_0_3.xml 706B
Maven__org_junit_jupiter_junit_jupiter_api_5_7_1.xml 705B
Maven__io_netty_netty_transport_4_1_63_Final.xml 704B
Maven__com_google_j2objc_j2objc_annotations_1_3.xml 698B
Maven__io_lettuce_lettuce_core_6_0_4_RELEASE.xml 698B
Maven__io_netty_netty_resolver_4_1_63_Final.xml 697B
Maven__net_bytebuddy_byte_buddy_agent_1_10_22.xml 696B
Maven__org_springframework_spring_context_5_3_6.xml 692B
Maven__org_springframework_boot_spring_boot_2_4_5.xml 691B
Maven__io_netty_netty_handler_4_1_63_Final.xml 690B
Maven__org_springframework_spring_webmvc_5_3_6.xml 685B
Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml 684B
Maven__org_apiguardian_apiguardian_api_1_1_0.xml 683B
Maven__io_netty_netty_common_4_1_63_Final.xml 683B
Maven__io_netty_netty_buffer_4_1_63_Final.xml 683B
Maven__org_checkerframework_checker_qual_2_8_1.xml 682B
Maven__org_apache_commons_commons_pool2_2_9_0.xml 681B
Maven__ch_qos_logback_logback_classic_1_2_3.xml 679B
Maven__org_springframework_spring_beans_5_3_6.xml 678B
Maven__org_junit_jupiter_junit_jupiter_5_7_1.xml 677B
Maven__io_netty_netty_codec_4_1_63_Final.xml 676B
Maven__com_google_guava_failureaccess_1_0_1.xml 673B
Maven__org_springframework_spring_test_5_3_6.xml 671B
Maven__org_springframework_spring_core_5_3_6.xml 671B
Maven__io_projectreactor_reactor_core_3_4_5.xml 670B
Maven__org_springframework_spring_aop_5_3_6.xml 664B
Maven__org_springframework_spring_jcl_5_3_6.xml 664B
Maven__org_springframework_spring_oxm_5_3_6.xml 664B
Maven__org_springframework_spring_web_5_3_6.xml 664B
Maven__ch_qos_logback_logback_core_1_2_3.xml 658B
Maven__org_springframework_spring_tx_5_3_6.xml 657B
Maven__com_jayway_jsonpath_json_path_2_4_0.xml 657B
Maven__com_google_code_findbugs_jsr305_3_0_2.xml 656B
Maven__net_bytebuddy_byte_buddy_1_10_22.xml 654B
Maven__net_minidev_accessors_smart_1_2.xml 653B
Maven__org_assertj_assertj_core_3_18_1.xml 653B
Maven__org_mockito_mockito_core_3_6_28.xml 653B
Maven__org_aspectj_aspectjweaver_1_9_4.xml 653B
Maven__org_skyscreamer_jsonassert_1_5_0.xml 648B
Maven__org_xmlunit_xmlunit_core_2_7_0.xml 646B
Maven__org_slf4j_jul_to_slf4j_1_7_30.xml 645B
Maven__org_opentest4j_opentest4j_1_2_0.xml 644B
Maven__org_projectlombok_lombok_1_18_20.xml 642B
共 113 条
- 1
- 2
资源评论
kyleQAQ
- 粉丝: 74
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功