当前位置: 首页 > wzjs >正文

为学校网站做网站推广策划培训网址大全

为学校网站做网站推广策划,培训网址大全,装修十大风格,阿里云虚拟主机 wordpressSpringBoot 自定义注解实现限流 限流是为了防止服务器资源的过度消耗,通过一定的策略来控制访问频率,确保服务的高可用性和稳定性。其核心意义在于防止流量高峰时期接口过载,从而引起服务崩溃或响应延迟增加。本文将简述如何通过AOP和自定义…

SpringBoot 自定义注解实现限流

限流是为了防止服务器资源的过度消耗,通过一定的策略来控制访问频率,确保服务的高可用性和稳定性。其核心意义在于防止流量高峰时期接口过载,从而引起服务崩溃或响应延迟增加。本文将简述如何通过AOP和自定义注解实现限流。
1.创建自定义注解
可以根据需要定义更多方法,在方法上引用注解需要指定具体的值

@Target(ElementType.METHOD)  //注解的目标是方法上
@Retention(RetentionPolicy.RUNTIME) //运行时
@Documented
public @interface RateLimit {String key() default "";int time() default 1; //时间,单位秒,默认1秒int count() default 100; // 允许的请求次数 ,此处为1秒100次
}

2.定义限流切面
使用AOP切面来控制方法的请求次数,如超过注解定义的请求次数限制,将抛出异常


import com.google.common.util.concurrent.RateLimiter;import com.lenovo.ssc.logistics.system.RateLimit;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
@Aspect
public class RateLimitAspect {private final Map<String ,RateLimiter> limiterMap=new ConcurrentHashMap<>();@Before("@annotation(rateLimit)")public void doBefore(JoinPoint point, RateLimit rateLimit){MethodSignature signature= (MethodSignature)point.getSignature();//获取方法签名Method method = signature.getMethod();//获取当前方法String name = method.getName();//获取方法名double permitsSecond=(double)rateLimit.count()/ rateLimit.time();//计算每秒允许的请求数//computeIfAbsent 方法会检查 limiterMap 中是否存在键 name。如果键 name 不存在,则使用提供的 lambda 表达式 k -> RateLimiter.create(rateLimit.count()) 创建一个新的值,并将其与键 name 关联com.google.common.util.concurrent.RateLimiter rateLimiter = limiterMap.computeIfAbsent(name, k ->  com.google.common.util.concurrent.RateLimiter.create(permitsSecond));if(!rateLimiter.tryAcquire()){//ateLimiter.tryAcquire() 方法用于尝试从 Guava 的 RateLimiter 限流器中获取一个许可(token)。如果能够成功获取许可,则返回 true,否则返回 falsethrow new RuntimeException("Too many requests");}}}

3.使用注解
在Controller中使用@RateLimit注解,time用于指定时间内,count为请求次数

    @GetMapping("/queryUsageMap")@Operation(summary = "获取用途map")@RateLimit(key="queryUsageMap",time = 60,count = 10)public Message<List<Map<String, String>>> queryUsageMap(@RequestParam String language) {List<Map<String, String>> usageList = SealUsageEnum.getUsageList();if (!StringUtils.isEmpty(language)) {if ("en-US".equals(language)) {usageList = SealUsageEnum.getUsageListInEg();}}return new Message<>(ResultCodeEnum.SUCCESS.getCode().toString(), ResultCodeEnum.SUCCESS.getMessage(), usageList);}

4.测试效果
在方法上增加注解,规定时间内,正常访问;超出频率报错如下:

java.lang.RuntimeException: Too many requestsat com.lenovo.ssc.logistics.system.aspect.RateLimitAspect.doBefore(RateLimitAspect.java:36)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:568)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:617)at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:44)at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:57)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)at com.lenovo.ssc.logistics.seal.controller.SealBasicController$$EnhancerBySpringCGLIB$$cfa31bbb.queryUsageMap(<generated>)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:568)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)at javax.servlet.http.HttpServlet.service(HttpServlet.java:529)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)

注意:未使用该注解的方法,将不受限制
以上是使用自定义注解和AOP完成限流的所有内容,更多的限流方式如Bucket4j、Spring Cloud gateway 以及限流组件Sentinel等,关注博主后续。如有不当之处,可以在评论区评论。

http://www.dtcms.com/wzjs/3808.html

相关文章:

  • 国外做游戏h动画的网站友情链接怎么添加
  • 网站大小seo引擎优化服务
  • 外国人做的汉字网站sem什么意思
  • 建设储蓄卡网站广告投放方式
  • 怎样用wordpress搭建网站免费服务器
  • 做化工的外贸网站都有什么地方技术培训平台
  • 金属网站模板9个广州seo推广神技
  • 潍坊网站排名提升目前最好的引流推广方法
  • 语言网站开发互联网营销案例
  • wordpress做简单的商城seo教程培训班
  • 深圳最好的网站建设公司哪家好微信社群营销
  • 网站导航条做多高网络平台推广方案
  • 关键词搜索优化公司网站seo分析常用的工具是
  • 近期做网站需要什么软件电商网页制作教程
  • 怀化组织部网站广告最多的网站
  • 飞沐网站设计广东seo网站设计
  • 中华人民共和国政府官网资源优化排名网站
  • 开业时网站可以做哪些活动吗简易的旅游网页制作
  • 推广普通话的重要意义网站关键词优化技巧
  • 做的网站怎么联网国内看不到的中文新闻网站
  • 关于优化网站建设的方案百度资源
  • 互联网做视频网站需要许可证吗企业网站优化技巧
  • 自己做的网站怎么取sql数据今日热点新闻事件及评论
  • 装修网站系统如何让百度收录自己的网站
  • ppt免费制作网站重庆seo入门教程
  • 企业做网站好吗镇江seo快速排名
  • 创建网站的三种方法天津做优化好的公司
  • 网站建设的行业分析文明seo
  • 免费css网站模板如何优化关键词排名到首页
  • 广州建设执业注册中心网站八大营销方式有哪几种