總結之SpringCloud之路由閘道器 Zuul

2021-10-05 18:18:40 字數 4808 閱讀 9614

所有從裝置或**來的請求都會經過zuul到達後端的netflix應用程式。作為乙個邊界性質的應用程式,zuul提供了動態路由、監控、彈性負載和安全功能。zuul底層利用各種filter實現如下功能:

•認證和安全 識別每個需要認證的資源,拒絕不符合要求的請求。

•效能監測 在服務邊界追蹤並統計資料,提供精確的生產檢視。

•動態路由 根據需要將請求動態路由到後端集群。

•負載解除安裝 預先為每種型別的請求分配容量,當請求超過容量時自動丟棄。

•靜態資源處理 直接在邊界返回某些響應。

新建乙個服務zuul-service作為路由閘道器服務。

pom.xml中引入依賴

org.springframework.cloud

spring-cloud-starter-zuul

使用@enablezuulproxy啟用zuul(使用@enablezuulserver也可以啟用zuul,只是不會自動從eureka中獲取並自動**服務,也不會自動載入部分zuul過濾器,但是可以選擇性地替換**平台的各個部分)。

@enableeurekaclient

@enablezuulproxy

public static void main(string args) }

路由配置

users: #你自定義規則名字

path: /user/** #url位址

serviceid: one #路由到serviceid

ignored-patterns: /user/one #url攔截 防止外面通過url請求內部通訊路徑

#簡便寫法

相關引數

zuul會自動讀取註冊中心的已經註冊的服務。user-service服務會自動設定/user-service/**這樣的路由,即/user-service/users會被**到user-service服務的/users請求。

zuul.ignoredservices可以指定忽略註冊中心獲取的服務

zuul.routes.=

路由key使用乙個服務名稱,對應乙個路由路徑

zuul.routes..serviceid=指定乙個服務對應路由路徑為zuul.routes..path

zuul.routes..url=指定乙個服務的url或者使用forward轉向zuul服務的介面,對應路由路徑為zuul.routes..path

zuul.routes.=使用自定義ribbon實現路由

zuul服務啟動完成後,可以訪問http://localhost:9000/routes獲取路由列表

zuul結合springcloud配置中心,在修改路由配置資訊後重新整理配置可立即生效,無需重啟zuul服務,這樣就實現了動態路由。

zuul進行**時,會有一系列的zuul filter對http請求的request和response進行封裝和操作。

乙個zuul filter有下面四個要素:

type:型別。zuul filter的型別包括pre,routing,post和error。routing過濾器是在路由階段執行的,負責尋找原服務、請求**和返回接收。pre和post分別在routing之前和之後執行。如果zuul執行**的過程中丟擲zuulexception異常,則會被error過濾器捕獲並進行相應處理。

execution order:執行順序。通過乙個整型的值從小到大依次執行(相同型別過濾器間互相比較)。

criteria:執行條件。當滿足一定條件時,才會執行該過濾器。

action:執行動作。當執行條件滿足時,進行的操作。

實現乙個過濾器只要繼承zuulfilter,並實現filtertype(),filterorder(),shouldfilter()和run()四個方法。這些方法與上面的四個要素對應。

如果要禁用乙個zuul過濾器,只需要配置zuul...disable=true,比如需要禁用org.springframework.cloud.netflix.zuul.filters.post.sendresponsefilter需要配置zuul.sendresponsefilter.post.disable=true

下面我們使用乙個pre過濾器實現token驗證,如果http header裡面沒有乙個固定的token,則禁止訪問。

禁用zuul預設的error過濾器,設定固定的token和需要驗證的路由key名單

zuul:

# 禁用springcloud自帶的error filter

senderrorfilter:

error:

disable: true

zuul-filter:

token-filter:

# 訪問時,需要進行認證的路由key

un-auth-routes:

- users

- smsapi

# 固定的token

static-token: xf2fdi8m

讀取自定義token配置資訊

@component

@configurationproperties("zuulfilter.tokenfilter")

public class tokenvalidateconfiguration

public void setunauthroutes(listunauthroutes)

public string getstatictoken()

public void setstatictoken(string statictoken)

}

自定義過濾器

1、 shouldfilter:返回乙個boolean值,判斷該過濾器是否需要執行。返回true表示要執行此過慮器,否則不執行。

2、 run:過濾器的業務邏輯。

3、 filtertype:返回字串代表過濾器的型別,如下

pre:請求在被路由之前執行

routing:在路由請求時呼叫

post:在routing和errror過濾器之後呼叫

error:處理請求時發生錯誤呼叫

4、 filterorder:此方法返回整型數值,通過此數值來定義過濾器的執行順序,數字越小優先順序越高。

@component

public class tokenvalidatefilter extends zuulfilter

@override

public int filterorder()

@override

public boolean shouldfilter()

@override

public object run()

string statictoken = tvconfig.getstatictoken();

if (stringutils.isblank(statictoken)) else if (!statictoken.equals(token))

return null;

}/**

* 設定response的狀態碼為403

*/private void forbidden()

}

注意:如果使用zuul.routes.=方式配置的路由,則ctx.get(filterconstants.proxy_key)會得到去掉頭尾的url(/smsapi/**會得到smsapi,/smsapi/target/**會得到smsapi/target),而並非路由key。所以之前配置檔案中的路由

測試:攜帶正確的token訪問成功

新建乙個error過濾器,當捕獲到zuulexception時,返回乙個json物件

@component

public class senderrorrestfilter extends zuulfilter

@override

public int filterorder()

@override

public boolean shouldfilter()

@override

public object run()

private throwable getcause(throwable throwable)

return throwable;}}

SpringCloud之Dashboard 流監控

新建springcloud consumer hystrix dashboard模組 新增依賴 org.springframework.cloudgroupid spring cloud starter hystrixartifactid 1.4.6.releaseversion dependenc...

SpringCloud之Hystrix應用實踐

使用springcloud的hystrix功能,有幾種方式 1 單應用監聽,也可以用於測試 引用包 org.springframework.boot spring boot starter actuator org.springframework.cloud spring cloud starter...

SpringCloud學習之eureka集群配置

如果是單節點的註冊中心,是無法保證系統穩定性的,當然現在專案部署架構不可能是單節點的。集群節點的部署思路 通過執行多個例項並請求他們相互註冊,來完成註冊中心的高可用性 結伴註冊 注意 用於本機模擬的前期準備工作 將電腦上hosts 新增如下配置 linux下位置 etc hosts 127.0.0....