国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116421
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97178
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    奧迪威外夾流量傳感器:侵入、高精度流量測量方案

    外夾流量傳感器重新定義了流量監測的易用。它將超聲波時差測量的精確侵入安裝的顯著優勢相
    的頭像 發表于 02-25 11:20 ?226次閱讀
    奧迪威外夾<b class='flag-5'>式</b>流量傳感器:<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>、高精度流量測量方案

    無線傾角傳感器在古建筑監測中的應用:以侵入高精度技術守護文化遺產安全

    直川科技無線傾角傳感器精度達±0.005°,已應用于北京世園璞燊酒店、故宮、岳陽樓古建筑監測項目。采用侵入安裝與LoRa無線傳輸,實現
    的頭像 發表于 02-04 10:48 ?477次閱讀
    無線傾角傳感器在古建筑監測中的應用:以<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>高精度技術守護文化遺產安全

    無線傾角傳感器在古建筑監測中的應用:以侵入技術守護文化遺產結構安全

    直川科技無線傾角傳感器精度達±0.005°,已應用于北京世園璞燊酒店、岳陽樓古建筑監測項目。采用侵入安裝與LoRa無線傳輸,實現毫米級
    的頭像 發表于 01-27 14:16 ?961次閱讀
    無線傾角傳感器在古建筑監測中的應用:以<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>技術守護文化遺產結構安全

    通過2的次進行除法和取余數快捷方法優化

    如果除法中的除數是2的次,我們可以更好的優化除法。 編譯器使用移位操作來執行除法。因此,我們需要盡可能的設置除數為2的次(例如64而不是66)。 并且依然記住,無符號unsigned整數除法
    發表于 12-12 06:02

    侵入局放監測革命:上海云瞳綠能科技的融合創新實踐

    在電力設備智能運維領域,侵入安裝與多技術融合正成為局放在線監測的核心突破點。上海云瞳綠能科技有限公司(以下簡稱“云瞳綠能”)通過 “特高頻電磁波檢測+ TEV(暫態地電壓)+聲波定位+溫度監測” 的協同創新,重新定義了設備絕
    的頭像 發表于 09-24 18:21 ?611次閱讀
    <b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>局放監測革命:上海云瞳綠能科技的融合創新實踐

    如何秒級實現接口間“”補償:款輕量級仿數據校正處理輔助工具

    導語 本文分析了在網絡超時場景下,RPC服務調用數據一致性的問題,對于接口無、接口失效情況下,對異常數據快速處理做了分析思考和嘗試,
    的頭像 發表于 09-15 16:55 ?889次閱讀
    如何秒級<b class='flag-5'>實現</b>接口間“<b class='flag-5'>冪</b><b class='flag-5'>等</b>”補償:<b class='flag-5'>一</b>款輕量級仿<b class='flag-5'>冪</b><b class='flag-5'>等</b>數據校正處理輔助工具

    行業洞察:聚焦超聲在美容治療中的應用

    持久的手術效果,部分療程甚至在單次治療后就能實現高達30%的皮膚緊致提升。2.侵入&停機時間極短與傳統的美容手術不同,FUS提供了
    的頭像 發表于 08-14 10:55 ?634次閱讀
    行業洞察:聚焦超聲在美容治療中的應用

    鴻蒙侵入彈窗新解法,企查查正式開源“QuickDialog”彈窗組件庫

    近日,企查查將其自研的鴻蒙彈窗組件庫“QuickDialog”開源,并上線至?OpenHarmony 三方庫中心倉。這是鴻蒙生態首個支持“彈窗堆棧暫存能力”的侵入彈窗解決方案,憑借其靈活、高效
    的頭像 發表于 07-31 10:40 ?729次閱讀
    鴻蒙<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>彈窗新解法,企查查正式開源“QuickDialog”彈窗組件庫

    文讀懂:嵌入Linux實時進階

    在工業控制、機器人、汽車電子關鍵領域,嵌入系統對實時性要求極高。 Linux作為強大的通用操作系統,其原生實時性能難以滿足最嚴苛的硬實時需求。為突破這限制,PREEMPT_RT補丁
    發表于 07-10 15:26

    嵌入和單片機,是同個東西嗎?

    設計用來執行特定的任務,并且通常嵌入在更大的系統中,比如家電、汽車電子、醫療設備。嵌入系統的特點是專用、資源受限和實時。 嵌入系統
    發表于 07-09 10:20

    深圳市回映電子科技公司簡介/回映——侵入腦機接口與神經調控行業推動者

    深圳市回映電子科技有限公司深圳市回映電子科技有限公司,是專注于侵入腦機接口(BCI)技術與神經調控閉環系統的國家級高新技術企業。擁有多年底層技術研發、設計及生產制造的能力。我們致力于智能可穿
    的頭像 發表于 06-24 21:57 ?1974次閱讀
    深圳市回映電子科技公司簡介/回映——<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>腦機接口與神經調控行業推動者

    侵入經皮脊髓電刺激(tSCS)的神經機制與脊髓損傷康復臨床應用

    經皮脊髓電刺激(transcutaneousspinalcordstimulation,tSCS)經皮脊髓電刺激是一種通過皮膚表面電極向脊髓背根傳遞低頻脈沖電流、實現神經調控的侵入
    的頭像 發表于 06-17 19:21 ?4949次閱讀
    <b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>性</b>經皮脊髓電刺激(tSCS)的神經機制與脊髓損傷康復臨床應用

    迪米科技接觸紅外測溫應用:賦能養生壺智能化升級

    、迪米智能養生壺-接觸紅外測溫介紹 傳統溫控技術依賴接觸溫度傳感器,存在響應滯后、測溫精度不足問題,難以滿足用戶對智能化與精準化的需求;在此,迪米科技測溫模組利用
    發表于 05-20 21:43

    接觸液位傳感器在電池液液位檢測中的技術實踐與創新

    在電池技術不斷發展的今天,電池的性能和安全備受關注。其中,電池液液位的準確檢測對于保證電池的正常運行和延長使用壽命至關重要。接觸液位傳感器作為一種先進的檢測技術,正逐漸在電池液液
    的頭像 發表于 04-11 11:21 ?926次閱讀
    論<b class='flag-5'>非</b>接觸<b class='flag-5'>式</b>液位傳感器在電池液液位檢測中的技術實踐與創新

    一種分段氣隙的CLLC變換器平面變壓器設計

    ,驗證理論設計的正確,為變壓器制作提供理論依據。文中基于圖1電路拓撲研究了平面變壓器的設計與實現方法。 2 一種分段氣隙的CLLC平面變壓器設計圖1中拓撲變壓器副邊三繞組并聯,實際上等效為三個變壓器
    發表于 03-27 13:57