所有從裝置或**來的請求都會經過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....