spring cloud gateway如何獲取請(qǐng)求的真實(shí)地址
spring cloud gateway獲取請(qǐng)求的真實(shí)地址
在使用spring cloud gateway的時(shí)候,路由一般配置為服務(wù)名
例如 lb://BASE-API-WEB/xxx/bbb 路徑,我們無從知道,他真正路由到什么地方去了。
經(jīng)過查看源碼我發(fā)現(xiàn)了,
org.springframework.cloud.gateway.filter.LoadBalancerClientFilter
這個(gè)filter中 對(duì)lb請(qǐng)求進(jìn)行了處理,轉(zhuǎn)換成真正的url地址。
核心方法如下
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //lb下的url URI url = (URI)exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); String schemePrefix = (String)exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR); if (url == null || !"lb".equals(url.getScheme()) && !"lb".equals(schemePrefix)) { return chain.filter(exchange); } else { ServerWebExchangeUtils.addOriginalRequestUrl(exchange, url); log.trace("LoadBalancerClientFilter url before: " + url); ServiceInstance instance = this.loadBalancer.choose(url.getHost()); if (instance == null) { throw new NotFoundException("Unable to find instance for " + url.getHost()); } else { URI uri = exchange.getRequest().getURI(); String overrideScheme = null; if (schemePrefix != null) { overrideScheme = url.getScheme(); } //真實(shí)的url URI requestUrl = this.loadBalancer.reconstructURI(new LoadBalancerClientFilter.DelegatingServiceInstance(instance, overrideScheme), uri); log.trace("LoadBalancerClientFilter url chosen: " + requestUrl); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, requestUrl); return chain.filter(exchange); } } }
其實(shí),spring cloud gateway 已經(jīng)打印了日志,但是默認(rèn)的他是trace級(jí)別的,我們常用的日志級(jí)別是info級(jí)別,所有他不會(huì)打印,這就導(dǎo)致了我們?cè)谌罩局锌床坏秸鎸?shí)的url地址
以下是解決辦法
1.在配置文件中設(shè)置org.springframework.cloud.gateway.filter.LoadBalancerClientFilter的日志級(jí)別
logging.level.org.springframework.cloud.gateway.filter.LoadBalancerClientFilter=TRACE
注意 這里的配置一定要在
logging.level.org.springframework之后配置 不然會(huì)覆蓋
2.重寫LoadBalancerClientFilter 建立org.springframework.cloud.gateway.filter包 將 類重寫 spingboot默認(rèn)會(huì)從本項(xiàng)目中加載類,原先的類就被棄用了。
3.繼承LoadBalancerClientFilter 重寫filter方法,將日志級(jí)別改為info即可
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { URI url = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); String schemePrefix = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR); if (url == null || !"lb".equals(url.getScheme()) && !"lb".equals(schemePrefix)) { return chain.filter(exchange); } else { ServerWebExchangeUtils.addOriginalRequestUrl(exchange, url); ServiceInstance instance = this.loadBalancer.choose(url.getHost()); if (instance == null) { throw new NotFoundException("Unable to find instance for " + url.getHost()); } else { URI uri = exchange.getRequest().getURI(); String overrideScheme = null; if (schemePrefix != null) { overrideScheme = url.getScheme(); } URI requestUrl = this.loadBalancer.reconstructURI(new LoadBalancerClientFilterBean.DelegatingServiceInstance(instance, overrideScheme), uri); logger.info("before url = {} , url chosen = {} " ,url, requestUrl); exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, requestUrl); return chain.filter(exchange); } } }
最終效果如下 :
spring cloud的GateWay網(wǎng)關(guān)中如何debug得到真實(shí)的路由地址
org.springframework.cloud.gateway.filter下面的
然后按下 Step over 就得到了 mergedUrl 這個(gè)變量,然后就可以看到真實(shí)請(qǐng)求的地址了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)文件點(diǎn)擊沒反應(yīng)的方法
jsp頁(yè)面鏈接,點(diǎn)擊訪問action用IO流去下載服務(wù)器上的文件,問題是任憑怎么點(diǎn)擊都沒反應(yīng),日志也不報(bào)錯(cuò)。這篇文章給大家介紹Java實(shí)現(xiàn)文件點(diǎn)擊沒反應(yīng)的方法,需要的朋友參考下吧2018-07-07spring通過jdbc連接數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了spring通過jdbc連接數(shù)據(jù)庫(kù)的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Spring?Boot?整合?Fisco?Bcos的案例分析(區(qū)塊鏈)
本篇文章介紹的?Spring?Boot?整合?Fisco?Bcos的案例,是在阿里云服務(wù)器上部署驗(yàn)證的。大家可根據(jù)自己的電腦環(huán)境,對(duì)比該案例進(jìn)行開發(fā)即可,具體案例代碼跟隨小編一起看看吧2022-01-01Java實(shí)現(xiàn)簡(jiǎn)單的日歷界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的日歷界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06線程池中使用spring aop事務(wù)增強(qiáng)
這篇文章主要介紹了線程池中使用spring aop事務(wù)增強(qiáng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot集成JWT的工具類與攔截器實(shí)現(xiàn)方式
這篇文章主要介紹了SpringBoot集成JWT的工具類與攔截器實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01