Spring Cloud 系列之 Spring cloud gateway 實現網關路由轉發和過濾功能
在Spring boot2.0版本發佈之後,spring cloud又集成和開發了很多新的模塊和功能;spring boot2.0和spring boot1.5的差別可以說是很大了。今天介紹一些spring cloud gateway,spring cloud自己的網關,在1.x版本中,大家使用的較多的是Zuul網關,但Zuul只是Spring cloud整合Netflix的,並不是它自己的。今天大家一起來感受一下Spring cloud gateway的強大之處吧!
網關的功能和作用,在我看來大概分爲兩塊:無外乎就是路由轉發和過濾功能!在實際使用時,其實spring cloud gateway很簡單,不過就是配置文件和配置類,但實際上Spring cloud gateway比Zuul實現了更強大的過濾器功能,而且支持WebSocket長連接,可以說是非常強大的功能了。
需要集成的pom文件如下:感興趣的同學可以去了解一下webflux,這也是顛覆了傳統的web。eureka、openfeign、ribbon是項目中的註冊中心和服務間調用所需要的jar包,與gateway本身無關。
1.路由轉發:在這裏建議大家配置路由寫在yml文件中,不要硬編碼在代碼中,可擴展行較差,配置在yml文件中後,再配合spring cloud config可動態去改變自己的配置,所以本文使用的是yml配置的方式。如下:
我們一個個的來分析:
default-filters: 代表默認的過濾器,這是一個全局的過濾器,不屬於任何一個route
discovery: locator: enabled: true 表示註冊中心生效,我們可以通過註冊中心的服務名進行路由轉發
- id: auth-service 表示路由的唯一id
uri: lb://auth-service 指向註冊中心的服務,使用lb:// 加上ServiceName,當然也可以通過http://localhost:8080指向
predicates: 表示要進行的斷言
- Path= /auth/** 表示path地址,根據url,以auth開頭的會被轉發到auth-service服務,需要注意的是後面/**和/*的區別
filters: 毫無疑問就是過濾器了
- StripPrefix= 1 看單詞的意思,從前面截取一個,實際上就是截取url,本例中就是會把/auth截掉,後面的部分纔是轉發的url
- Custom 這是個自定義的過濾器,在後面會詳細解釋
- name: Retry 看名字這就是個重試的嘛,下面就是它的參數了。
注意:我在使用的過濾器的時候,遇到一個小小的坑,就是配置 Host ,下圖是官網對Host的解釋:
我在配置的時候使用了 - Host=* ,結果死活找不到,一直轉發不成功404,大家仔細看下官網,並注意*和**的差別。
2.過濾器
實際上上面這些過濾器都是spring cloud gateway 幫我們定義好的,不管是Retry還是StripPrefix,在所有的過濾器配置裏,一定都能找得到RetryGatewayFilterFactory和StripPrefixGatewayFilterFactory,感興趣的,可以去看下這些過濾器的源碼,再來看一下剛纔我們自定義的這個- Custom,就對應着我們自己寫的過濾器CustomGatewayFilterFactory,繼承AbstractGatewayFilterFactory<Object>父類,可在內部定義自己的過濾條件等等。如下圖:
Spring cloud gateway 還像Zuul網關一樣實現了全局過濾器,用法也是相同。如下圖:
說明:其中有代碼是調用其他服務進行token檢驗,實際大家根據自己業務場景來實現自己的全局過濾器和自定義過濾器就好了。
Spring cloud gateway 分享到這,這些是我在使用過程中遇到的一些問題和注意點,希望對大家有一點點的幫助。後續還會繼續分享一些我所使用和涉及的技術和問題。大概方向就是Spring Cloud 2.x全家桶系列,包括監控治理等的實現。