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

wordpress免插件增强网站关键词优化排名怎么做

wordpress免插件增强,网站关键词优化排名怎么做,社区团购小程序怎么做,旅游网站建设模板下载SpringBoot 自定义注解实现限流 限流是为了防止服务器资源的过度消耗,通过一定的策略来控制访问频率,确保服务的高可用性和稳定性。其核心意义在于防止流量高峰时期接口过载,从而引起服务崩溃或响应延迟增加。本文将简述如何通过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/380932.html

相关文章:

  • 建筑公司做网站买空间多大合适seo推广 课程
  • php动态网站建设重点前端seo怎么优化
  • 企业咨询合同模板杭州百度seo
  • 一个人可做几次网站备案免费的网页制作软件
  • 做网站.cn好还是.com好郑州网站技术顾问
  • 武汉 外贸网站建设扬州seo优化
  • 武汉一医院网站建设免费建立自己的网站
  • iis6 网站无法访问郑州网站建设
  • 扁平风格网站 模板免费下载58同城推广效果怎么样
  • 南京谁做免费网站百度seo查询收录查询
  • 中小型企业网站优化推广优化网哪个牌子好
  • 动漫设计自考大专百度seo排名软件
  • 个人网站首页模板网络营销的公司有哪些
  • 哈尔滨网站建设外包公司google play三件套
  • 福建闽东建设网站软文写作技巧及范文
  • 网络彩票建立网站小程序开发软件
  • 微信怎么做收费视频网站谷歌推广哪家好
  • 建站如何赚钱营业推广方式
  • 国外做ui的网站j如何建立网站服务器
  • 快速搭建网站工具全国疫情又严重了
  • 网站无收录的原因seo手机关键词网址
  • 农业网站开发的实验报告sem培训班学费哪个好
  • 备案通青岛谷歌优化
  • 如何做网站排名百度平台客服怎么联系
  • web网站如何做负载均衡广告联盟app
  • 目前做网站最流行的程序语言免费b站软件下载
  • 网站设计 上海2023最新15件重大新闻
  • 手机端公司网站怎么做logo设计
  • 做动态网站可以不写代码吗怎样在百度上做广告推广
  • 创意广告视频网站百度文库官网登录入口