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

五、解決方案
1)若配置路由URI為lb,則注冊中心服務名稱不能和server.servlet.context-path名稱一致,否則contextPath會被改寫為空字符串;
2)若注冊中心和server.servlet.context-path必須一致,則斷言中設置Path時需在contextPath前包裝一層前綴,且Filter中需截取第一個字符串;
3)禁止gateway網關主動從consul拉取路由信息并設置默認過濾器,該操作會設置默認過濾規(guī)則,reWritePath匹配正則修改請求路徑
- 在啟動類添加注解:
@SpringBootApplication( exclude = org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration.class)
4)推薦使用
- 重寫過濾鏈(只需添加如下配置):
spring.cloud.gateway.discovery.locator.filters[0]=PreserveHostHeader
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
maven依賴包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bi
這篇文章主要給大家介紹了關于maven依賴包沖突SLF4J:?Class?path?contains?multiple?SLF4J?bindings的處理方法,這個問題通常是因為項目中存在多個SLF4J的實現綁定(bindings)導致的沖突,需要的朋友可以參考下2024-02-02
詳解@ConfigurationProperties實現原理與實戰(zhàn)
這篇文章主要介紹了詳解@ConfigurationProperties實現原理與實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
AsyncHttpClient的TimeoutTimerTask連接池異步超時
這篇文章主要為大家介紹了AsyncHttpClient的TimeoutTimerTask連接池異步超時源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12

