這篇文章將為大家詳細(xì)講解有關(guān)Spring Cloud中如何實(shí)現(xiàn)Zuul過濾器,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
10年的思南網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整思南建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“思南網(wǎng)站設(shè)計(jì)”,“思南網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Spring Cloud為HTTP請求的各個階段,提供了多個過濾器,這些過濾器的執(zhí)行順序,由它們各自提供的一個int值決定,提供的值越小,優(yōu)先級越高。圖7-6展示了默認(rèn)的過濾器,以及它們的優(yōu)先級。
圖7-6 Spring Cloud自帶的過濾器及優(yōu)先級
如圖7-6,在routing階段,會優(yōu)先執(zhí)行Ribbon路由的過濾器,再執(zhí)行簡單路由過濾器。
了解過濾器的執(zhí)行順序后,我們編寫一個自定義過濾器。新建過濾類,繼承ZuulFilter,實(shí)現(xiàn)請見代碼清單7-10。
代碼清單7-10:
codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\filter\MyFilter.java
public class MyFilter extends ZuulFilter { // 過濾器執(zhí)行條件 public boolean shouldFilter() { return true; } // 執(zhí)行方法 public Object run() { System.out.println("執(zhí)行 MyFilter 過濾器"); return null; } // 表示將在路由階段執(zhí)行 public String filterType() { return FilterConstants.ROUTE_TYPE; } // 返回1,路由階段,該過濾將會最先執(zhí)行 public int filterOrder() { return 1; } }
新建的自定義過濾器,將會在“routing”階段執(zhí)行,優(yōu)先級為1,也就是在routing階段,該過濾器最先執(zhí)行。另外注意shouldFilter方法,過濾最終是否執(zhí)行,由該方法決定,本例返回true,表示訪問任何的路由規(guī)則,都會執(zhí)行該過濾器。為了讓Spring容器知道過濾器的存在,需要對該類進(jìn)行配置,代碼清單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(); } }
啟動集群,訪問網(wǎng)關(guān):http://localhost:8080/test/1,會看到控制輸出:“執(zhí)行 MyFilter 過濾器”。實(shí)際上,訪問任何一個配置好的路由,都會進(jìn)行輸出。
相對于集群中的其他節(jié)點(diǎn),網(wǎng)關(guān)更需要長期、穩(wěn)定地提供服務(wù)。如果需要增加過濾器,重啟網(wǎng)關(guān)代價太大,為了解決該問題,Zuul提供了過濾器的動態(tài)加載功能,可以使用Groovy來編寫過濾器,然后添加到加載目錄,讓Zuul去動態(tài)加載。先為網(wǎng)關(guān)項(xiàng)目加入Groovy的依賴:
org.codehaus.groovy groovy-all 2.4.12
接下來,在網(wǎng)關(guān)項(xiàng)目的應(yīng)用類中,調(diào)用Zuul的API來實(shí)現(xiàn)動態(tài)加載,請見代碼清單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進(jìn)行修飾。該方法中,先讀取 “zuul.filter.root”和“zuul.filter.refreshInterval”兩個屬性,分別表示動態(tài)過濾器的根目錄以及刷新間隔,刷新間隔以秒為單位,這兩個屬性,優(yōu)先讀取配置文件的值,如果沒有則使用默認(rèn)值。在配置文件中,可使用下面的配置片斷:
zuul: filter: root: “groovy/filters” refreshInterval: 5
調(diào)用FilterFileManager的init方法,初始化3個過濾器目錄:pre、route和post。為了測試動態(tài)加載,使用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("========= 這一個是動態(tài)加載的過濾器:DynamicFilter"); return null; } public String filterType() { return FilterConstants.ROUTE_TYPE; } public int filterOrder() { return 3; } }
與前面的過濾器一致,同樣繼承ZuulFilter。需要注意的是,本例的過濾器,并沒有一開始放到動態(tài)加載的過濾器目錄中,讀者在測試時,需要先啟動網(wǎng)關(guān)項(xiàng)目,再將DynamicFilter.groovy放到對應(yīng)目錄中。
完成以上工作后,啟動網(wǎng)關(guān)項(xiàng)目,訪問以下地址:http://localhost:8080/test/crazyit,控制臺中并沒有輸出DynamicFilter的信息。將DynamicFilter.groovy復(fù)制到src/main/java/groovy/filters/route目錄,等待幾秒后,重新訪問以上的地址,可以看到網(wǎng)關(guān)的控制臺輸出如下:
========= 這一個是動態(tài)加載的過濾器:DynamicFilter
關(guān)于“Spring Cloud中如何實(shí)現(xiàn)Zuul過濾器”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。