Spring cloud gateway設(shè)置context-path服務(wù)路由404排查過程
一、背景
最近做網(wǎng)關(guān)重構(gòu)
技術(shù)選型為spring cloud gateway
采用consul作為配置中心和注冊中心
秉承不重啟原則,網(wǎng)關(guān)內(nèi)部實(shí)現(xiàn)動(dòng)態(tài)路由機(jī)制
采用定時(shí)任務(wù)定時(shí)更新網(wǎng)關(guān)路由信息
二、服務(wù)信息
- 微服務(wù)網(wǎng)關(guān):spring-cloud-gateway
- 微服務(wù):order-service、user-service
三、問題描述
因?yàn)榫W(wǎng)關(guān)服務(wù)集成了knife4j
因此可以通過訪問http://網(wǎng)關(guān)ip:port/doc.html
即可訪問所有在同一個(gè)注冊中心的服務(wù)的knife4j信息
但是實(shí)際訪問時(shí)用戶服務(wù)相關(guān)接口報(bào)404錯(cuò)誤
四、問題排查
1、排查發(fā)現(xiàn)order-service未設(shè)置server.servlet.context-path,user-service有設(shè)置;
2、驗(yàn)證context-path的影響發(fā)現(xiàn)在路由設(shè)置時(shí)path字段值必須加前綴再截取才可以正常路由;
3、由于公司網(wǎng)關(guān)是既有產(chǎn)品,當(dāng)前是技術(shù)框架重構(gòu),因此不能改動(dòng)原來接口訪問路徑,因此不可以在原有路徑前面再加前綴;
排查源碼發(fā)現(xiàn)請求會(huì)經(jīng)過
- FilteringWebHandler的filter方法,此方法在路由過程中會(huì)走12個(gè)過濾器,其中第5個(gè)過濾器
- RewritePathGatewayFilterFactory中的apply方法會(huì)匹配服務(wù)啟動(dòng)時(shí)加載的regexp正則,從而對服務(wù)path進(jìn)行改寫。
源碼如下:

五、解決方案
1)若配置路由URI為lb,則注冊中心服務(wù)名稱不能和server.servlet.context-path名稱一致,否則contextPath會(huì)被改寫為空字符串;
2)若注冊中心和server.servlet.context-path必須一致,則斷言中設(shè)置Path時(shí)需在contextPath前包裝一層前綴,且Filter中需截取第一個(gè)字符串;
3)禁止gateway網(wǎng)關(guān)主動(dòng)從consul拉取路由信息并設(shè)置默認(rèn)過濾器,該操作會(huì)設(shè)置默認(rèn)過濾規(guī)則,reWritePath匹配正則修改請求路徑
- 在啟動(dòng)類添加注解:
@SpringBootApplication( exclude = org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration.class)
4)推薦使用
- 重寫過濾鏈(只需添加如下配置):
spring.cloud.gateway.discovery.locator.filters[0]=PreserveHostHeader
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Spring Cloud GateWay 路由轉(zhuǎn)發(fā)規(guī)則介紹詳解
- Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動(dòng)態(tài)路由
- Nacos+Spring Cloud Gateway動(dòng)態(tài)路由配置實(shí)現(xiàn)步驟
- spring-cloud-gateway動(dòng)態(tài)路由的實(shí)現(xiàn)方法
- springcloud gateway自定義斷言規(guī)則詳解,以后綴結(jié)尾進(jìn)行路由
- SpringCloud Gateway路由表配置實(shí)現(xiàn)小結(jié)
相關(guān)文章
springboot整合redis進(jìn)行數(shù)據(jù)操作(推薦)
springboot整合redis比較簡單,并且使用redistemplate可以讓我們更加方便的對數(shù)據(jù)進(jìn)行操作。下面通過本文給大家分享springboot整合redis進(jìn)行數(shù)據(jù)操作的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-10-10
Java的無參構(gòu)造函數(shù)用法實(shí)例分析
這篇文章主要介紹了Java的無參構(gòu)造函數(shù)用法,結(jié)合實(shí)例形式分析了java無參構(gòu)造函數(shù)基本原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-09-09
使用Feign擴(kuò)展包實(shí)現(xiàn)微服務(wù)間文件上傳
這篇文章主要為大家詳細(xì)介紹了使用Feign擴(kuò)展包實(shí)現(xiàn)微服務(wù)間文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
springboot后端存儲(chǔ)富文本內(nèi)容的思路與步驟(含圖片內(nèi)容)
在所有的編輯器中,大概最受歡迎的就是富文本編輯器和MarkDown編輯器了,下面這篇文章主要給大家介紹了關(guān)于springboot后端存儲(chǔ)富文本內(nèi)容的思路與步驟的相關(guān)資料,需要的朋友可以參考下2023-04-04
SpringBoot監(jiān)控所有線程池的四種解決方案及代碼案例
這篇文章介紹了四種監(jiān)控Spring Boot中所有線程池的解決方案,并提供了代碼案例,推薦使用自動(dòng)發(fā)現(xiàn)機(jī)制來監(jiān)控所有線程池,需要的朋友可以參考下2025-12-12

