欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Cloud zuul自定義統(tǒng)一異常處理實現(xiàn)方法

 更新時間:2018年02月02日 16:46:45   投稿:mrr  
這篇文章主要介紹了Spring Cloud zuul自定義統(tǒng)一異常處理實現(xiàn),需要的朋友可以參考下

Zuul在springcloud微服務體系中提供filer和router功能,是微服務不可或缺的部分。filer處理默認實現(xiàn)的外還可以自定義進行授權(quán)、限流、安全校驗等,router完全可以替代Nginx反向代理。Zuul異常處理就是由SendErrorFilter完成。

在我們應用過程我們發(fā)現(xiàn)使用默認的異常filter有兩個問題不是很友好:

1.無法快速識別出是否是請求路由的服務超時還是沒有任何可用節(jié)點,發(fā)生錯誤只能查看日志通過堆棧去定位;

2.無法兼容自定義的譬如{code:500,msg:”xx error”}格式的響應包格式。

接下來我們討論的是如何自定義異常處理、自定義異常提示信息等。

首先,我們必須禁用默認的SendErrorFilter,官方已經(jīng)提供了開關(guān)配置,直接配置即可

zuul.SendErrorFilter.post.disable=true

自定義ErrorFilter,這里就不多說,直接貼代碼

public class ErrorFilter extends ZuulFilter {
  private static final String ERROR_STATUS_CODE_KEY = "error.status_code";
  private Logger log = LoggerFactory.getLogger(ErrorFilter.class);
  public static final String DEFAULT_ERR_MSG = "系統(tǒng)繁忙,請稍后再試";
  @Override
  public String filterType() {
    return "post";
  }
  @Override
  public int filterOrder() {
    return 0;
  }
  @Override
  public boolean shouldFilter() {
    RequestContext ctx = RequestContext.getCurrentContext();
    return ctx.containsKey(ERROR_STATUS_CODE_KEY);
  }
  @Override
  public Object run() {    
    RequestContext ctx = RequestContext.getCurrentContext();
    try {
      HttpServletRequest request = ctx.getRequest();
      int statusCode = (Integer) ctx.get(ERROR_STATUS_CODE_KEY);
      String message = (String) ctx.get("error.message");
      if (ctx.containsKey("error.exception")) {
        Throwable e = (Exception) ctx.get("error.exception");
        Throwable re = getOriginException(e);
        if(re instanceof java.net.ConnectException){
          message = "Real Service Connection refused";
          log.warn("uri:{},error:{}" ,request.getRequestURI(),re.getMessage());
        }else if(re instanceof java.net.SocketTimeoutException){
          message = "Real Service Timeout";
          log.warn("uri:{},error:{}" ,request.getRequestURI(),re.getMessage());
        }else if(re instanceof com.netflix.client.ClientException){
          message = re.getMessage();
          log.warn("uri:{},error:{}" ,request.getRequestURI(),re.getMessage());
        }else{
          log.warn("Error during filtering",e);
        }
      }
      if(StringUtils.isBlank(message))message = DEFAULT_ERR_MSG;
      request.setAttribute("javax.servlet.error.status_code", statusCode);
      request.setAttribute("javax.servlet.error.message", message);
      WebUtils.responseOutJson(ctx.getResponse(), JsonUtils.toJson(new WrapperResponse<>(statusCode, message)));
    } catch (Exception e) {
      String error = "Error during filtering[ErrorFilter]";
      log.error(error,e);
      WebUtils.responseOutJson(ctx.getResponse(), JsonUtils.toJson(new WrapperResponse<>(500, error)));
    }
    return null;
  }
  private Throwable getOriginException(Throwable e){
    e = e.getCause();
    while(e.getCause() != null){
      e = e.getCause();
    }
    return e;
  }
}

最后注冊我們自定義的ErrorFilter

@Bean 
public ErrorFilter errorFilter(){
  return new ErrorFilter();
}

總結(jié)

以上所述是小編給大家介紹的Spring Cloud zuul自定義統(tǒng)一異常處理實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java學習之利用TCP實現(xiàn)的簡單聊天示例代碼

    java學習之利用TCP實現(xiàn)的簡單聊天示例代碼

    這篇文章主要給大家介紹了關(guān)于java學習筆記之利用TCP實現(xiàn)的簡單聊天的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12
  • Java Swing實現(xiàn)坦克大戰(zhàn)游戲

    Java Swing實現(xiàn)坦克大戰(zhàn)游戲

    這篇文章主要介紹了Java Swing實現(xiàn)坦克大戰(zhàn)游戲,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很大的幫助喲,需要的朋友可以參考下
    2021-05-05
  • 深入了解Java核心類庫--String類

    深入了解Java核心類庫--String類

    這篇文章主要為大家詳細介紹了java String類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07
  • 如何處理后臺向前臺傳遞的json數(shù)據(jù)

    如何處理后臺向前臺傳遞的json數(shù)據(jù)

    這篇文章主要介紹了如何處理后臺向前臺傳遞的json數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Spring boot webService使用方法解析

    Spring boot webService使用方法解析

    這篇文章主要介紹了Spring boot webService使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java中Stream流的常用方法代碼示例

    Java中Stream流的常用方法代碼示例

    這篇文章主要介紹了Java中Stream流的常用方法代碼示例,Stream類中每一個方法都對應集合上的一種操作,將真正的函數(shù)式編程引入到Java中,能 讓代碼更加簡潔,極大地簡化了集合的處理操作,提高了開發(fā)的效率和生產(chǎn)力,需要的朋友可以參考下
    2023-10-10
  • 啟動異常invalid constant type:15的解決方案

    啟動異常invalid constant type:15的解決方案

    今天小編就為大家分享一篇關(guān)于啟動異常invalid constant type:15的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java如何獲取用戶登錄ip、瀏覽器信息、SessionId

    java如何獲取用戶登錄ip、瀏覽器信息、SessionId

    這篇文章主要介紹了java如何獲取用戶登錄ip、瀏覽器信息、SessionId,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Maven配置項目依賴使用本地倉庫的方法匯總(小結(jié))

    Maven配置項目依賴使用本地倉庫的方法匯總(小結(jié))

    這篇文章主要介紹了Maven配置項目依賴使用本地倉庫的方法匯總(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 詳解Java中StringBuffer類常用方法

    詳解Java中StringBuffer類常用方法

    這篇文章主要為大家介紹了java中StringBuffer類常用方法
    2016-01-01

最新評論