共計 3447 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 Spring Cloud 中如何實現 Zuul 過濾器,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Zuul 過濾器過濾器優先級
Spring Cloud 為 HTTP 請求的各個階段,提供了多個過濾器,這些過濾器的執行順序,由它們各自提供的一個 int 值決定,提供的值越小,優先級越高。圖 7 - 6 展示了默認的過濾器,以及它們的優先級。
圖 7 -6 Spring Cloud 自帶的過濾器及優先級
如圖 7 -6,在 routing 階段,會優先執行 Ribbon 路由的過濾器,再執行簡單路由過濾器。
自定義過濾器
了解過濾器的執行順序后,我們編寫一個自定義過濾器。新建過濾類,繼承 ZuulFilter,實現請見代碼清單 7 -10。
代碼清單 7 -10:
codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\filter\MyFilter.java
public class MyFilter extends ZuulFilter {
// 過濾器執行條件
public boolean shouldFilter() {
return true;
}
// 執行方法
public Object run() {
System.out.println( 執行 MyFilter 過濾器
return null;
}
// 表示將在路由階段執行
public String filterType() {
return FilterConstants.ROUTE_TYPE;
}
// 返回 1,路由階段,該過濾將會最先執行
public int filterOrder() {
return 1;
}
}
新建的自定義過濾器,將會在“routing”階段執行,優先級為 1,也就是在 routing 階段,該過濾器最先執行。另外注意 shouldFilter 方法,過濾最終是否執行,由該方法決定,本例返回 true,表示訪問任何的路由規則,都會執行該過濾器。為了讓 Spring 容器知道過濾器的存在,需要對該類進行配置,代碼清單 7 -11 為配置類。
代碼清單 7 -11:
codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\filter\FilterConfig.java
@Configuration
public class FilterConfig {
@Bean
public MyFilter myFilter() {return new MyFilter();
}
啟動集群,訪問網關:http://localhost:8080/test/1,會看到控制輸出:“執行 MyFilter 過濾器”。實際上,訪問任何一個配置好的路由,都會進行輸出。
過濾器動態加載
相對于集群中的其他節點,網關更需要長期、穩定地提供服務。如果需要增加過濾器,重啟網關代價太大,為了解決該問題,Zuul 提供了過濾器的動態加載功能,可以使用 Groovy 來編寫過濾器,然后添加到加載目錄,讓 Zuul 去動態加載。先為網關項目加入 Groovy 的依賴:
dependency
groupId org.codehaus.groovy /groupId
artifactId groovy-all /artifactId
version 2.4.12 /version
/dependency
接下來,在網關項目的應用類中,調用 Zuul 的 API 來實現動態加載,請見代碼清單 7 -12。
代碼清單 7 -12:
codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\GatewayApplication.java
@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {
@PostConstruct
public void zuulInit() { FilterLoader.getInstance().setCompiler(new GroovyCompiler());
// 讀取配置,獲取腳本根目錄
String scriptRoot = System.getProperty( zuul.filter.root , groovy/filters
// 獲取刷新間隔
String refreshInterval = System.getProperty( zuul.filter.refreshInterval , 5
if (scriptRoot.length() 0) scriptRoot = scriptRoot + File.separator;
try { FilterFileManager.setFilenameFilter(new GroovyFileFilter());
FilterFileManager.init(Integer.parseInt(refreshInterval), scriptRoot + pre ,
scriptRoot + route , scriptRoot + post
} catch (Exception e) { throw new RuntimeException(e);
}
public static void main(String[] args) {new SpringApplicationBuilder(GatewayApplication.class).properties(server.port=8080).run(args);
}
在啟動類中,增加了 zuulInit 方法,使用 @PostConstruct 進行修飾。該方法中,先讀取“zuul.filter.root”和“zuul.filter.refreshInterval”兩個屬性,分別表示動態過濾器的根目錄以及刷新間隔,刷新間隔以秒為單位,這兩個屬性,優先讀取配置文件的值,如果沒有則使用默認值。在配置文件中,可使用下面的配置片斷:
zuul:
filter:
root: “groovy/filters” refreshInterval: 5
調用 FilterFileManager 的 init 方法,初始化 3 個過濾器目錄:pre、route 和 post。為了測試動態加載,使用 Groovy 編寫一個最簡單的過濾器,請見代碼清單 7 -13。
代碼清單 7 -13:codes\07\03\zuul-gateway\src\main\java\groovy\filters\DynamicFilter.groovy
class DynamicFilter extends ZuulFilter {public boolean shouldFilter() {
return true;
public Object run() {System.out.println( ========= 這一個是動態加載的過濾器:DynamicFilter
return null;
public String filterType() {
return FilterConstants.ROUTE_TYPE;
public int filterOrder() {return 3;}
與前面的過濾器一致,同樣繼承 ZuulFilter。需要注意的是,本例的過濾器,并沒有一開始放到動態加載的過濾器目錄中,讀者在測試時,需要先啟動網關項目,再將 DynamicFilter.groovy 放到對應目錄中。
完成以上工作后,啟動網關項目,訪問以下地址:http://localhost:8080/test/crazyit,控制臺中并沒有輸出 DynamicFilter 的信息。將 DynamicFilter.groovy 復制到 src/main/java/groovy/filters/route 目錄,等待幾秒后,重新訪問以上的地址,可以看到網關的控制臺輸出如下:
========= 這一個是動態加載的過濾器:DynamicFilter
關于“Spring Cloud 中如何實現 Zuul 過濾器”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。