gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

在微服務架構中異常如何正確使用

本篇文章給大家介紹一下在微服務架構中異常正確使用的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

在微服務架構中異常如何正確使用

異常的正確使用在微服務架構中的重要性排前三,沒什么意見吧

異常的正確使用在微服務架構中的重要性排前三,沒什么意見吧

Curdboy 們好久不見,先祝大家端午節快樂。最近想說說異常,我的思考儼然形成了閉環,希望這套組合拳能對你的業務代碼有所幫助。

下面只討論世界上最好的語言和生態最完整的語言,沒什么意見吧。

異常的異同

PHP 在 PHP7 異常的設計和 Java 保持一致了 Exception extends Throwable ,不過在歷史原因和設計理念上還是有一些細微的差別。比如 PHP 中的異常是有 code 屬性的,這樣就存在多種異常聚類為同一個異常,然后在catch 區塊里根據 code 寫不同的業務邏輯代碼。

而 Java 異常則沒有code ,不能這樣設計,只能針對不同的情況使用不同的異常。所以我們習慣服務對外暴露的通過包裝類來封裝,而不是直接依賴異常的透傳。

統一異常的處理

在 Java 代碼里,最讓人詬病的就是漫山遍野的try catch ,沒什么意見吧。隨便抓一段代碼

@Override public DataResult<List<AdsDTO>> getAds(Integer liveId) {          try {         List<AdsDTO> adsDTO = new ArrayList<>();         //...業務邏輯省略         DataResult.success(adsDTO);     } catch (Exception e) {         log.error("getAds has Exception:{}", e.getMessage(), e);         DataResult.failure(ResultCode.CODE_INTERNAL_ERROR, e.getMessage()); // 將異常信息返回給服務端調用方     }          return dataResult; }

很多時候都是無腦上來就先寫個 try catch 再說,不管里面是否會有非運行時異常。比較好的方式是使用 aop 的方式來攔截所有的服務方法的調用,統一接管異常然后做處理。

@Around("recordLog()") public Object record(ProceedingJoinPoint joinPoint) throws Throwable {   //... 請求調用來源記錄      Object result;    try {     result = joinPoint.proceed(joinPoint.getArgs());   } catch (Exception e) {     //... 記錄異常日志          DataResult<Object> res = DataResult.failure(ResultCode.CODE_INTERNAL_ERROR, e.getMessage());     result = res;   }      //... 返回值日志記錄      return result; }

有一點小問題,如果直接將 A 服務的異常信息直接返回給調用者 B,可能存在一些潛在的風險,永遠不能相信調用者,即使他根正苗紅三代貧農也不行。因為不能確定調用者會將該錯誤信息作何處理,可能就直接作為 json 返回給了前端。

RuntimeException

在 Java 中異常可以分為運行時異常和非運行時異常,運行時異常是不需要捕獲的,在方法上也不需要標注 throw Exception,比如我們在方法里使用 guava 包里的Preconditions工具類,拋出的IllegalArgumentException也是運行時異常。

@Override public DataResult<List<AdsDTO>> getAds(Integer liveId) {   Preconditions.checkArgument(null != liveId, "liveIds not be null");      List<AdsDTO> adsDTOS = new ArrayList<>();   //...業務邏輯省略   return DataResult.success(adsDTOS); }

我們也可以使用該特性,自定義自己的業務異常類繼承RuntimeException

XXServiceRuntimeException extends RuntimeException

對于不符合業務邏輯情況則直接拋出 XXServiceRuntimeException

@Override public DataResult<List<AdsDTO>> getAds(Integer liveId) {    if (null == liveId) {     throw new XXServiceRuntimeException("liveId can't be null");   }      List<AdsDTO> adsDTOS = new ArrayList<>();   //...業務邏輯省略   return DataResult.success(adsDTOS); }

然后在 aop 做統一處理做相應的優化,對于前面比較粗暴的做法,應該將除了XXServiceRuntimeException和IllegalArgumentException之外的異常內部記錄,不再對外暴露,但是一定要記得通過requestId將分布式鏈路串起來,在DataResult中返回,方便問題的排查。

@Around("recordLog()") public Object record(ProceedingJoinPoint joinPoint) throws Throwable {   //... 請求調用來源記錄      Object result;    try {     result = joinPoint.proceed(joinPoint.getArgs());   } catch (Exception e) {     //... 記錄異常日志①     log.error("{}#{}, exception:{}:", clazzSimpleName, methodName, e.getClass().getSimpleName(), e);          DataResult<Object> res = DataResult.failure(ResultCode.CODE_INTERNAL_ERROR);     if (e instanceof XXServiceRuntimeException || e instanceof IllegalArgumentException) {        res.setMessage(e.getMessage());     }       result = res;   }    if (result instanceof DataResult) {       ((DataResult) result).setRequestId(EagleEye.getTraceId()); // DMC    }      //... 返回值日志記錄      return result; }

異常監控

說好的閉環呢,使用了自定義異常類之后,對異常日志的監控報警的閾值就可以降低不少,報警更加精準,以阿里云 SLS 的監控為例

* and ERROR not XXServiceRuntimeException not IllegalArgumentException|SELECT COUNT(*) AS count

這里監控的是記錄異常日志① 的日志

PHP 里的異常

上面 Java 里說到的問題在 PHP 里也同樣存在,不用 3 種方法來模擬 aop 都不能體現 PHP 是世界上最好的語言

//1. call_user_func_array //2. 反射 //3. 直接 new try {   $class = new $className();   $result = $class->$methodName(); } catch (Throwable $e) {     //...略 }

類似上面的架構邏輯不再重復編寫偽代碼,基本保持一致。也是自定義自己的業務異常類繼承RuntimeException,然后做對外輸出處理。

但是PHP 里有一些歷史包袱,起初設計的時候很多運行時異常都是作為 Notice,Warning 錯誤輸出的,但是錯誤的輸出缺少調用棧,不利于問題的排查

function foo(){   return boo("xxx"); }  function boo($a){   return explode($a); }  foo();
Warning: explode() expects at least 2 parameters, 1 given in /Users/mengkang/Downloads/ab.php on line 8

看不到具體的參數,也看不到調用棧。如果使用set_error_handler + ErrorException之后,就非常清晰了。

set_error_handler(function ($severity, $message, $file, $line) {     throw new ErrorException($message, 10001, $severity, $file, $line); });  function foo(){   return boo("xxx"); }  function boo($a){   return explode($a); }  try{   foo(); }catch(Exception $e){   echo $e->getTraceAsString(); }

最后打印出來的信息就是

Fatal error: Uncaught ErrorException: explode() expects at least 2 parameters, 1 given in /Users/mengkang/Downloads/ab.php:12 Stack trace: #0 [internal function]: {closure}(2, 'explode() expec...', '/Users/mengkang...', 12, Array) #1 /Users/mengkang/Downloads/ab.php(12): explode('xxx') #2 /Users/mengkang/Downloads/ab.php(8): boo('xxx') #3 /Users/mengkang/Downloads/ab.php(15): foo() #4 {main}   thrown in /Users/mengkang/Downloads/ab.php on line 12

修改上面的函數

function boo(array $a){   return implode(",", $a); }

則沒法捕獲了,因為拋出的是PHP Fatal error: Uncaught TypeError,PHP7 新增了
class Error implements Throwable,則在 PHP 系統錯誤日志里會有 Stack,但是不能和整個業務系統串聯起來,這里就又不得不說日志的設計,我們期望像 Java 那樣通過一個 traceId 將所有的日志串聯起來,從 Nginx 日志到 PHP 里的正常 info level 日志以及這些Uncaught TypeError,所以接管默認輸出到系統錯誤日志,在 catch 代碼塊中記錄到統一的地方。那么這里就簡單修改為

set_error_handler(function ($severity, $message, $file, $line) {     throw new ErrorException($message, 10001, $severity, $file, $line); });  function foo(){   return boo("xxx"); }  function boo(array $a){   return implode(",", $a); }  try{   foo(); }catch(Throwable $e){   echo $e->getTraceAsString(); }

catch Throwable就能接受Error和Exception了。

但是 set_error_handler 沒辦法處理一些錯誤,比如E_PARSE的錯誤,可以用register_shutdown_function來兜底。

值得注意的是register_shutdown_function的用意是在腳本正常退出或顯示調用exit時,執行注冊的函數。
是腳本運行(run-time not parse-time)出錯退出時,才能使用。如果在調用register_shutdown_function的同一文件的里面有語法錯誤,是無法注冊的,但是我們項目一般都是分多個文件的,這樣就其他文件里有語法錯誤,也能捕獲了

register_shutdown_function(function(){     $e = error_get_last();     if ($e){         throw new ErrorException($e["message"], 10002, E_ERROR, $e["file"], $e["line"]);     } });

如果你想直接使用這些代碼(PHP的)直接到項目可能會有很多坑,因為我們習慣了系統中有很多 notice 了,可以將 notice 的錯誤轉成異常之后主動記錄,但是不對外拋出異常即可。

推薦學習:php視頻教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
成人免费观看毛片| 激情视频免费网站| 91人人澡人人爽人人精品| 成人免费黄色av| 欧美三级理论片| 欧美视频免费看欧美视频| 岛国毛片在线播放| 欧美日韩在线中文| 男人添女人荫蒂免费视频| 天天综合成人网| 成人午夜激情av| 日韩视频第二页| 北条麻妃69av| 日本一道本久久| 福利视频一区二区三区四区| 国产精品久久成人免费观看| 欧美伦理片在线观看| 久久久久免费精品| 国产日韩一区二区在线观看| 免费视频爱爱太爽了| 黄色片免费在线观看视频| 亚洲一区二区三区观看| www.se五月| 青青草影院在线观看| 免费观看黄色的网站| 超碰中文字幕在线观看| 99视频在线观看视频| 自拍偷拍视频在线| 日韩欧美一级在线| 欧美国产日韩激情| 久久精品视频16| 男人的天堂99| 亚洲一级片免费| 97超碰人人看| 国产freexxxx性播放麻豆| 国产v片免费观看| 亚洲欧美另类动漫| 免费看啪啪网站| cao在线观看| 精品久久久噜噜噜噜久久图片| 亚洲无吗一区二区三区| 久久精品一卡二卡| 激情五月六月婷婷| 日韩a在线播放| 8x8x成人免费视频| 在线观看av的网址| 激情综合网婷婷| 欧美成人手机在线视频| 亚洲理论电影在线观看| www.99在线| 亚洲免费视频播放| 欧美久久久久久久久久久久久 | 乱子伦视频在线看| 免费av不卡在线| 少妇人妻大乳在线视频| www.涩涩涩| 人妻夜夜添夜夜无码av | 国产嫩草在线观看| 天天做天天爱天天高潮| 欧美日韩亚洲一| 国产麻豆电影在线观看| 成人一区二区三| 人人妻人人澡人人爽欧美一区 | 久久美女福利视频| 欧美 另类 交| 国内外免费激情视频| 99久re热视频精品98| 最近中文字幕一区二区| 特级西西人体www高清大胆| 黄色三级视频片| av免费观看国产| 久久久天堂国产精品| 国产又黄又猛又粗| 欧美 日韩 国产一区| 成人午夜视频免费观看| 丰满女人性猛交| 日本精品一区在线| 中文字幕亚洲欧洲| 国产情侣av自拍| 日本中文字幕片| 欧美午夜性视频| 欧美日韩dvd| 午夜激情视频网| www.污网站| 搡的我好爽在线观看免费视频| 手机看片一级片| 超碰在线人人爱| 一女二男3p波多野结衣| 国产精品一区二区羞羞答答| 国产网站免费在线观看| 日韩国产一级片| 欧美视频在线观看网站| av之家在线观看| 鲁一鲁一鲁一鲁一澡| 男人操女人免费软件| www黄色av| 青青草精品视频在线观看| 国产福利视频在线播放| 免费黄色日本网站| 日韩中文字幕免费在线| 亚洲欧美国产日韩综合| 男生操女生视频在线观看| 亚洲女人在线观看| 一本色道久久88亚洲精品综合| 欧美 日韩 国产精品| 久久亚洲精品无码va白人极品| 免费超爽大片黄| 日韩在线xxx| xxww在线观看| 97超碰人人爱| 免费在线观看亚洲视频| 99热手机在线| 无码毛片aaa在线| 国产精品久久中文字幕| 在线免费视频a| 黄色成人在线免费观看| 欧美日韩在线视频一区二区三区| 国产综合免费视频| 不卡中文字幕在线观看| 天天做天天躁天天躁| 无码日韩人妻精品久久蜜桃| 色呦色呦色精品| 精品无码国产一区二区三区av| chinese少妇国语对白| 国产黑丝在线视频| 女人喷潮完整视频| 99999精品| 欧美激情成人网| www.男人天堂网| 伊人色在线观看| 少妇高潮毛片色欲ava片| 成年网站免费在线观看| 黄色大片中文字幕| 制服丝袜中文字幕第一页| 日韩国产一级片| 99亚洲国产精品| 久久午夜夜伦鲁鲁一区二区| 大片在线观看网站免费收看| 任你操这里只有精品| 精品国偷自产一区二区三区| 中文字幕线观看| 男人插女人下面免费视频| 成人免费性视频| 欧美日韩午夜爽爽| 91精品999| 亚洲少妇久久久| 免费国产成人av| 777久久久精品一区二区三区| 2021国产视频| 亚洲天堂av免费在线观看| 欧美特级aaa| 不卡影院一区二区| 欧美亚洲另类色图| 国产精品裸体瑜伽视频| 粉嫩av一区二区三区天美传媒 | 日本黄色福利视频| 狠狠热免费视频| 成人一区二区三| 中国丰满人妻videoshd | 欧美 日韩 国产 高清| 浴室偷拍美女洗澡456在线| 一级黄色片国产| 亚洲色图偷拍视频| 中文字幕第17页| 福利视频999| 免费网站在线观看黄| 亚洲第一区第二区第三区| 久久久久久蜜桃一区二区| 天天色综合社区| 日日干日日操日日射| 在线观看免费视频污| 欧美日韩精品区别| 久久精品国产精品亚洲精品色| 国产精品亚洲天堂| 国内自拍中文字幕| 黄页网站大全在线观看| 欧美色图色综合| 久久99999| 四虎成人在线播放| 黄色三级中文字幕| 日韩精品视频久久| 一女二男3p波多野结衣| 2025韩国大尺度电影| av一区二区三区免费观看| 成年人视频观看| 一起操在线视频| 免费观看亚洲视频| 激情六月丁香婷婷| 国产探花在线观看视频| 成人午夜视频在线观看免费| 欧美性大战久久久久xxx| 男人的天堂最新网址| 国产 欧美 日本| 杨幂毛片午夜性生毛片 | 日本丰满少妇xxxx| 午夜免费福利在线| 无码人妻精品一区二区蜜桃网站| 久久精品国产sm调教网站演员| 亚洲最大成人在线观看| 国产欧美久久久久|