SpringCloud服務閘道器 zuul過濾器

2021-09-28 19:05:23 字數 3247 閱讀 4181

我們了解了 spring cloud zuul 作為閘道器所具備的最基本功能:路由(router),下面我們將關注 spring cloud zuul 的另一核心功能:過濾器(filter)

場景非常多:

請求鑑權:一般放在pre型別,如果發現沒有訪問許可權,直接就攔截了

異常處理:一般會在error型別和post型別過濾器中結合來處理。

服務呼叫時長統計:pre和post結合使用。

zuulfilter是過濾器的頂級父類。

在這裡我們看一下其中定義的4個最重要的方法:

public

abstract zuulfilter implements

izuulfilter

filterorder:通過返回的int值來定義過濾器的執行順序,數字越小優先順序越高。

這張是zuul官網提供的請求生命週期圖,清晰的表現了乙個請求在各個過濾器的執行順序。

filter 的生命週期有 4 個,分別是 「pre」、「routing」、「post」 和「error」,整個生命週期可以用下圖來表示

zuul 大部分功能都是通過過濾器來實現的,這些過濾器型別對應於請求的典型生命週期。

pre:這種過濾器在請求被路由之前呼叫。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄除錯資訊等。

routing:這種過濾器將請求路由到微服務。這種過濾器用於構建傳送給微服務的請求,並使用 apache httpclient 或 netfilx ribbon 請求微服務。

post:這種過濾器在路由到微服務以後執行。這種過濾器可用來為響應新增標準的 http header、收集統計資訊和指標、將響應從微服務傳送給客戶端等。

error:在其他階段發生錯誤時執行該過濾器。 除了預設的過濾器型別,zuul 還允許我們建立自定義的過濾器型別。例如,我們可以定製一種 static 型別的過濾器,直接在 zuul 中生成響應,而不將請求**到後端的微服務。

異常流程:

所有內建過濾器列表:

zuul中預設實現的filter執行順序:

如何禁用指定的filter

zuul...disable=true。

比如要禁用org.springframework.cloud.netflix.zuul.filters.post.sendresponsefilter就設定

zuul:

sendresponsefilter:

post:

disable:

true

自定義filter:首先自定義乙個 filter,繼承 zuulfilter 抽象類,在 run() 方法中新增具體業務邏輯,具體如下:

/**

* @author bruceliu

* @create 2019-10-19 12:12

* @description

*/@component

public

class

myfilter

extends

zuulfilter

/** * filter執行順序,通過數字指定。 數字越大,優先順序越低。

** @return

*/@override

public

intfilterorder()

/** * 判斷該過濾器是否需要被執行。這裡我們直接返回了true,因此該過濾器對所有請求都會生效。 實際運用中我們可以利用該函式來指定過濾器的有效範圍。

** @return

*/@override

public

boolean

shouldfilter()

/** * 過濾器的具體邏輯

** @return

*/@override

public object run()

// 校驗通過,可以考慮把使用者資訊放入上下文,繼續向後執行

return null;

}}

在上面實現的過濾器**中,我們通過繼承zuulfilter抽象類並重寫了下面的四個方法來實現自定義的過濾器。這四個方法分別定義了:

filtertype():過濾器的型別,它決定過濾器在請求的哪個生命週期中執行。這裡定義為pre,代表會在請求被路由之前執行。

filterorder():過濾器的執行順序。當請求在乙個階段中存在多個過濾器時,需要根據該方法返回的值來依次執行。通過數字指定,數字越大,優先順序越低。

shouldfilter():判斷該過濾器是否需要被執行。這裡我們直接返回了true,因此該過濾器對所有請求都會生效。實際運用中我們可以利用該函式來指定過濾器的有效範圍。

run():過濾器的具體邏輯。這裡我們通過ctx.setsendzuulresponse(false)令 zuul 過濾該請求,不對其進行路由,然後通過ctx.setresponsestatuscode(401)設定了其返回的錯誤碼,當然我們也可以進一步優化我們的返回,比如,通過ctx.setresponsebody(body)對返回 body 內容進行編輯等。

重新啟動service-api-gateway,並發起下面的請求,對上面定義的過濾器做乙個驗證:

訪問 返回 usertoken is null

訪問 ?access-token=bruce

SpringCloud 服務閘道器

上篇部落格 springcloud eureka服務註冊和發現 中介紹了註冊中心eureka 服務提供者和服務消費者。這篇部落格我們將介紹服務閘道器。圖 1 未使用服務閘道器的做法 圖 2 服務閘道器的做法 服務閘道器,英文service gateway,他是微服務框架中唯一的入口。有些類似外觀模式...

SpringCloud 服務閘道器

上篇部落格 springcloud eureka服務註冊和發現 中介紹了註冊中心eureka 服務提供者和服務消費者。這篇部落格我們將介紹服務閘道器。圖 1 未使用服務閘道器的做法 圖 2 服務閘道器的做法 服務閘道器,英文service gateway,他是微服務框架中唯一的入口。有些類似外觀模式...

SpringCloud 服務閘道器

是程式或者系統之間的連線節點,扮演著程式或系統之間的門戶,允許它們之間通過通訊協議交換資訊,它們可能是同構和異構的異同。比如新增依賴 org.springframework.cloudgroupid spring cloud starter zuulartifactid dependency org...