從0到1學(xué)SpringCloud之SpringCloud?gateway網(wǎng)關(guān)路由配置示例詳解
一、前言
微服務(wù)中經(jīng)常用到gateway作為網(wǎng)關(guān),它有什么作用,怎么使用?
Spring Cloud Gateway的目標(biāo)提供統(tǒng)一的路由方式且基于Filter 鏈的方式提供了網(wǎng)關(guān)基本的功能, 例如:安全、監(jiān)控、指標(biāo)和限流 。
Spring Cloud Gateway的通信框架使用的是Netty。
特點(diǎn):
1、動(dòng)態(tài)路由:能夠匹配任何請(qǐng)求屬性
2、可以對(duì)路由指定Predicate(斷言)和Filter(過(guò)濾器) :
predicate,可以理解為匹配條件;filter,可以理解為攔截器。
3、集成Hystrix的斷路器功能
4、集成SpringCloud服務(wù)發(fā)現(xiàn)功能
5、請(qǐng)求限流功能
6、支持路徑重寫(xiě)
二、代碼演示
1、配置文件
為了更好的理解,我們先配置幾個(gè)請(qǐng)求路徑
yml格式配置如下:
server:
port: 9999
#服務(wù)名稱(chēng)
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 # 請(qǐng)求 http://localhost:9999/user/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-user 服務(wù)
uri: lb://zhufeng-web-user #在服務(wù)注冊(cè)中心找服務(wù)名為 zhufeng-web-user 的服務(wù)
predicates:
- Path=/user/info # 設(shè)置路由斷言,當(dāng)請(qǐng)求 /user/info 時(shí)進(jìn)行轉(zhuǎn)發(fā)
- id: zhufeng-web-msg # 請(qǐng)求 http://localhost:9999/route/msg/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-msg 服務(wù)
uri: lb://zhufeng-web-msg
predicates:
- Path=/route/msg/info # 設(shè)置路由斷言,當(dāng)請(qǐng)求 /msg/info 時(shí)進(jìn)行轉(zhuǎn)發(fā)
filters:
- StripPrefix=1 # 前綴, 在當(dāng)前路徑匹配中表示去掉第一個(gè)前綴 /route配置說(shuō)明:
1、定義gateway的端口為9999
2、注冊(cè)中心使用nacos
3、配置路由規(guī)則:
請(qǐng)求 http://localhost:9999/user/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-user 服務(wù)
請(qǐng)求 http://localhost:9999/route/msg/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-msg 服務(wù)
如果使用的是properties配置文件,則需要對(duì)數(shù)組的配置進(jìn)行轉(zhuǎn)換:
#服務(wù)端口 server.port=9999 #服務(wù)名稱(chēng) spring.application.name=zhufeng-gateway-config # 請(qǐng)求 http://localhost:9999/user/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-user 服務(wù) spring.cloud.gateway.routes[0].id=zhufeng-web-user # 在服務(wù)注冊(cè)中心找服務(wù)名為 zhufeng-web-user 的服務(wù) spring.cloud.gateway.routes[0].uri=lb://zhufeng-web-user # 設(shè)置路由斷言,當(dāng)請(qǐng)求 /user/info 時(shí)進(jìn)行轉(zhuǎn)發(fā) spring.cloud.gateway.routes[0].predicates[0]=Path=/user/info # 請(qǐng)求 http://localhost:9999/msg/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-msg 服務(wù) spring.cloud.gateway.routes[1].id=zhufeng-web-msg # 在服務(wù)注冊(cè)中心找服務(wù)名為 zhufeng-web-msg 的服務(wù) #lb://zhufeng-web-msg spring.cloud.gateway.routes[1].uri=lb://zhufeng-web-msg # 設(shè)置路由斷言,當(dāng)請(qǐng)求 /msg/info 時(shí)進(jìn)行轉(zhuǎn)發(fā) spring.cloud.gateway.routes[1].predicates[0]=Path=/route/msg/info # 前綴, 在當(dāng)前路徑匹配中表示去掉第一個(gè)前綴 /route spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1
2、pom依賴(lài)
使用的微服務(wù)的版本信息如下:
<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 網(wǎng)關(guān)依賴(lài),內(nèi)置webflux 依賴(lài) --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--斷路器依賴(lài) --> <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中移除默認(rèn)nacos-client版本,替換方式如下:
<!--注冊(cè)中心客戶(hù)端 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <exclusions> <!--移除默認(rèn)版本,默認(rèn)為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>
啟動(dòng)類(lèi):
package com.zhufeng.gateway.config;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
/**
* @ClassName: GatewayConfigApplication
* @Description 網(wǎng)關(guān)啟動(dòng)類(lèi)
* @author 月夜?fàn)T峰
* @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)建微服務(wù)
創(chuàng)建兩個(gè)微服務(wù) 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路由測(cè)試
* @author 月夜?fàn)T峰
* @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","月夜?fàn)T峰");
return userJson.toJSONString();
}
}配置文件:
#服務(wù)端口
server.port=8081
#服務(wù)名稱(chēng)
spring.application.name=zhufeng-web-user
在 zhufeng-web-msg 創(chuàng)建對(duì)應(yīng)Controller
package com.zhufeng.web.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: MsgController
* @Description 消息路由測(cè)試
* @author 月夜?fàn)T峰
* @date 2022/7/22 20:33
*/
@RequestMapping("msg")
@RestController
public class MsgController {
@RequestMapping("info")
public String showInfo() {
return "good luck~";
}
}配置文件:
#服務(wù)端口
server.port=8080
#服務(wù)名稱(chēng)
spring.application.name=zhufeng-web-msg
分別啟動(dòng)網(wǎng)關(guān)微服務(wù)、zhufeng-web-user、zhufeng-web-msg

進(jìn)入nacos控制臺(tái),可以看到已經(jīng)注冊(cè)成功。
三、請(qǐng)求測(cè)試
1、微服務(wù)請(qǐng)求轉(zhuǎn)發(fā)
zhufeng-gateway-config微服務(wù)只有一個(gè)啟動(dòng)類(lèi),沒(méi)有其它代碼,所有的請(qǐng)求會(huì)根據(jù)路由規(guī)則進(jìn)行轉(zhuǎn)發(fā)。
請(qǐng)求 http://localhost:9999/user/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-user 服務(wù)

請(qǐng)求 http://localhost:9999/route/msg/info 會(huì)轉(zhuǎn)發(fā)到 zhufeng-web-msg 服務(wù)

轉(zhuǎn)發(fā)到 zhufeng-web-user 的路由規(guī)則 比較好理解,就是根據(jù)請(qǐng)求路徑進(jìn)行轉(zhuǎn)發(fā),但是在zhufeng-web-msg微服務(wù)中,我們并沒(méi)有配置 route 的請(qǐng)求前綴,但依然可以轉(zhuǎn)發(fā)到 MsgController , 這是因?yàn)間ateway通過(guò)過(guò)濾器 filters 屬性 StripPrefix=1 去掉了第一個(gè)uri前綴。
如果設(shè)置 StripPrefix=2 ,則會(huì)去掉前面兩個(gè)前綴
原uri /route/msg/info 轉(zhuǎn)換為 /info
2、第三方請(qǐng)求轉(zhuǎn)發(fā)
網(wǎng)關(guān)中配置的都是我們自己的微服務(wù),如果請(qǐng)求的服務(wù)并沒(méi)有注冊(cè)到我們nacos中,或者請(qǐng)求的服務(wù)為第三方,該如何處理?
在gateway中新增配置項(xiàng),properties格式如下:
spring.cloud.gateway.routes[2].id=zhufeng-route-zhufeng #請(qǐng)求 http://localhost:9999/route/yyzhufeng 會(huì)轉(zhuǎn)發(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 # 前綴, 在當(dāng)前路徑匹配中表示去掉前兩個(gè)前綴 /route/yyzhufeng spring.cloud.gateway.routes[2].filters[0]=StripPrefix=2
請(qǐng)求 http://localhost:9999/route/yyzhufeng 會(huì)轉(zhuǎn)發(fā)到 https://www.csdn.net/

到此這篇關(guān)于從0到1學(xué)SpringCloud之SpringCloud gateway網(wǎng)關(guān)路由配置示例詳解的文章就介紹到這了,更多相關(guān)SpringCloud gateway網(wǎng)關(guān)路由內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis?連接mysql數(shù)據(jù)庫(kù)底層運(yùn)行的原理分析
這篇文章主要介紹了Mybatis?連接mysql數(shù)據(jù)庫(kù)底層運(yùn)行的原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
java編程經(jīng)典案例之基于斐波那契數(shù)列解決兔子問(wèn)題實(shí)例
這篇文章主要介紹了java編程經(jīng)典案例之基于斐波那契數(shù)列解決兔子問(wèn)題,結(jié)合完整實(shí)例形式分析了斐波那契數(shù)列的原理及java解決兔子問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
Java利用trueLicense實(shí)現(xiàn)項(xiàng)目離線(xiàn)證書(shū)授權(quán)操作步驟
文章介紹了如何使用trueLicense實(shí)現(xiàn)離線(xiàn)授權(quán)控制,包括生成公私鑰、創(chuàng)建證書(shū)校驗(yàn)?zāi)K、生成證書(shū)模塊和測(cè)試模塊,通過(guò)這種方式,可以控制用戶(hù)使用的項(xiàng)目模塊、授權(quán)周期、使用的設(shè)備和服務(wù)器,感興趣的朋友跟隨小編一起看看吧2024-11-11
springboot中縮短一個(gè)url鏈接的實(shí)現(xiàn)
縮短 URL 是現(xiàn)代應(yīng)用程序中常見(jiàn)的需求,通常用于減少長(zhǎng) URL 的長(zhǎng)度,使其更易于分享,URL 縮短服務(wù)的核心思路是將長(zhǎng) URL 映射到一個(gè)唯一的短代碼,本文主要介紹了springboot中縮短一個(gè)url鏈接的實(shí)現(xiàn),感興趣的可以了解一下2024-09-09
教你開(kāi)發(fā)腳手架集成Spring?Boot?Actuator監(jiān)控的詳細(xì)過(guò)程
這篇文章主要介紹了開(kāi)發(fā)腳手架集成Spring?Boot?Actuator監(jiān)控的詳細(xì)過(guò)程,集成包括引入依賴(lài)配置文件及訪(fǎng)問(wèn)驗(yàn)證的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式
這篇文章主要介紹了SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java設(shè)計(jì)模式之單例設(shè)計(jì)模式解析
這篇文章主要介紹了Java設(shè)計(jì)模式之單例設(shè)計(jì)模式解析,設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問(wèn)題的思考方式,設(shè)計(jì)模式免去我們自己再思考和摸索,需要的朋友可以參考下2023-11-11
intellij idea快速查看當(dāng)前類(lèi)中的所有方法(推薦)
這篇文章主要介紹了intellij idea快速查看當(dāng)前類(lèi)中的所有方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
windows下vscode+vs2019開(kāi)發(fā)JNI的示例
本文給大家普及windows下vscode+vs2019開(kāi)發(fā)JNI的示例以及各個(gè)環(huán)節(jié)的注意事項(xiàng),文章通過(guò)示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06

