spring cloud gateway 如何修改請求路徑Path
一、背景
項目升級改造,老項目使用請求url中特定參數(shù)進行服務路由,現(xiàn)使用gateway網(wǎng)關進行路由服務信息
二、根據(jù)參數(shù)信息修改請求路徑Path
@Component
public class RequestFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest str = exchange.getRequest();
if (str.getQueryParams().containsKey("demo")){
addOriginalRequestUrl(exchange, str.getURI());
String newPath =str.getPath()+"demo";
ServerHttpRequest newRequest = str.mutate()
.path(newPath)
.build();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());
return chain.filter(exchange.mutate()
.request(newRequest).build());
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 1;
}
1、根據(jù)url路徑是否包含特定參數(shù)demo字段進行過濾
2、注意這個只是修改path路徑值,并不能修改gateway路由得serverid
3、getOrder方法 執(zhí)行順先順序0-100
spring cloud gateway 設置context-path服務路由404排查
一、背景
最近做網(wǎng)關重構,技術選型為spring cloud gateway,采用consul作為配置中心和注冊中心,秉承不重啟原則,網(wǎng)關內(nèi)部實現(xiàn)動態(tài)路由機制,采用定時任務定時更新網(wǎng)關路由信息。
二、服務信息
微服務網(wǎng)關:spring-cloud-gateway
微服務:order-service、user-service
三、問題描述
因為網(wǎng)關服務集成了knife4j,因此可以通過訪問http://網(wǎng)關ip:port/doc.html,即可訪問所有在同一個注冊中心的服務的knife4j信息,但是實際訪問時用戶服務相關接口報404錯誤。
四、問題排查
1、排查發(fā)現(xiàn)order-service未設置server.servlet.context-path,user-service有設置;
2、驗證context-path的影響發(fā)現(xiàn)在路由設置時path字段值必須加前綴再截取才可以正常路由;
3、由于公司網(wǎng)關是既有產(chǎn)品,當前是技術框架重構,因此不能改動原來接口訪問路徑,因此不可以在原有路徑前面再加前綴;
排查源碼發(fā)現(xiàn)請求會經(jīng)過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網(wǎng)關主動從consul拉取路由信息并設置默認過濾器,該操作會設置默認過濾規(guī)則,reWritePath匹配正則修改請求路徑
在啟動類添加注解:
@SpringBootApplication( exclude = org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration.class)
4)推薦使用
重寫過濾鏈(只需添加如下配置):
spring.cloud.gateway.discovery.locator.filters[0]=PreserveHostHeader
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
吊打Java面試官之Lambda表達式 Stream API
這篇文章主要介紹了吊打Java之jdk8的新特性包括Lambda表達式、函數(shù)式接口、Stream API全面刨析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
Spring boot 數(shù)據(jù)庫連接斷線重連問題
這篇文章主要介紹了Spring boot 數(shù)據(jù)庫連接斷線重連問題,需要的朋友可以參考下2017-06-06
Java中Collection集合常用API之?Collection存儲自定義類型對象的示例代碼
Collection是單列集合的祖宗接口,因此它的功能是全部單列集合都可以繼承使用的,這篇文章主要介紹了Java中Collection集合常用API?-?Collection存儲自定義類型對象,需要的朋友可以參考下2022-12-12
一文詳解SpringBoot響應壓縮功能的配置與優(yōu)化
Spring Boot的響應壓縮功能基于智能協(xié)商機制,需同時滿足很多條件,本文主要為大家詳細介紹了SpringBoot響應壓縮功能的配置與優(yōu)化,需要的可以參考下2025-03-03
Java源碼解析阻塞隊列ArrayBlockingQueue功能簡介
今天小編就為大家分享一篇關于Java源碼解析阻塞隊列ArrayBlockingQueue功能簡介,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01

