在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

推薦一種非侵入式冪等性的Java實現

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2022-12-22 10:57 ? 次閱讀

  • 冪等性
  • 什么場景下需要用到冪等
  • 冪等的實現原理
  • 冪等的代碼實現
    • 冪等的使用

冪等性

今天我們來談談什么是冪等性

引用百度百科的解析如下:

?

冪等(idempotent、idempotence)是一個數學與計算機學概念,常見于抽象代數中。

編程中一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重復執行,并能獲得相同結果的函數。這些函數不會影響系統狀態,也不用擔心重復執行會對系統造成改變。例如,“setTrue()”函數就是一個冪等函數,無論多次執行,其結果都是一樣的.更復雜的操作冪等保證是利用唯一交易號(流水號)實現。

?

這解析,確實有點了,大家話看看就行了!!!(●'?'●)

那對于我們程序員來說,我們關心的更多是下面這些問題:

?

什么地方,什么場景下需要用到冪等?

冪等,我們需要怎么做,如何實現冪等呢?

?

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

什么場景下需要用到冪等

  • 前端表單重復提交問題
  • 用戶訂單支付問題
  • 銀行業務辦理取號問題
  • 用戶惡意進行調接口問題
  • 接口超時重復提交問題
  • MQ消息進行重復消費
  • ...

當然了,還有很多場景會用到冪等,這里咱們就不一一列舉出來了。

那我們要如何設計一個冪等功能呢,而且還是代碼非侵入式

代碼非侵入式的意思,就是,我們的業務邏輯代碼,不需要處理冪等校驗的邏輯。

業務功能不處理?那交給誰處理呢?別著急,聽哥們一一道來。^_^

這里,要實現代碼非侵入式的冪等校驗,我們就要使用到切面編程了(@Aspect

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

冪等的實現原理

在系統中一些接口需要增加冪等處理,冪等的概念是一個業務請求只能執行一次。類似銀行業務辦理,首先需要取一個號,然后用戶使用這個號去柜臺辦理業務。這個號只能使用一次,如果過期或者已辦理這個號就無效了。

我們的冪等也是使用這種原理。

?

  • 1.首先客戶端調用通過我們的系統獲取一個號,我們稱之為冪等號,這個號已經存在我們的系統中。
  • 2.客戶端使用這個號,調用我們的接口。
  • 3.我們系統判斷這個號在我們的系統中已經存在,如果存在則允許業務辦理,如果不存在,則表示這是一個非法的號,我們直接拋出異常。
  • 4.當業務處理完成,我們會將這個號從我們的系統中刪除掉。

?

好了,這實現步驟,也是十分清晰了呀!!!^_^

那么我們下面就來看代碼如何實現了

冪等的代碼實現

  • 定義一個冪等處理接口
publicinterfaceIdempotence{
/**
*檢查是否存在冪等號
*@paramidempotenceId冪等號
*@return是否存在
*/
booleancheck(StringidempotenceId);

/**
*記錄冪等號
*@paramidempotenceId冪等號
*/
voidrecord(StringidempotenceId);

/**
*記錄冪等號
*@paramidempotenceId冪等號
*@paramtime過期時間
*/
voidrecord(StringidempotenceId,Integertime);

/**
*刪除冪等號
*@paramidempotenceId冪等號
*/
voiddelete(StringidempotenceId);

}
  • 定義一個冪等處理接口實現類
@Component
publicclassRedisIdempotenceimplementsIdempotence{
@Autowired
privateRedisRepositoryredisRepository;

@Override
publicbooleancheck(StringidempotenceId){
returnredisRepository.exists(idempotenceId);
}

@Override
publicvoidrecord(StringidempotenceId){
redisRepository.set(idempotenceId,"1");
}

@Override
publicvoidrecord(StringidempotenceId,Integertime){
redisRepository.setExpire(idempotenceId,"1",time);
}

@Override
publicvoiddelete(StringidempotenceId){
redisRepository.del(idempotenceId);
}
}

?

這個實現類,咱們就用redis存儲這個冪等號 實現4個方法:

檢查是否存在冪等號

記錄冪等號

記錄冪等號(帶過期時間)

刪除冪等號

?

  • 冪等工具類
@Component
publicclassIdempotenceUtil{
@Autowired
privateRedisRepositoryredisRepository;
/**
*生成冪等號
*@return
*/
publicStringgenerateId(){
Stringuuid=UUID.randomUUID().toString();
StringuId=Base64Util.encode(uuid).toLowerCase();
redisRepository.setExpire(uId,"1",1800);
returnuId;
}

/**
*從Header里面獲取冪等號
*@return
*/
publicStringgetHeaderIdempotenceId(){
ServletRequestAttributesattributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequestrequest=attributes.getRequest();
StringidempotenceId=request.getHeader("idempotenceId");
returnidempotenceId;
}
}

?

這個工具類,提供兩個方法。

1.生成一個冪等號,咱們就用uuid

2.從Header里面獲取冪等號

?

  • 定義一個注解
/**
*接口增加冪等性
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceIdempotenceRequired{

}
  • 切面
@Aspect
@Slf4j
@Component
publicclassIdempotenceSupportAdvice{
@Autowired
privateIdempotenceidempotence;
@Autowired
IdempotenceUtilidempotenceUtil;

/**
*攔截有@IdempotenceRequired注解的方法。
*/
@Pointcut("@annotation(xxx.xxx.IdempotenceRequired)")
publicvoididempotenceMethod(){}

@AfterThrowing(value="idempotenceMethod()()",throwing="e")
publicvoidafterThrowing(Throwablee){
if(!(einstanceofIdempotencyException)){
//從HTTPheader中獲取冪等號idempotenceId
StringidempotenceId=idempotenceUtil.getHeaderIdempotenceId();
idempotence.record(idempotenceId,1800);
}
}

@Around(value="idempotenceMethod()")
publicObjectaround(ProceedingJoinPointjoinPoint)throwsThrowable{
//從HTTPheader中獲取冪等號idempotenceId
StringidempotenceId=idempotenceUtil.getHeaderIdempotenceId();
if(StringUtils.isEmpty(idempotenceId)){
//不存在冪等號則不進行額外操作
returnjoinPoint.proceed();
}
//前置操作冪等號是否存在
booleanexisted=idempotence.check(idempotenceId);
if(!existed){
thrownewIdempotencyException("{success:false,message:"操作重復,請重新輸入冪等號重試!",data:-2}");
}
//刪除冪等號
idempotence.delete(idempotenceId);
Objectresult=joinPoint.proceed();

returnresult;
}
}
  • 定義個controller
@RequestMapping("/idempotence")
publicclassIdempotenceController{
/**
*生成冪等號
*@return
*/
@GetMapping("/generateId")
publicJsonResultgenerateId(){
IdempotenceUtilidempotenceUtil=SpringUtil.getBean(IdempotenceUtil.class);
StringuId=idempotenceUtil.generateId();
returnJsonResult.success("成功生成!").setData(uId);
}
}

好了,實現的代碼,就是這些了,理解起來也是比較簡單,沒有過多復雜的邏輯。

接下來,就是如何使用的問題了,

這個使用,也是十分的簡單啦!!!

冪等的使用

「服務端:」

不是所有的方法都需要切面攔截 ,只有 IdempotenceRequired 注解的方法才會被攔截。

例如下面接口:

@IdempotenceRequired
@PostMapping("/getUsers")
publicJsonResultgetUsers(){

//執行正常業務邏輯
...
}

在開發冪等接口時,只需要在方法上簡單增加一個 IdempotenceRequired 注解即可。

這基本上就是代碼非侵入式了呀!!!

「客戶端:」

服務端處理好后,在客戶端訪問接口的時候需要執行以下步驟:

?

  • 需要先獲取冪等號
  • 然后將冪等號添加到請求頭中

?

  • 1.獲取冪等號http://服務地址/idempotence/generateIdhttp://xn--zfry9hnb732h/idempotence/generateId
3d585d26-8135-11ed-8abf-dac502259ad0.jpg獲取冪等號
  • 2.請求調用

?

往header中添加冪等號

?

3d7cbdf6-8135-11ed-8abf-dac502259ad0.jpg往header中添加冪等號

好了,到這里冪等的實現,就已經完成了!!!^_^

那我們就可以愉快的編寫代碼了!!!^_^


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2973

    瀏覽量

    104947
  • 編程
    +關注

    關注

    88

    文章

    3636

    瀏覽量

    93898
  • 代碼
    +關注

    關注

    30

    文章

    4819

    瀏覽量

    68881

原文標題:推薦一種非侵入式冪等性的Java實現

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    加州理工學院:研究一種無創監測女性激素的可穿戴生物傳感器

    、摘要 ? ? 女性激素(尤其是雌二醇)的個性化監測在生育和女性健康領域備受關注。然而,現有的方法通常需要侵入血液抽取和/或大型分析實驗室設備,難以在家中實施。在此, 作者報告了一種
    的頭像 發表于 01-22 09:22 ?54次閱讀
    加州理工學院:研究<b class='flag-5'>一種</b>無創監測女性激素的可穿戴生物傳感器

    一種可以提升動態血糖監測均勻和精確度的導電油墨

    水平的方法,極大地改善了糖尿病患者的治療效果和生活質量。然而,CGM系統面臨著精確度和生產成本的挑戰,這些痛點限制了其更廣泛的應用。 動態血糖監測技術通過植入傳感器或侵入監測設
    發表于 11-08 10:26

    使用TMS320C31在通信網絡中實現在線侵入測量設備

    電子發燒友網站提供《使用TMS320C31在通信網絡中實現在線侵入測量設備.pdf》資料免費下載
    發表于 10-28 10:07 ?0次下載
    使用TMS320C31在通信網絡中<b class='flag-5'>實現</b>在線<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>測量設備

    CGQ-24霍爾傳感器是一種什么類型的傳感器

    霍爾傳感器是一種基于霍爾效應的磁敏傳感器,具有接觸測量、高靈敏度和廣泛應用特點。
    的頭像 發表于 09-27 11:17 ?366次閱讀

    接觸測量傳感器有哪些特點

    接觸測量傳感器是一種利用電磁波、聲波、光學接觸方式進行測量的傳感器。它具有以下特點: 高精度:
    的頭像 發表于 08-19 10:07 ?786次閱讀

    華納云:java web和java有什么區別java web和java有什么區別

    的平臺,Java可以用于開發桌面應用程序、移動應用程序、企業級應用程序。 – Java Web是Java語言在Web開發領域的應用,它使用Java
    的頭像 發表于 07-16 13:35 ?866次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別

    接觸溫度傳感器的定義、工作原理、類型、特點、應用和發展趨勢

    、類型、特點、應用和發展趨勢。 接觸溫度傳感器的定義 接觸溫度傳感器是一種利用物體發
    的頭像 發表于 06-19 14:34 ?3637次閱讀

    接觸與接觸測量相關的方法

    接觸測量和接觸測量是兩常見的測量方法,它們在工業生產、科學研究和日常生活中都有廣泛的應用。本文將詳細介紹這兩測量方法的基本原理、特
    的頭像 發表于 06-14 09:24 ?1840次閱讀

    基于壓電陶瓷傳感器的智能枕頭侵入生命體征監測

    生命體征的智能設備存在高復雜、高成本、侵入或低準確的缺點。因此,迫切需要開發一種簡化、無干擾、舒適、低成本的睡眠實時監測系統。在本研究
    發表于 06-12 15:20

    高光譜成像系統:植物表型研究中的侵入成像技術

    植物表型研究與高光譜技術之間存在密切的關聯。高光譜技術是一種通過獲取植物在各個波段上的反射、輻射或發射數據,從而對植物的生理狀態、化學成分、生長情況以及環境適應進行破壞
    的頭像 發表于 04-29 10:38 ?504次閱讀
    高光譜成像系統:植物表型研究中的<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>性</b>成像技術

    一種基于物聯網(IoT)的可穿戴血糖監測(iGM)系統

    定期監測血糖水平對于糖尿病的管理和制定適當的治療方案來說至關重要。傳統的血糖(BG)檢測需要刺破手指,是一種侵入技術。如指尖采血檢測侵入
    的頭像 發表于 03-26 09:21 ?1767次閱讀
    <b class='flag-5'>一種</b>基于物聯網(IoT)的可穿戴血糖監測(iGM)系統

    一種使用近紅外照明來進行人體血糖測定的設備設計

    使用光學傳感技術評估血糖水平是監測糖尿病患者的一種有前途的技術路徑,可能會成為侵入血液采樣技術的替代方案。
    的頭像 發表于 03-18 09:26 ?2263次閱讀
    <b class='flag-5'>一種</b>使用近紅外照明來進行人體血糖測定的設備設計

    帶你了解氣密檢測儀的優勢

    檢測儀是一種高精度、高效率、侵入的檢測工具,廣泛應用于多個領域。以下是氣密檢測儀的四大
    的頭像 發表于 03-02 11:20 ?828次閱讀
    帶你了解氣密<b class='flag-5'>性</b>檢測儀的優勢

    探索LabVIEW編程接口原理與實踐

    原來是數學上的概念,在編程領域可以理解為:多次請求某個資源或執行某個操作時應該具有唯一性
    的頭像 發表于 02-29 10:24 ?668次閱讀
    探索LabVIEW編程接口<b class='flag-5'>冪</b><b class='flag-5'>等</b><b class='flag-5'>性</b>原理與實踐

    為什么要實現校驗 如何實現接口的校驗

    前端重復提交表單:在填寫些表格時候,用戶填寫完成提交,很多時候會因網絡波動沒有及時對用戶做出提交成功響應,致使用戶認為沒有成功提交,然后直點提交按鈕,這時就會發生重復提交表單請求。
    的頭像 發表于 02-20 14:14 ?1280次閱讀
    主站蜘蛛池模板: 91操碰| 污视频18高清在线观看| 五月天婷婷在线观看视频| 午夜精品久久久久久久99| 天天干天天插天天| 日韩一级片免费在线观看| 久色乳综合思思在线视频| 国产永久免费爽视频在线| 中国高清性色生活片| 超级乱淫伦网站| 日本在线视频一区二区| 综合激情五月婷婷| 校园 春色 欧美 另类 小说| 亚洲 欧美 日韩 丝袜 另类| 在线免费黄色网址| 天天尻| 成人午夜免费剧场| 中文字幕亚洲一区婷婷| 加勒比一区二区| 亚洲人成人77777网站| 四虎永久精品视频在线| 欧美色图久久| 第四色视频| 免费在线观看理论片| 色爱区综合激月婷婷激情五月| 222网站高清免费观看| 超h 高h 污肉男男| 日日噜噜噜夜夜爽爽狠狠视频 | 天天操综| yyy6080韩国三级理论| 午夜嘿嘿| 四虎永久在线视频| 久久成人国产精品青青| 天天射天天舔| 成人宗合网| 国模于子涵啪啪大胆| 色丁香在线视频| 国产特黄一级片| 免费看曰批女人爽的视频网址| 97爱sese| 特级中国aaa毛片|