SpringCloud中Gateway的使用教程詳解
1.基礎(chǔ)教程
pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent> <dependencies> <!--gateway不是通過(guò)servlet啟動(dòng)的,不需要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啟動(dòng)類(lèi)
@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(); } }
以上代碼,是做了個(gè)路由:如果url的path符合正則“/**”則給請(qǐng)求添加一個(gè)aa=bb的參數(shù)然后轉(zhuǎn)發(fā)到http://localhost:18080,。
如果訪(fǎng)問(wèn)http://localhost:8081/get,則最終會(huì)請(qǐng)求http://localhost:18080/get?aa=bb
我們?cè)偬砑右粋€(gè)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(); } }
以上代碼添加了一個(gè)如果是POST訪(fǎng)問(wèn),則轉(zhuǎn)發(fā)到http://localhost:18081。
那么如果我們使用POST的http://localhost:8081/aaa,則會(huì)轉(zhuǎn)發(fā)到http://localhost:18081/aaa.
值得注意的是,如果這兩個(gè)route換下位置,path=/** 的route放在method=post的上面,則會(huì)產(chǎn)生另外的情況,就是會(huì)轉(zhuǎn)發(fā)到18080上去,因?yàn)镻OST的http://localhost:8081/aaa也會(huì)匹配上/** .這些route是有先后順序的。
可以看出route有一個(gè)重要的概念,就是條件predicate,命中了什么條件就會(huì)被轉(zhuǎn)發(fā)到哪里。
Predicate來(lái)自于java8的接口。Predicate 接受一個(gè)輸入?yún)?shù),返回一個(gè)布爾值結(jié)果。該接口包含多種默認(rèn)方法來(lái)將Predicate組合成其他復(fù)雜的邏輯(比如:與,或,非)。可以用于接口請(qǐng)求參數(shù)校驗(yàn)、判斷新老數(shù)據(jù)是否有變化需要進(jìn)行更新操作。add–與、or–或、negate–非。
Spring Cloud Gateway內(nèi)置了許多Predict,這些Predict的源碼在org.springframework.cloud.gateway.handler.predicate包中,如果讀者有興趣可以閱讀一下?,F(xiàn)在列舉各種Predicate如下圖:
可以看到這有幾種類(lèi)型的Predict,而我們剛剛使用的就是METHOD和Path這兩種,當(dāng)然你可以選擇其他的。
2.將配置放在配置文件里
總是寫(xiě)些Bean實(shí)際上還是不爽,不如我們放在配置文件里面。放配置文件里面可以減少代碼量,最重要的是,如果配合springcloudconfig,可以做到在線(xiàn)更新,這就很爽了。
我們將上面的那個(gè)bean注釋掉,然后把上面的寫(xiě)到配置文件里。
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=/**
注意一些關(guān)鍵的地方,要約定大于配置比如:Method=POST Path=/**
3.放在springcloud里面
目前我們都是一個(gè)單機(jī)springboot,跟springcloud沒(méi)有關(guān)系。我們嘗試將這段配置放在nacos的config里面。
nacos新建gateway-test.yaml,類(lèi)型yaml,內(nèi)容如下:
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項(xiàng)目的pom修改下,添加了nacos的服務(wù)發(fā)現(xiàn)和配置文件。
<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版本之后需要添加下面依賴(lài)才能加載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 微服務(wù) --> <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
此時(shí)
{{spring.application.name}}-{{spring.profiles.active}}.{{spring.cloud.nacos.config.file-extension}}
正好等于我們剛才在nacos上建的gateway-test.yaml
最后是java啟動(dòng)執(zhí)行,發(fā)現(xiàn)gateway就從nacos拉取配置文件生效了。
4.使用服務(wù)名而不是IP
我們的uri轉(zhuǎn)發(fā)的都是具體的ip地址,那么真正在微服務(wù)的時(shí)候,肯定轉(zhuǎn)發(fā)的是服務(wù)名而不是ip地址。
修改gateway-test.yaml里面的uri,boot-cloud和boot-cloud1是我們創(chuàng)建的另兩個(gè)服務(wù)。
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是對(duì)服務(wù)進(jìn)行負(fù)載均衡的意思,需要添加依賴(lài)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
啟動(dòng)后,就可以對(duì)服務(wù)進(jìn)行轉(zhuǎn)發(fā)了。
到此這篇關(guān)于SpringCloud中Gateway的使用教程詳解的文章就介紹到這了,更多相關(guān)SpringCloud Gateway內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解java如何實(shí)現(xiàn)帶RequestBody傳Json參數(shù)的GET請(qǐng)求
在調(diào)試Fate平臺(tái)時(shí),遇到了一個(gè)奇葩的接口類(lèi)型,該接口為Get方式,入?yún)⑹且粋€(gè)json類(lèi)型在body中傳遞,使用body中傳參的話(huà)為什么不用POST請(qǐng)求而使用了GET請(qǐng)求,下面我們就來(lái)深入研究一下2024-02-02SpringMVC獲取請(qǐng)求參數(shù)筆記整理
本文記錄和分享在學(xué)習(xí)Spring MVC過(guò)程中的筆記,通過(guò)案例示例代碼分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04java 過(guò)濾器filter防sql注入的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇java 過(guò)濾器filter防sql注入的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08Java基于final修飾數(shù)據(jù)過(guò)程解析
這篇文章主要介紹了Java基于final修飾數(shù)據(jù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12springboot項(xiàng)目打包鏡像方式以及區(qū)分環(huán)境打包的方法
本文主要介紹了springboot項(xiàng)目打包鏡像方式以及區(qū)分環(huán)境打包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03