亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
2。全球異常處理@controllerAdvice
3。斷路器模式的容錯(cuò)模式
4。退縮和抖動重試
5。錯(cuò)誤跟蹤和可觀察性
6。處理重複請求的勢力
7。優(yōu)雅的退化和後備
8。早期驗(yàn)證輸入(快速失?。?/strong>
首頁 Java java教程 Java微服務(wù)中的高級錯(cuò)誤處理模式

Java微服務(wù)中的高級錯(cuò)誤處理模式

Jul 30, 2025 am 01:42 AM

定義自定義異常層次結(jié)構(gòu),以使錯(cuò)誤自我記錄並啟用精確處理; 2。使用@controlleradvice進(jìn)行集中式的,一致的錯(cuò)誤響應(yīng)格式; 3。使用彈性4J應(yīng)用斷路器圖案以防止級聯(lián)故障; 4.實(shí)施退縮和抖動的重試,以優(yōu)雅地處理瞬態(tài)失??; 5。使用結(jié)構(gòu)化日誌,MDC,指標(biāo)和APM工具增強(qiáng)可觀察性; 6.確保使用IDEMPOTENCY鍵安全處理重複請求; 7.依賴性失敗時(shí)的優(yōu)雅降級和功能切換的設(shè)計(jì); 8。使用BEAN驗(yàn)證的早期驗(yàn)證輸入以快速失敗並減少下游錯(cuò)誤;這些實(shí)踐共同建立了彈性,可觀察和可維護(hù)的Java微服務(wù),這些微服務(wù)將錯(cuò)誤作為可管理的事件而不是中斷。

Java微服務(wù)中的高級錯(cuò)誤處理模式

在構(gòu)建Java微服務(wù)時(shí),錯(cuò)誤處理不僅僅是捕獲異常,而是關(guān)於彈性,可觀察性和用戶體驗(yàn)。隨著系統(tǒng)的複雜性增長,基本的試用塊不再足夠。高級錯(cuò)誤處理模式有助於保持服務(wù)穩(wěn)定性,改善調(diào)試並確保優(yōu)雅的降解。以下是生產(chǎn)級Java微服務(wù)中使用的關(guān)鍵模式和實(shí)踐。

Java微服務(wù)中的高級錯(cuò)誤處理模式

1。結(jié)構(gòu)化異常處理,具有自定義異常層次結(jié)構(gòu)

與其拋出諸如RuntimeException之類的通用異常,不如定義針對您的域而定量的明確異常層次結(jié)構(gòu)。

為什麼重要:

Java微服務(wù)中的高級錯(cuò)誤處理模式
  • 使錯(cuò)誤類型自我記錄。
  • 在不同層處啟用精確的異常處理。
  • 簡化日誌記錄和監(jiān)視。

例子:

公共抽像類ServiceException擴(kuò)展了RuntimeException {
    受保護(hù)的最終字符串錯(cuò)誤代碼;
    受保護(hù)的最終int httpstatus;

    public ServiceException(字符串消息,字符串錯(cuò)誤代碼,int httpstatus){
        超級(消息);
        this.errorcode = errorCode;
        this.httpstatus = httpstatus;
    }

    // Getters ...
}

公共類驗(yàn)證Exception擴(kuò)展了ServiceException {
    公共驗(yàn)證Exception(字符串消息){
        super(消息,“驗(yàn)證_error”,400);
    }
}

公共類ResourcenotFoundException擴(kuò)展了ServiceException {
    public Resourscenotfoundexception(字符串消息){
        超級(消息,“ not_found”,404);
    }
}

然後,使用全局異常處理程序(例如,帶有Spring的@ControllerAdvice )將其轉(zhuǎn)換為一致的HTTP響應(yīng)。

Java微服務(wù)中的高級錯(cuò)誤處理模式

2。全球異常處理@controllerAdvice

使用全局異常處理程序集中化錯(cuò)誤響應(yīng)格式。

 @controllerAdvice
公共類GlobalexceptionHandler {

    @ExceptionHandler(ServiceException.Class)
    公共響應(yīng)<errorsponse> handleserviceException(serviceException ex){
        errorresponse error = new ErrorResponse(ex.getMessage(),ex.getErrorCode());
        返迴響應(yīng)率。 STATUS(EX.GETHTTPSTATUS())。身體(error);
    }

    @ExceptionHandler(MethodArgumentNotValideXception.Class)
    公共響應(yīng)<errorsesponse> handerValidationException(MethodArgumentNotValideXception ex){
        字符串消息= ex.getBindingResult()。 getAllErrors()。 get(0).getDefaultMessage();
        errorresponse error = new errorresponse(消息,“驗(yàn)證_error”);
        返迴響應(yīng)率。 STATUS(400).body(error);
    }

    @ExceptionHandler(exception.class)
    公共響應(yīng)<errorsponse> handergenericexception(Exception ex){
        errorresponse error =新的errorresponse(“內(nèi)部服務(wù)器錯(cuò)誤”,“ internal_error”);
        //記錄實(shí)際例外
        返迴響應(yīng)率。 STATUS(500).body(error);
    }
}

這避免了控制器之間重複的錯(cuò)誤響應(yīng)邏輯。


3。斷路器模式的容錯(cuò)模式

當(dāng)下游服務(wù)失敗時(shí),反複試圖將其稱為Wasters Resources並增加延遲。斷路器模式阻止了這一點(diǎn)。

工具:使用resilience4jsentinel (不是hystrix,棄用)。

具有彈性的示例4J:

 @CircuitBreaker(name =“ PaymentsVice”,shoultbackMethod =“ showerbackhe”)
Public PaymenseResponse Charge Payment(paymentrequest請求){
    返回paymentclient.Charge(請求);
}

公共付款Ressponse後備(PaymentRequest請求,CallnotpermittyException Ex){
    log.warn(“斷路器開放,返回後備”);
    返回paymentersponse.scheduled(); //優(yōu)雅的後備
}

application.yml中配置:yml:

彈性4J.Circuiter:
  實(shí)例:
    PaymentsVice:
      失敗率 - 閾值:50
      等待開放狀態(tài):5000ms
      滑動窗口大小:10

這樣可以防止在中斷期間級聯(lián)故障。


4。退縮和抖動重試

瞬態(tài)故障(例如,網(wǎng)絡(luò)故障)在分佈式系統(tǒng)中很常見。以指數(shù)向後重試增加了成功機(jī)會。

帶有彈性4J重試:

 @retry(name =“ contingoryservice”,hallbackmethod =“ hallbackcheckstock”)
public boolean checkstock(string itemid){
    返回庫存client.check(itemID);
}

//後備如果所有檢索失敗
public boolean hallbackCheckStock(字符串itemid,exception ex){
    返回false;
}

配置重試:

彈性4J.Retry:
  實(shí)例:
    庫存服務(wù):
      Max-Attempts:3
      等待:1000ms
      啟用指數(shù) -  backoff:true

添加抖動(隨機(jī)延遲)可防止雷電的問題。


5。錯(cuò)誤跟蹤和可觀察性

即使處理良好,錯(cuò)誤也必須可見。整合記錄,指標(biāo)和跟蹤。

關(guān)鍵實(shí)踐:

  • 使用MDC(映射診斷上下文)進(jìn)行請求級跟蹤。
  • 結(jié)構(gòu)化JSON的日誌異常(例如,通過logback logstash)。
  • Datadog , New RelicOpentElemetry等APM工具報(bào)告錯(cuò)誤。

SLF4J和MDC的示例:

 mdc.put(“ requestId”,requestID);
嘗試 {
    //業(yè)務(wù)邏輯
} catch(serviceException ex){
    log.error(“服務(wù)錯(cuò)誤:{},代碼:{}”,ex.getMessage(),ex.getErrorCode(),ex);
    投擲前;
} 最後 {
    mdc.clear();
}

也發(fā)出指標(biāo):

 MeterRegistry.Counter(“ service.errors”,“類型”,“驗(yàn)證”)。

6。處理重複請求的勢力

網(wǎng)絡(luò)問題會導(dǎo)致客戶重試的請求,從而導(dǎo)致意外副作用(例如,雙付款)。

解決方案:使用IDEMPOTENCY密鑰。

 @postmapping(“/orders”)
公共響應(yīng)<? > createOrder(@requestheader(“ idempotency-key”)字符串鍵,@requestbody orderRequest req){
    返回idempotencyService.execute(key,() - > orderService.create(req));
}

idempotencyService檢查是否已經(jīng)處理了密鑰(例如,使用redis with ttl)。如果是,請返回緩存的結(jié)果;否則,運(yùn)行並緩存結(jié)果。


7。優(yōu)雅的退化和後備

當(dāng)非關(guān)鍵服務(wù)失敗時(shí),降低功能而不是完全失敗。

示例:

  • 返回緩存的產(chǎn)品建議,如果推薦引擎下降。
  • 即使庫存服務(wù)很慢(帶警告),也允許購物車修改。

在斷路器中使用後備或?qū)崿F(xiàn)功能切換(通過togglzff4j )。


8。早期驗(yàn)證輸入(快速失?。?/strong>

在邊緣捕獲錯(cuò)誤 - 不要讓無效的數(shù)據(jù)傳播。

使用註釋bean驗(yàn)證(JSR-380)

公共類PaymepeRequest {
    @notblank
    私有字符串用戶ID;

    @decimalmin(“ 0.01”)
    私人巨額數(shù)量;
}

並在控制器中驗(yàn)證:

 @postmapping(“/付費(fèi)”)
公共響應(yīng)<? >付費(fèi)(@valid @requestbody paymentrequest req){...}

這減少了下游的錯(cuò)誤處理負(fù)擔(dān)。


基本上,Java微服務(wù)中的高級錯(cuò)誤處理不僅僅是捕獲異常,而是關(guān)於故障的設(shè)計(jì)。使用結(jié)構(gòu)化的異常,斷路器,檢索,可觀察性和後備,以構(gòu)建具有彈性和可維護(hù)的系統(tǒng)。這些模式合併後,將故障轉(zhuǎn)換為可管理的事件。

以上是Java微服務(wù)中的高級錯(cuò)誤處理模式的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
現(xiàn)代爪哇的異步編程技術(shù) 現(xiàn)代爪哇的異步編程技術(shù) Jul 07, 2025 am 02:24 AM

Java支持異步編程的方式包括使用CompletableFuture、響應(yīng)式流(如ProjectReactor)以及Java19 中的虛擬線程。 1.CompletableFuture通過鍊式調(diào)用提升代碼可讀性和維護(hù)性,支持任務(wù)編排和異常處理;2.ProjectReactor提供Mono和Flux類型實(shí)現(xiàn)響應(yīng)式編程,具備背壓機(jī)制和豐富的操作符;3.虛擬線程減少並發(fā)成本,適用於I/O密集型任務(wù),與傳統(tǒng)平臺線程相比更輕量且易於擴(kuò)展。每種方式均有適用場景,應(yīng)根據(jù)需求選擇合適工具並避免混合模型以保持簡潔性

在Java中使用枚舉的最佳實(shí)踐 在Java中使用枚舉的最佳實(shí)踐 Jul 07, 2025 am 02:35 AM

在Java中,枚舉(enum)適合表示固定常量集合,最佳實(shí)踐包括:1.用enum表示固定狀態(tài)或選項(xiàng),提升類型安全和可讀性;2.為枚舉添加屬性和方法以增強(qiáng)靈活性,如定義字段、構(gòu)造函數(shù)、輔助方法等;3.使用EnumMap和EnumSet提高性能和類型安全性,因其基於數(shù)組實(shí)現(xiàn)更高效;4.避免濫用enum,如動態(tài)值、頻繁變更或複雜邏輯場景應(yīng)使用其他方式替代。正確使用enum能提升代碼質(zhì)量並減少錯(cuò)誤,但需注意其適用邊界。

了解Java Nio及其優(yōu)勢 了解Java Nio及其優(yōu)勢 Jul 08, 2025 am 02:55 AM

JavaNIO是Java1.4引入的新型IOAPI,1)面向緩衝區(qū)和通道,2)包含Buffer、Channel和Selector核心組件,3)支持非阻塞模式,4)相比傳統(tǒng)IO更高效處理並發(fā)連接。其優(yōu)勢體現(xiàn)在:1)非阻塞IO減少線程開銷,2)Buffer提升數(shù)據(jù)傳輸效率,3)Selector實(shí)現(xiàn)多路復(fù)用,4)內(nèi)存映射加快文件讀寫。使用時(shí)需注意:1)Buffer的flip/clear操作易混淆,2)非阻塞下需手動處理不完整數(shù)據(jù),3)Selector註冊需及時(shí)取消,4)NIO並非適用於所有場景。

Java Classloader在內(nèi)部如何工作 Java Classloader在內(nèi)部如何工作 Jul 06, 2025 am 02:53 AM

Java的類加載機(jī)制通過ClassLoader實(shí)現(xiàn),其核心工作流程分為加載、鏈接和初始化三個(gè)階段。加載階段由ClassLoader動態(tài)讀取類的字節(jié)碼並創(chuàng)建Class對象;鏈接包括驗(yàn)證類的正確性、為靜態(tài)變量分配內(nèi)存及解析符號引用;初始化則執(zhí)行靜態(tài)代碼塊和靜態(tài)變量賦值。類加載採用雙親委派模型,優(yōu)先委託父類加載器查找類,依次嘗試Bootstrap、Extension和ApplicationClassLoader,確保核心類庫安全且避免重複加載。開發(fā)者可自定義ClassLoader,如URLClassL

Hashmap在Java內(nèi)部如何工作? Hashmap在Java內(nèi)部如何工作? Jul 15, 2025 am 03:10 AM

HashMap在Java中通過哈希表實(shí)現(xiàn)鍵值對存儲,其核心在於快速定位數(shù)據(jù)位置。 1.首先使用鍵的hashCode()方法生成哈希值,並通過位運(yùn)算轉(zhuǎn)換為數(shù)組索引;2.不同對象可能產(chǎn)生相同哈希值,導(dǎo)致衝突,此時(shí)以鍊錶形式掛載節(jié)點(diǎn),JDK8後鍊錶過長(默認(rèn)長度8)則轉(zhuǎn)為紅黑樹提升效率;3.使用自定義類作鍵時(shí)必須重寫equals()和hashCode()方法;4.HashMap動態(tài)擴(kuò)容,當(dāng)元素?cái)?shù)超過容量乘以負(fù)載因子(默認(rèn)0.75)時(shí),擴(kuò)容並重新哈希;5.HashMap非線程安全,多線程下應(yīng)使用Concu

有效使用爪哇枚舉和最佳實(shí)踐 有效使用爪哇枚舉和最佳實(shí)踐 Jul 07, 2025 am 02:43 AM

Java枚舉不僅表示常量,還可封裝行為、攜帶數(shù)據(jù)、實(shí)現(xiàn)接口。 1.枚舉是類,用於定義固定實(shí)例,如星期、狀態(tài),比字符串或整數(shù)更安全;2.可攜帶數(shù)據(jù)和方法,如通過構(gòu)造函數(shù)傳值並提供訪問方法;3.可使用switch處理不同邏輯,結(jié)構(gòu)清晰;4.可實(shí)現(xiàn)接口或抽象方法,使不同枚舉值具有差異化行為;5.注意避免濫用、硬編碼比較、依賴ordinal值,合理命名與序列化。

如何在Java中正確處理異常? 如何在Java中正確處理異常? Jul 06, 2025 am 02:43 AM

處理Java中的異常關(guān)鍵在於捕獲得當(dāng)、處理明確、不掩蓋問題。一要按需捕獲具體異常類型,避免籠統(tǒng)catch,優(yōu)先處理checkedexception,運(yùn)行時(shí)異常應(yīng)提前判斷;二要使用日誌框架記錄異常,根據(jù)類型決定重試、回滾或拋出;三要利用finally塊釋放資源,推薦try-with-resources;四要合理定義自定義異常,繼承RuntimeException或Exception,攜帶上下文信息便於調(diào)試。

Java中的單例設(shè)計(jì)模式是什麼? Java中的單例設(shè)計(jì)模式是什麼? Jul 09, 2025 am 01:32 AM

單例設(shè)計(jì)模式在Java中通過私有構(gòu)造器和靜態(tài)方法確保一個(gè)類只有一個(gè)實(shí)例並提供全局訪問點(diǎn),適用於控制共享資源的訪問。實(shí)現(xiàn)方式包括:1.懶加載,即首次請求時(shí)才創(chuàng)建實(shí)例,適用於資源消耗大且不一定需要的情況;2.線程安全處理,通過同步方法或雙重檢查鎖定確保多線程環(huán)境下只創(chuàng)建一個(gè)實(shí)例,並減少性能影響;3.餓漢式加載,在類加載時(shí)直接初始化實(shí)例,適合輕量級對像或可接受提前初始化的場景;4.枚舉實(shí)現(xiàn),利用Java枚舉天然支持序列化、線程安全及防止反射攻擊的特性,是推薦的簡潔可靠方式。不同實(shí)現(xiàn)方式可根據(jù)具體需求選

See all articles