從0到1學SpringCloud之SpringCloud?gateway網關路由配置示例詳解
一、前言
微服務中經常用到gateway作為網關,它有什么作用,怎么使用?
Spring Cloud Gateway的目標提供統(tǒng)一的路由方式且基于Filter 鏈的方式提供了網關基本的功能, 例如:安全、監(jiān)控、指標和限流 。
Spring Cloud Gateway的通信框架使用的是Netty。
特點:
1、動態(tài)路由:能夠匹配任何請求屬性
2、可以對路由指定Predicate(斷言)和Filter(過濾器) :
predicate,可以理解為匹配條件;filter,可以理解為攔截器。
3、集成Hystrix的斷路器功能
4、集成SpringCloud服務發(fā)現(xiàn)功能
5、請求限流功能
6、支持路徑重寫
二、代碼演示
1、配置文件
為了更好的理解,我們先配置幾個請求路徑
yml格式配置如下:
server: port: 9999 #服務名稱 spring: application: name: zhufeng-gateway-config cloud: nacos: config: server-addr: ${spring.cloud.nacos.discovery.server-addr} discovery: server-addr: 127.0.0.1:8848 gateway: routes: - id: zhufeng-web-user # 請求 http://localhost:9999/user/info 會轉發(fā)到 zhufeng-web-user 服務 uri: lb://zhufeng-web-user #在服務注冊中心找服務名為 zhufeng-web-user 的服務 predicates: - Path=/user/info # 設置路由斷言,當請求 /user/info 時進行轉發(fā) - id: zhufeng-web-msg # 請求 http://localhost:9999/route/msg/info 會轉發(fā)到 zhufeng-web-msg 服務 uri: lb://zhufeng-web-msg predicates: - Path=/route/msg/info # 設置路由斷言,當請求 /msg/info 時進行轉發(fā) filters: - StripPrefix=1 # 前綴, 在當前路徑匹配中表示去掉第一個前綴 /route
配置說明:
1、定義gateway的端口為9999
2、注冊中心使用nacos
3、配置路由規(guī)則:
請求 http://localhost:9999/user/info 會轉發(fā)到 zhufeng-web-user 服務
請求 http://localhost:9999/route/msg/info 會轉發(fā)到 zhufeng-web-msg 服務
如果使用的是properties配置文件,則需要對數(shù)組的配置進行轉換:
#服務端口 server.port=9999 #服務名稱 spring.application.name=zhufeng-gateway-config # 請求 http://localhost:9999/user/info 會轉發(fā)到 zhufeng-web-user 服務 spring.cloud.gateway.routes[0].id=zhufeng-web-user # 在服務注冊中心找服務名為 zhufeng-web-user 的服務 spring.cloud.gateway.routes[0].uri=lb://zhufeng-web-user # 設置路由斷言,當請求 /user/info 時進行轉發(fā) spring.cloud.gateway.routes[0].predicates[0]=Path=/user/info # 請求 http://localhost:9999/msg/info 會轉發(fā)到 zhufeng-web-msg 服務 spring.cloud.gateway.routes[1].id=zhufeng-web-msg # 在服務注冊中心找服務名為 zhufeng-web-msg 的服務 #lb://zhufeng-web-msg spring.cloud.gateway.routes[1].uri=lb://zhufeng-web-msg # 設置路由斷言,當請求 /msg/info 時進行轉發(fā) spring.cloud.gateway.routes[1].predicates[0]=Path=/route/msg/info # 前綴, 在當前路徑匹配中表示去掉第一個前綴 /route spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1
2、pom依賴
使用的微服務的版本信息如下:
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
<dependencies> <!--gateway 網關依賴,內置webflux 依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--斷路器依賴 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-extension</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> </dependencies>
注意:
如果nacos使用的不是2.x版本,需要從spring-cloud-starter-alibaba-nacos-discovery中移除默認nacos-client版本,替換方式如下:
<!--注冊中心客戶端 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <!--移除默認版本,默認為2.x版本--> <exclusion> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.4.3</version> </dependency>
啟動類:
package com.zhufeng.gateway.config; import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; /** * @ClassName: GatewayConfigApplication * @Description 網關啟動類 * @author 月夜燭峰 * @date 2022/7/22 20:11 */ @SpringCloudApplication public class GatewayConfigApplication { public static void main(String[] args) throws Exception { SpringApplication.run(GatewayConfigApplication.class, args); } }
3、創(chuàng)建微服務
創(chuàng)建兩個微服務 zhufeng-web-user 、 zhufeng-web-msg
在zhufeng-web-user創(chuàng)建Controller:
package com.zhufeng.web.controller; import com.alibaba.fastjson.JSONObject; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @ClassName: UserController * @Description User路由測試 * @author 月夜燭峰 * @date 2022/7/22 20:01 */ @RestController @RequestMapping("user") public class UserController { @RequestMapping("info") public String userInfo(){ JSONObject userJson = new JSONObject(); userJson.put("id","user1001"); userJson.put("name","月夜燭峰"); return userJson.toJSONString(); } }
配置文件:
#服務端口
server.port=8081
#服務名稱
spring.application.name=zhufeng-web-user
在 zhufeng-web-msg 創(chuàng)建對應Controller
package com.zhufeng.web.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @ClassName: MsgController * @Description 消息路由測試 * @author 月夜燭峰 * @date 2022/7/22 20:33 */ @RequestMapping("msg") @RestController public class MsgController { @RequestMapping("info") public String showInfo() { return "good luck~"; } }
配置文件:
#服務端口
server.port=8080
#服務名稱
spring.application.name=zhufeng-web-msg
分別啟動網關微服務、zhufeng-web-user、zhufeng-web-msg
進入nacos控制臺,可以看到已經注冊成功。
三、請求測試
1、微服務請求轉發(fā)
zhufeng-gateway-config微服務只有一個啟動類,沒有其它代碼,所有的請求會根據路由規(guī)則進行轉發(fā)。
請求 http://localhost:9999/user/info 會轉發(fā)到 zhufeng-web-user 服務
請求 http://localhost:9999/route/msg/info 會轉發(fā)到 zhufeng-web-msg 服務
轉發(fā)到 zhufeng-web-user 的路由規(guī)則 比較好理解,就是根據請求路徑進行轉發(fā),但是在zhufeng-web-msg微服務中,我們并沒有配置 route 的請求前綴,但依然可以轉發(fā)到 MsgController , 這是因為gateway通過過濾器 filters 屬性 StripPrefix=1 去掉了第一個uri前綴。
如果設置 StripPrefix=2 ,則會去掉前面兩個前綴
原uri /route/msg/info 轉換為 /info
2、第三方請求轉發(fā)
網關中配置的都是我們自己的微服務,如果請求的服務并沒有注冊到我們nacos中,或者請求的服務為第三方,該如何處理?
在gateway中新增配置項,properties格式如下:
spring.cloud.gateway.routes[2].id=zhufeng-route-zhufeng #請求 http://localhost:9999/route/yyzhufeng 會轉發(fā)到 https://www.csdn.net/ spring.cloud.gateway.routes[2].uri=https://www.csdn.net/ spring.cloud.gateway.routes[2].predicates[0]=Path=/route/yyzhufeng # 前綴, 在當前路徑匹配中表示去掉前兩個前綴 /route/yyzhufeng spring.cloud.gateway.routes[2].filters[0]=StripPrefix=2
請求 http://localhost:9999/route/yyzhufeng 會轉發(fā)到 https://www.csdn.net/
到此這篇關于從0到1學SpringCloud之SpringCloud gateway網關路由配置示例詳解的文章就介紹到這了,更多相關SpringCloud gateway網關路由內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解
這篇文章主要介紹了Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08Java 在PPT中添加文本和圖片超鏈接的實現(xiàn)方法
這篇文章主要介紹了Java 在PPT中添加文本和圖片超鏈接的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05SpringBoot整合Flink CDC實現(xiàn)實時追蹤mysql數(shù)據變動
我們將整合Spring Boot和Apache Flink CDC(Change Data Capture)來實現(xiàn)實時數(shù)據追蹤,下面是一個基本的實踐流程代碼,包括搭建Spring Boot項目、整合Flink CDC以及實現(xiàn)數(shù)據變動的實時追蹤,需要的朋友可以參考下2024-07-07教你創(chuàng)建springcloud微服務的基礎子服務的超詳細過程
這篇文章主要介紹了創(chuàng)建springcloud微服務的基礎子服務,主要是創(chuàng)建兩個springboot服務,在教程中增加springcloud相關組件,本文分步驟給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04IDEA創(chuàng)建springboot + mybatis項目全過程(步驟詳解)
這篇文章主要介紹了IDEA創(chuàng)建springboot + mybatis項目全過程及步驟詳解,本文通圖文實例代碼相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07dm.jdbc.driver.DMException網絡通信異常的解決過程
最近一個項目里面出現(xiàn)了一個比較詭異的問題,給大家分享下,這篇文章主要給大家介紹了關于dm.jdbc.driver.DMException網絡通信異常的解決過程,需要的朋友可以參考下2023-02-02一文帶你深入理解Java?AbstractQueuedSynchronizer
在并發(fā)編程中,鎖是一種保證線程安全的方式,這篇文章主要為大家介紹了AbstractQueuedSynchronizer(AQS)的數(shù)據結構及實現(xiàn)原理,感興趣的小伙伴可以了解一下2023-07-07