2.2.2.RELEASE\spring-cloud-netflix-zuul-2.2.2.RELEASE.jar!\org\springframework\cloud\netflix\zuul\filters\support\FilterConstants.class
public static final String ERROR_TYPE = "error"; public static final String POST_TYPE = "post"; public static final String PRE_TYPE = "pre"; public static final String ROUTE_TYPE = "route";
Zuul過濾器有四種類型,pre前置和post后置都是相對於routing路由調用遠程服務而言的,這三種過濾器不論哪一個出現異常都會到error過濾器,自定義過濾器可以是這四種過濾器之一
例子為前置過濾器
package com.company.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.apache.commons.lang.StringUtils; import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; //必須注入sping容器,否則無效 @Component public class LoginFilter extends ZuulFilter{ @Override public String filterType() { //指定過濾器類型 return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { //指定優先級,越小優先級越高 return FilterConstants.PRE_DECORATION_FILTER_ORDER-1; } @Override public boolean shouldFilter() { //是否啟用過濾 return true; } @Override public Object run() throws ZuulException { //過濾邏輯 //獲取Zuul中的request上下文對象 RequestContext ctx = RequestContext.getCurrentContext(); //獲取request對象 HttpServletRequest request = ctx.getRequest(); //簡單demo,判斷是否帶有token參數 String token = request.getParameter("token"); if(StringUtils.isBlank(token)){ //setSendZuulResponse方法傳入false表示攔截,默認true放行。 ctx.setSendZuulResponse(false); //響應403狀態碼 ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value()); } return null; } }
熔斷配置
Ribbon超時計算公式:(連接時長+讀取時長)*(當前實例重試次數+1)*(切換實例重試次數+1)
zuul:
retryable: true
ribbon:
ConnectTimeout: 250 # 連接超時時間(ms)[默認1秒]
ReadTimeout: 2000 # 通信超時時間(ms)[默認1秒]
OkToRetryOnAllOperations: true # 是否對所有操作重試
MaxAutoRetriesNextServer: 1 # 同一服務不同實例的重試次數[默認是1次]
MaxAutoRetries: 0 # 同一實例的重試次數[默認是0次]
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMillisecond: 6000 # 熔斷超時時長:6000ms[默認是1秒]