自定义注解和拦截器,实现接口限流防刷
我們的目的是在指定時間內,每個用戶只能進行秒殺請求指定次數。
首先,定義一個注解
寫一個攔截器。就是當執行某個方法之前,將請求截獲:
(這里實現的只是一個思路,由于StringRedisTemplate只能存字符串,不好遞增,因此只是在指定時間內都只能訪問一次,無論你指定多少?次,懂得思路就行)
這里可能出現的錯誤:解決方案。
將攔截器注冊到系統中,也即是Springboot的配置文件中,由于SpringBoot使用的是默認配置。我們可以創建一個類來增加或者覆蓋相應的配置。
?
效果:連續刷頁面,會出現
說明限流成功。
拓展一下:壓力測試,這里使用Apache ab來進行壓測。
到網上下載包,解壓。打開DOS窗口,進入解壓目錄的bin文件夾下,假設輸入以下命令行:
ab -n 100000 -c 1000 http://127.0.0.1:8080/sell/skill/order/123456
注:1000個用戶同時發送100000個并發請求。
?
自定義注解 的注解
1)@Target
java.lang.annotation.Target
用于設定注解使用范圍
java.lang.annotation.ElementType
Target通過ElementType來指定注解可使用范圍的枚舉集合
?
2)@Retention
注解@Retention可以用來修飾注解,是注解的注解,稱為元注解。
Retention注解有一個屬性value,是RetentionPolicy類型的,Enum RetentionPolicy是一個枚舉類型,
這個枚舉決定了Retention注解應該如何去保持,也可理解為Rentention 搭配 RententionPolicy使用。RetentionPolicy有3個值:CLASS? RUNTIME? ?SOURCE
按生命周期來劃分可分為3類:
1、RetentionPolicy.SOURCE:注解只保留在源文件,當Java文件編譯成class文件的時候,注解被遺棄;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認的生命周期;
3、RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;
這3個生命周期分別對應于:Java源文件(.java文件) ---> .class文件 ---> 內存中的字節碼。
那怎么來選擇合適的注解生命周期呢?
首先要明確生命周期長度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
一般如果需要在運行時去動態獲取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解
如果要在編譯時進行一些預處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS注解;
如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。
注解@Override用在方法上,當我們想重寫一個方法時,在方法上加@Override,當我們方法的名字出錯時,編譯器就會報錯
注解@Deprecated,用來表示某個類或屬性或方法已經過時,不想別人再用時,在屬性和方法上用@Deprecated修飾
注解@SuppressWarnings用來壓制程序中出來的警告,比如在沒有用泛型或是方法已經過時的時候
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的自定义注解和拦截器,实现接口限流防刷的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络:各种网络攻击
- 下一篇: 创建型模式:单例模式(懒汉+饿汉+双锁校