久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Spring Cloud中如何實現Zuul過濾器

184次閱讀
沒有評論

共計 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 過濾器”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計3447字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 师宗县| 托克逊县| 胶州市| 义乌市| 富蕴县| 莆田市| 宁远县| 麻江县| 新邵县| 新泰市| 扬州市| 边坝县| 宁远县| 会宁县| 汕尾市| 英吉沙县| 洪泽县| 广汉市| 阿城市| 泗洪县| 蓬溪县| 泾川县| 五常市| 象山县| 阿城市| 安吉县| 克什克腾旗| 平南县| 正安县| 年辖:市辖区| 察哈| 青海省| 维西| 叶城县| 永平县| 浦北县| 抚松县| 玉龙| 绥江县| 商河县| 商洛市|