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

五、解決方案
1)若配置路由URI為lb,則注冊中心服務(wù)名稱不能和server.servlet.context-path名稱一致,否則contextPath會被改寫為空字符串;
2)若注冊中心和server.servlet.context-path必須一致,則斷言中設(shè)置Path時需在contextPath前包裝一層前綴,且Filter中需截取第一個字符串;
3)禁止gateway網(wǎng)關(guān)主動從consul拉取路由信息并設(shè)置默認(rèn)過濾器,該操作會設(shè)置默認(rèn)過濾規(guī)則,reWritePath匹配正則修改請求路徑
- 在啟動類添加注解:
@SpringBootApplication( exclude = org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration.class)
4)推薦使用
- 重寫過濾鏈(只需添加如下配置):
spring.cloud.gateway.discovery.locator.filters[0]=PreserveHostHeader
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud Zuul實現(xiàn)負(fù)載均衡和熔斷機制方式
這篇文章主要介紹了SpringCloud Zuul實現(xiàn)負(fù)載均衡和熔斷機制方式,具有很好的參考價值,希望對大家有所幫助。2021-07-07
springboot整合日志處理Logback的實現(xiàn)示例
Logback是由log4j創(chuàng)始人設(shè)計的又一個開源日志組件,本文主要介紹了springboot整合日志處理Logback,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
SpringBoot讀取properties配置文件中的數(shù)據(jù)的三種方法
本文主要介紹了SpringBoot讀取properties配置文件中的數(shù)據(jù)的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
Java17中record替代Lombok部分功能使用場景探究
這篇文章主要介紹了使用Java17中的record替代Lombok的部分功能,本文來為大家小小的總結(jié)下,我們可以在哪些地方,利用record來替換Lombok2024-01-01
Java基于字符流形式讀寫數(shù)據(jù)的兩種實現(xiàn)方法示例
這篇文章主要介紹了Java基于字符流形式讀寫數(shù)據(jù)的兩種實現(xiàn)方法示,結(jié)合實例形式分析了java逐個字符讀寫及使用緩沖區(qū)進行讀寫操作的具體實現(xiàn)技巧,需要的朋友可以參考下2018-01-01

