2016-11-16 88 views
4

我想覆蓋zuul代理的默認senderorfilter,以便我可以在網關後面的服務崩潰/關閉時提供更好的響應。下面是我從答案參加了Customizing Zuul Exception覆蓋zuul錯誤過濾器導致轉發錯誤

public class RabbrErrorFilter extends ZuulFilter { 

private static final Logger log = LoggerFactory.getLogger(RabbrErrorFilter.class); 
protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran"; 

@Override 
public String filterType() { 
    return "post"; 
} 

@Override 
public int filterOrder() { 
    return Integer.MIN_VALUE; // Needs to run before SendErrorFilter which has filterOrder == 0 
} 

@Override 
public boolean shouldFilter() { 
    // only forward to errorPath if it hasn't been forwarded to already 
    RequestContext ctx = RequestContext.getCurrentContext(); 
    return ctx.containsKey("error.status_code") && !ctx.getBoolean(SEND_ERROR_FILTER_RAN,false); 
} 
@Override 
public Object run() { 
    try { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     Object e = ctx.get("error.exception"); 

     if (e != null && e instanceof ZuulException) { 
      ZuulException zuulException = (ZuulException)e; 
      log.error("Zuul failure detected: " + zuulException.getMessage(), zuulException); 

      // Remove error code to prevent further error handling in follow up filters 
      ctx.remove("error.status_code"); 

      // Populate context with new response values 
      ctx.setResponseBody("Overriding Zuul Exception Body"); 
      ctx.getResponse().setContentType("application/json"); 
      ctx.setResponseStatusCode(500); //Can set any error code as excepted 
      ctx.setSendZuulResponse(false); 
     } 
    } 
    catch (Exception ex) { 
     log.error("Exception filtering in custom error filter", ex); 
     ReflectionUtils.rethrowRuntimeException(ex); 
    } 
    return null; 
} 

我再也忍受不了當zuul異常被拋出在運行的代碼()被執行調試檢查代碼,但在控制檯日誌中我得到這個:

com.netflix.zuul.exception.ZuulException: Forwarding error 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:157) ~[spring-cloud-netflix-core-1.1.0.RC2.jar:1.1.0.RC2] 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:132) ~[spring-cloud-netflix-core-1.1.0.RC2.jar:1.1.0.RC2] 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:78) ~[spring-cloud-netflix-core-1.1.0.RC2.jar:1.1.0.RC2] 
    at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) ~[zuul-core-1.1.0.jar:1.1.0] 
    at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:197) ~[zuul-core-1.1.0.jar:1.1.0] 
    at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:161) ~[zuul-core-1.1.0.jar:1.1.0] 
    at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:120) ~[zuul-core-1.1.0.jar:1.1.0] 
    at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96) ~[zuul-core-1.1.0.jar:1.1.0] 
    at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116) ~[zuul-core-1.1.0.jar:1.1.0] 
    at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81) ~[zuul-core-1.1.0.jar:1.1.0] 

,並從網關後面的服務的響應與狀態500

超時 - 編輯* 更新彈簧雲依賴性(包含zuul 1.3.0核心)沒有解決這個問題

+1

顯然你只需要[keymaster](https://youtu.be/N9L7UUp0FxY?t=12s)。 –

+0

你可以爲zuul添加你的application.yml嗎? –

+0

Zuul的默認SendErrorFilter在1.3.0版本中發生了很大變化。它不再是後過濾器。它是1.3.0的錯誤過濾器,內部變化非常大。你最好檢查一下新的SendErrorFilter的源代碼。 –

回答

1

請檢查此解決方案:Spring Cloud: Zuul error handling。它對我有用,特別適用於Zuul的轉發錯誤。

Zuul錯誤處理正在通過RibbonRoutingFilter和SendErrorFilter處理,並將任何錯誤的請求轉發到$ {error.path},默認爲'/ error'。如果您繼承Spring Boot的BasicErrorController將處理的默認值。您可以忽略此行爲並實現您自己的ErrorController。

您不一定需要遵循Vnd錯誤樣式,只需按照編寫Spring的自定義實現ErrorController的一般邏輯即可。

+1

該帖子相當老,但這是我最終要做的,以解決這個問題 –

+0

請在這裏包含鏈接頁面的重要部分,以防它變爲404。 – Veve

+1

@Veve我已經添加了該帖子的關鍵引用,其中幾乎沒有足夠的想法,並想出了一個定製的解決方案。不確定複製粘貼整個代碼塊是否符合道德標準 – sainr