我們了解了 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...