日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

推薦一種非侵入式冪等性的Java實(shí)現(xiàn)

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2022-12-22 10:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • 冪等性
  • 什么場(chǎng)景下需要用到冪等
  • 冪等的實(shí)現(xiàn)原理
  • 冪等的代碼實(shí)現(xiàn)
    • 冪等的使用

冪等性

今天我們來談?wù)勈裁词?code style="font-size:14px;padding:2px 4px;margin-right:2px;margin-left:2px;color:rgb(30,107,184);background-color:rgba(27,31,35,.05);font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;">冪等性?

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

?

冪等(idempotent、idempotence)是一個(gè)數(shù)學(xué)與計(jì)算機(jī)學(xué)概念,常見于抽象代數(shù)中。

編程中一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)。這些函數(shù)不會(huì)影響系統(tǒng)狀態(tài),也不用擔(dān)心重復(fù)執(zhí)行會(huì)對(duì)系統(tǒng)造成改變。例如,“setTrue()”函數(shù)就是一個(gè)冪等函數(shù),無論多次執(zhí)行,其結(jié)果都是一樣的.更復(fù)雜的操作冪等保證是利用唯一交易號(hào)(流水號(hào))實(shí)現(xiàn)。

?

這解析,確實(shí)有點(diǎn)長(zhǎng)了,大家話看看就行了?。?!(●'?'●)

那對(duì)于我們程序員來說,我們關(guān)心的更多是下面這些問題:

?

什么地方,什么場(chǎng)景下需要用到冪等?

冪等,我們需要怎么做,如何實(shí)現(xiàn)冪等呢?

?

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

什么場(chǎng)景下需要用到冪等

  • 前端表單重復(fù)提交問題
  • 用戶訂單支付問題
  • 銀行業(yè)務(wù)辦理取號(hào)問題
  • 用戶惡意進(jìn)行調(diào)接口問題
  • 接口超時(shí)重復(fù)提交問題
  • MQ消息進(jìn)行重復(fù)消費(fèi)
  • ...

當(dāng)然了,還有很多場(chǎng)景會(huì)用到冪等,這里咱們就不一一列舉出來了。

那我們要如何設(shè)計(jì)一個(gè)冪等功能呢,而且還是代碼非侵入式

代碼非侵入式的意思,就是,我們的業(yè)務(wù)邏輯代碼,不需要處理冪等校驗(yàn)的邏輯。

業(yè)務(wù)功能不處理?那交給誰(shuí)處理呢?別著急,聽哥們一一道來。^_^

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

冪等的實(shí)現(xiàn)原理

在系統(tǒng)中一些接口需要增加冪等處理,冪等的概念是一個(gè)業(yè)務(wù)請(qǐng)求只能執(zhí)行一次。類似銀行業(yè)務(wù)辦理,首先需要取一個(gè)號(hào),然后用戶使用這個(gè)號(hào)去柜臺(tái)辦理業(yè)務(wù)。這個(gè)號(hào)只能使用一次,如果過期或者已辦理這個(gè)號(hào)就無效了。

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

?

  • 1.首先客戶端調(diào)用通過我們的系統(tǒng)獲取一個(gè)號(hào),我們稱之為冪等號(hào),這個(gè)號(hào)已經(jīng)存在我們的系統(tǒng)中。
  • 2.客戶端使用這個(gè)號(hào),調(diào)用我們的接口。
  • 3.我們系統(tǒng)判斷這個(gè)號(hào)在我們的系統(tǒng)中已經(jīng)存在,如果存在則允許業(yè)務(wù)辦理,如果不存在,則表示這是一個(gè)非法的號(hào),我們直接拋出異常。
  • 4.當(dāng)業(yè)務(wù)處理完成,我們會(huì)將這個(gè)號(hào)從我們的系統(tǒng)中刪除掉。

?

好了,這實(shí)現(xiàn)步驟,也是十分清晰了呀?。?!^_^

那么我們下面就來看代碼如何實(shí)現(xiàn)了

冪等的代碼實(shí)現(xiàn)

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

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

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

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

}
  • 定義一個(gè)冪等處理接口實(shí)現(xiàn)類
@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);
}
}

?

這個(gè)實(shí)現(xiàn)類,咱們就用redis存儲(chǔ)這個(gè)冪等號(hào) 實(shí)現(xiàn)4個(gè)方法:

檢查是否存在冪等號(hào)

記錄冪等號(hào)

記錄冪等號(hào)(帶過期時(shí)間)

刪除冪等號(hào)

?

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

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

?

這個(gè)工具類,提供兩個(gè)方法。

1.生成一個(gè)冪等號(hào),咱們就用uuid

2.從Header里面獲取冪等號(hào)

?

  • 定義一個(gè)注解
/**
*接口增加冪等性
*/
@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中獲取冪等號(hào)idempotenceId
StringidempotenceId=idempotenceUtil.getHeaderIdempotenceId();
idempotence.record(idempotenceId,1800);
}
}

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

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

好了,實(shí)現(xiàn)的代碼,就是這些了,理解起來也是比較簡(jiǎn)單,沒有過多復(fù)雜的邏輯。

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

這個(gè)使用,也是十分的簡(jiǎn)單啦?。。?/p>

冪等的使用

「服務(wù)端:」

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

例如下面接口:

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

//執(zhí)行正常業(yè)務(wù)邏輯
...
}

在開發(fā)冪等接口時(shí),只需要在方法上簡(jiǎn)單增加一個(gè) IdempotenceRequired 注解即可。

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

「客戶端:」

服務(wù)端處理好后,在客戶端訪問接口的時(shí)候需要執(zhí)行以下步驟:

?

  • 需要先獲取冪等號(hào)
  • 然后將冪等號(hào)添加到請(qǐng)求頭中

?

  • 1.獲取冪等號(hào)http://服務(wù)地址/idempotence/generateIdhttp://xn--zfry9hnb732h/idempotence/generateId
3d585d26-8135-11ed-8abf-dac502259ad0.jpg獲取冪等號(hào)
  • 2.請(qǐng)求調(diào)用

?

往header中添加冪等號(hào)

?

3d7cbdf6-8135-11ed-8abf-dac502259ad0.jpg往header中添加冪等號(hào)

好了,到這里冪等的實(shí)現(xiàn),就已經(jīng)完成了!!!^_^

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


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3012

    瀏覽量

    116873
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3724

    瀏覽量

    97458
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74417

原文標(biāo)題:推薦一種非侵入式冪等性的Java實(shí)現(xiàn)

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    黑馬-Java+AI新版V16零基礎(chǔ)就業(yè)班百度云網(wǎng)盤下載+Java+AI全棧開發(fā)工程師

    與輸出約束。這種確定性優(yōu)先的設(shè)計(jì)思路,將大模型的確定性壓縮在被限定的范圍內(nèi),其余交由 Java 的類型安全體系保障,是實(shí)現(xiàn)穩(wěn)健融合的關(guān)鍵理念。 六、工程化落地考量:鏈路追蹤、可觀測(cè)
    發(fā)表于 05-01 11:29

    [完結(jié)15章]Java轉(zhuǎn) AI高薪領(lǐng)域必備-從0到1打通生產(chǎn)級(jí)AI Agent開發(fā)

    服務(wù)端的阻塞實(shí)現(xiàn)機(jī)制,甚至深入研究WebSocket的長(zhǎng)連接雙向通信。更進(jìn)步,要結(jié)合Spring WebFlux或Project Reactor響應(yīng)
    發(fā)表于 04-30 13:46

    2022全新版!Java分布架構(gòu)設(shè)計(jì)與開發(fā)實(shí)戰(zhàn)(完結(jié))

    歷史數(shù)據(jù);一致性哈希則在節(jié)點(diǎn)增減時(shí)最小化數(shù)據(jù)遷移量,通過虛擬節(jié)點(diǎn)技術(shù)實(shí)現(xiàn)負(fù)載均衡,特別適合動(dòng)態(tài)擴(kuò)展的分布集群。 全局唯ID生成是分庫(kù)分表必須解決的基礎(chǔ)問題。傳統(tǒng)數(shù)據(jù)庫(kù)自增ID在多分
    發(fā)表于 03-30 15:20

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

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

    無線傾角傳感器在古建筑監(jiān)測(cè)中的應(yīng)用:以侵入高精度技術(shù)守護(hù)文化遺產(chǎn)安全

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

    無線傾角傳感器在古建筑監(jiān)測(cè)中的應(yīng)用:以侵入技術(shù)守護(hù)文化遺產(chǎn)結(jié)構(gòu)安全

    直川科技無線傾角傳感器精度達(dá)±0.005°,已應(yīng)用于北京世園璞燊酒店、岳陽(yáng)樓古建筑監(jiān)測(cè)項(xiàng)目。采用侵入安裝與LoRa無線傳輸,實(shí)現(xiàn)毫米級(jí)
    的頭像 發(fā)表于 01-27 14:16 ?1224次閱讀
    無線傾角傳感器在古建筑監(jiān)測(cè)中的應(yīng)用:以<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>技術(shù)守護(hù)文化遺產(chǎn)結(jié)構(gòu)安全

    侵入局放監(jiān)測(cè)革命:上海云瞳綠能科技的融合創(chuàng)新實(shí)踐

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

    如何秒級(jí)實(shí)現(xiàn)接口間“”補(bǔ)償:款輕量級(jí)仿數(shù)據(jù)校正處理輔助工具

    導(dǎo)語(yǔ) 本文分析了在網(wǎng)絡(luò)超時(shí)場(chǎng)景下,RPC服務(wù)調(diào)用數(shù)據(jù)一致性的問題,對(duì)于接口無、接口失效情況下,對(duì)異常數(shù)據(jù)快速處理做了分析思考和嘗試,
    的頭像 發(fā)表于 09-15 16:55 ?1022次閱讀
    如何秒級(jí)<b class='flag-5'>實(shí)現(xiàn)</b>接口間“<b class='flag-5'>冪</b><b class='flag-5'>等</b>”補(bǔ)償:<b class='flag-5'>一</b>款輕量級(jí)仿<b class='flag-5'>冪</b><b class='flag-5'>等</b>數(shù)據(jù)校正處理輔助工具

    行業(yè)洞察:聚焦超聲在美容治療中的應(yīng)用

    持久的手術(shù)效果,部分療程甚至在單次治療后就能實(shí)現(xiàn)高達(dá)30%的皮膚緊致提升。2.侵入&停機(jī)時(shí)間極短與傳統(tǒng)的美容手術(shù)不同,F(xiàn)US提供了
    的頭像 發(fā)表于 08-14 10:55 ?750次閱讀
    行業(yè)洞察:聚焦超聲在美容治療中的應(yīng)用

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

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

    文讀懂:嵌入Linux實(shí)時(shí)進(jìn)階

    在工業(yè)控制、機(jī)器人、汽車電子關(guān)鍵領(lǐng)域,嵌入系統(tǒng)對(duì)實(shí)時(shí)性要求極高。 Linux作為強(qiáng)大的通用操作系統(tǒng),其原生實(shí)時(shí)性能難以滿足最嚴(yán)苛的硬實(shí)時(shí)需求。為突破這限制,PREEMPT_RT補(bǔ)丁
    發(fā)表于 07-10 15:26

    嵌入和單片機(jī),是同個(gè)東西嗎?

    設(shè)計(jì)用來執(zhí)行特定的任務(wù),并且通常嵌入在更大的系統(tǒng)中,比如家電、汽車電子、醫(yī)療設(shè)備。嵌入系統(tǒng)的特點(diǎn)是專用、資源受限和實(shí)時(shí)。 嵌入系統(tǒng)
    發(fā)表于 07-09 10:20

    深圳市回映電子科技公司簡(jiǎn)介/回映——侵入腦機(jī)接口與神經(jīng)調(diào)控行業(yè)推動(dòng)者

    深圳市回映電子科技有限公司深圳市回映電子科技有限公司,是專注于侵入腦機(jī)接口(BCI)技術(shù)與神經(jīng)調(diào)控閉環(huán)系統(tǒng)的國(guó)家級(jí)高新技術(shù)企業(yè)。擁有多年底層技術(shù)研發(fā)、設(shè)計(jì)及生產(chǎn)制造的能力。我們致力于智能可穿
    的頭像 發(fā)表于 06-24 21:57 ?2501次閱讀
    深圳市回映電子科技公司簡(jiǎn)介/回映——<b class='flag-5'>非</b><b class='flag-5'>侵入</b><b class='flag-5'>式</b>腦機(jī)接口與神經(jīng)調(diào)控行業(yè)推動(dòng)者

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

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

    迪米科技接觸紅外測(cè)溫應(yīng)用:賦能養(yǎng)生壺智能化升級(jí)

    、迪米智能養(yǎng)生壺-接觸紅外測(cè)溫介紹 傳統(tǒng)溫控技術(shù)依賴接觸溫度傳感器,存在響應(yīng)滯后、測(cè)溫精度不足問題,難以滿足用戶對(duì)智能化與精準(zhǔn)化的需求;在此,迪米科技測(cè)溫模組利用
    發(fā)表于 05-20 21:43
    左权县| 无棣县| 建宁县| 临漳县| 广东省| 上林县| 吉林省| 明溪县| 基隆市| 上思县| 汕尾市| 桂林市| 红桥区| 柯坪县| 崇义县| 应用必备| 和硕县| 阳原县| 安岳县| 扬州市| 健康| 崇仁县| 都安| 清原| 乳山市| 珠海市| 益阳市| 巴楚县| 中方县| 广德县| 桦甸市| 祥云县| 中方县| 洮南市| 遂溪县| 女性| 兴城市| 南康市| 汤阴县| 保康县| 宝清县|