Zuul自定義過濾器及熔斷配置


 

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秒]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM