(六)api網關服務 zuul-過濾器

開啓上文服務:

 

Zuul給咱們的第一印象一般是這樣:它包含了對請求的路由和過濾兩個功能,其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎。過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。然而實際上,路由功能在真正運行時,它的路由映射和請求轉發都是由幾個不一樣的過濾器完成的。其中,路由映射主要是經過PRE類型的過濾器完成,它將請求路徑與配置的路由規則進行匹配,以找到須要轉發的目標地址。而請求轉發的部分則是由Route類型的過濾器來完成,對PRE類型過濾器得到的路由地址進行轉發。因此,過濾器能夠說是Zuul實現API網關功能最重要的核心部件,每個進入Zuul的請求都會通過一系列的過濾器處理鏈獲得請求響應並返回給客戶端。


Zuul(ZuulFilter)過濾器的關鍵特性有:java

  • Type: 定義在請求執行過程當中什麼時候被執行;
  • Execution Order: 當存在多個過濾器時,用來指示執行的順序,值越小就會越早執行;
  • Criteria: 執行的條件,即該過濾器什麼時候會被觸發;
  • Action: 具體的動做。
@Component
public class MyZuulFilterPre extends ZuulFilter {
    private static Logger log = LoggerFactory.getLogger(MyZuulFilterPre.class);

    //filterType:返回一個字符串表明過濾器的類型
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;      //pre:路由以前   route:路由之時  post: 路由以後  error:發送錯誤調用
    }

    //filterOrder:過濾的順序
    @Override
    public int filterOrder() {
        return 0;
    }


    //這裏能夠寫邏輯判斷,是否要過濾,本文true,永遠過濾
    @Override
    public boolean shouldFilter() {
        return true;
    }


    //過濾器的具體邏輯。判斷該請求到底有沒有權限訪問。
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if (accessToken == null) {
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            } catch (Exception e) {
            }

            return null;
        }
        log.info("ok");
        return null;
    }
}

 

測試結果:app

 

Zuul中定義了四種標準的過濾器類型,這些過濾器類型對應於請求的典型生命週期。ide

  • PRE過濾器: 在請求被路由以前調用, 可用來實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等;
  • ROUTING過濾器: 在路由請求時候被調用;
  • POST過濾器: 在路由到微服務之後執行, 可用來爲響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等;
  • ERROR過濾器: 在處理請求過程時發生錯誤時被調用。

除了上面給出的四種默認的過濾器類型以外,Zuul還容許咱們建立自定義的過濾器類型。(暫沒嘗試)微服務

 

禁用過濾器

只須要在application.properties(或yml)中配置須要禁用的filter,格式爲:zuul.[filter-name].[filter-type].disable=truepost

zuul.MyZuulFilterPre.pre.disable=true

  


連接:https://www.jianshu.com/p/f786a11a2def
來源:簡書測試

相關文章
相關標籤/搜索