SpringCloud中Gateway的使用教程詳解
1.基礎教程
pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent> <dependencies> <!--gateway不是通過servlet啟動的,不需要spring-boot-starter-web--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2020.0.6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
application.yml
server: port: 8081
springboot啟動類
@SpringBootApplication public class GateWayApplication { public static void main(String[] args) { SpringApplication.run(GateWayApplication.class,args); } @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p .path("/**") .filters(f -> f.addRequestParameter("aa","bb")) .uri("http://localhost:18080")) .build(); } }
以上代碼,是做瞭個路由:如果url的path符合正則“/**”則給請求添加一個aa=bb的參數然後轉發到http://localhost:18080,。
如果訪問http://localhost:8081/get,則最終會請求http://localhost:18080/get?aa=bb
我們再添加一個route。
@SpringBootApplication public class GateWayApplication { public static void main(String[] args) { SpringApplication.run(GateWayApplication.class,args); } @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(p ->p .method("POST") .uri("http://localhost:18081") ) .route(p -> p .path("/**") .filters(f -> f.addRequestParameter("aa","bb")) .uri("http://localhost:18080")) .build(); } }
以上代碼添加瞭一個如果是POST訪問,則轉發到http://localhost:18081。
那麼如果我們使用POST的http://localhost:8081/aaa,則會轉發到http://localhost:18081/aaa.
值得註意的是,如果這兩個route換下位置,path=/** 的route放在method=post的上面,則會產生另外的情況,就是會轉發到18080上去,因為POST的http://localhost:8081/aaa也會匹配上/** .這些route是有先後順序的。
可以看出route有一個重要的概念,就是條件predicate,命中瞭什麼條件就會被轉發到哪裡。
Predicate來自於java8的接口。Predicate 接受一個輸入參數,返回一個佈爾值結果。該接口包含多種默認方法來將Predicate組合成其他復雜的邏輯(比如:與,或,非)。可以用於接口請求參數校驗、判斷新老數據是否有變化需要進行更新操作。add–與、or–或、negate–非。
Spring Cloud Gateway內置瞭許多Predict,這些Predict的源碼在org.springframework.cloud.gateway.handler.predicate包中,如果讀者有興趣可以閱讀一下。現在列舉各種Predicate如下圖:
可以看到這有幾種類型的Predict,而我們剛剛使用的就是METHOD和Path這兩種,當然你可以選擇其他的。
2.將配置放在配置文件裡
總是寫些Bean實際上還是不爽,不如我們放在配置文件裡面。放配置文件裡面可以減少代碼量,最重要的是,如果配合springcloudconfig,可以做到在線更新,這就很爽瞭。
我們將上面的那個bean註釋掉,然後把上面的寫到配置文件裡。
server: port: 8081 spring: cloud: gateway: routes: - id: my_method_route uri: http://localhost:18081 predicates: - Method=POST - id: my_path_route uri: http://localhost:18080 predicates: - Path=/**
註意一些關鍵的地方,要約定大於配置比如:Method=POST Path=/**
3.放在springcloud裡面
目前我們都是一個單機springboot,跟springcloud沒有關系。我們嘗試將這段配置放在nacos的config裡面。
nacos新建gateway-test.yaml,類型yaml,內容如下:
spring: cloud: gateway: routes: - id: my_path_route uri: http://localhost:18080 predicates: - Path=/** - id: my_method_route uri: http://localhost:18081 predicates: - Method=POST
java項目的pom修改下,添加瞭nacos的服務發現和配置文件。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent> <dependencies> <!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--springboot2.4版本之後需要添加下面依賴才能加載bootstrap.yml--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2020.0.6</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringCloud Alibaba 微服務 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
添加bootstrap.yml,添加瞭nacos的一些配置
spring: application: name: gateway cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 file-extension: yaml
修改application.yml
server: port: 8081 spring: profiles: active: test
此時
{{spring.application.name}}-{{spring.profiles.active}}.{{spring.cloud.nacos.config.file-extension}}
正好等於我們剛才在nacos上建的gateway-test.yaml
最後是java啟動執行,發現gateway就從nacos拉取配置文件生效瞭。
4.使用服務名而不是IP
我們的uri轉發的都是具體的ip地址,那麼真正在微服務的時候,肯定轉發的是服務名而不是ip地址。
修改gateway-test.yaml裡面的uri,boot-cloud和boot-cloud1是我們創建的另兩個服務。
spring: cloud: gateway: routes: - id: my_path_route uri: lb://boot-cloud predicates: - Path=/** - id: my_method_route uri: lb://boot-cloud1 predicates: - Method=POST
lb是對服務進行負載均衡的意思,需要添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
啟動後,就可以對服務進行轉發瞭。
到此這篇關於SpringCloud中Gateway的使用教程詳解的文章就介紹到這瞭,更多相關SpringCloud Gateway內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 深入剖析網關gateway原理
- SpringCloud超詳細講解微服務網關Gateway
- Gateway網關工作原理及使用方法
- SpringCloud Gateway的基本入門和註意點詳解
- springcloud gateway無法路由問題的解決