最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring cloud gateway如何獲取請(qǐng)求的真實(shí)地址

 更新時(shí)間:2023年05月06日 09:06:28   作者:一只豬啊啊  
這篇文章主要介紹了spring cloud gateway如何獲取請(qǐng)求的真實(shí)地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring cloud gateway獲取請(qǐng)求的真實(shí)地址

在使用spring cloud gateway的時(shí)候,路由一般配置為服務(wù)名

例如 lb://BASE-API-WEB/xxx/bbb 路徑,我們無(wú)從知道,他真正路由到什么地方去了。

經(jīng)過(guò)查看源碼我發(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.重寫(xiě)LoadBalancerClientFilter 建立org.springframework.cloud.gateway.filter包 將 類(lèi)重寫(xiě) spingboot默認(rèn)會(huì)從本項(xiàng)目中加載類(lèi),原先的類(lèi)就被棄用了。

3.繼承LoadBalancerClientFilter 重寫(xiě)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)文章

  • 詳解springboot中redis的使用和分布式session共享問(wèn)題

    詳解springboot中redis的使用和分布式session共享問(wèn)題

    這篇文章主要介紹了詳解springboot中redis的使用和分布式session共享問(wèn)題,詳細(xì)的介紹了解決分布式系統(tǒng)的session如何共享問(wèn)題,有興趣的可以了解一下
    2017-11-11
  • springboot整合couchbase集群的步驟

    springboot整合couchbase集群的步驟

    couchbase是一款開(kāi)源的,分布式的nosql數(shù)據(jù)庫(kù),主要用于分布式緩存和數(shù)據(jù)存儲(chǔ)領(lǐng)域,本文給大家介紹springboot整合couchbase集群的步驟,感興趣的朋友一起看看吧
    2025-03-03
  • 詳解Java類(lèi)動(dòng)態(tài)加載和熱替換

    詳解Java類(lèi)動(dòng)態(tài)加載和熱替換

    本文主要介紹類(lèi)加載器、自定義類(lèi)加載器及類(lèi)的加載和卸載等內(nèi)容,并舉例介紹了Java類(lèi)的熱替換。
    2021-05-05
  • RabbitMQ的ACK確認(rèn)機(jī)制保障消費(fèi)端消息的可靠性詳解

    RabbitMQ的ACK確認(rèn)機(jī)制保障消費(fèi)端消息的可靠性詳解

    這篇文章主要介紹了RabbitMQ的ACK確認(rèn)機(jī)制保障消費(fèi)端消息的可靠性詳解,簡(jiǎn)單來(lái)說(shuō),就是你必須關(guān)閉 RabbitMQ 的自動(dòng)ack ,可以通過(guò)一個(gè) api 來(lái)調(diào)用就行,然后每次你自己代碼里確保處理完的時(shí)候,再在程序里 ack 一把,需要的朋友可以參考下
    2023-12-12
  • Spring5.2.x 源碼本地環(huán)境搭建的方法步驟

    Spring5.2.x 源碼本地環(huán)境搭建的方法步驟

    這篇文章主要介紹了Spring5.2.x 源碼本地環(huán)境搭建的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java獲取各種路徑的基本方法

    java獲取各種路徑的基本方法

    這篇文章主要為大家詳細(xì)介紹了java獲取各種路徑的基本方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例

    spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例

    本篇文章主要介紹了spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 解決IDEA安裝插件搜索不到插件的問(wèn)題

    解決IDEA安裝插件搜索不到插件的問(wèn)題

    這篇文章主要介紹了解決IDEA安裝插件搜索不到插件的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 老生常談Java中instanceof關(guān)鍵字的理解

    老生常談Java中instanceof關(guān)鍵字的理解

    java 中的instanceof 運(yùn)算符是用來(lái)在運(yùn)行時(shí)指出對(duì)象是否是特定類(lèi)的一個(gè)實(shí)例。這篇文章主要介紹了老生常談Java中instanceof關(guān)鍵字的理解,需要的朋友可以參考下
    2018-10-10
  • 代理模式:JAVA靜態(tài)代理和動(dòng)態(tài)代理的實(shí)例和實(shí)現(xiàn)詳解

    代理模式:JAVA靜態(tài)代理和動(dòng)態(tài)代理的實(shí)例和實(shí)現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于Java靜態(tài)代理和動(dòng)態(tài)代理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評(píng)論

育儿| 云南省| 江永县| 洛南县| 永昌县| 和林格尔县| 弥渡县| 寿阳县| 南阳市| 泽州县| 临夏县| 永年县| 东辽县| 紫金县| 洞口县| 寿光市| 长兴县| 青川县| 和林格尔县| 吉安县| 汝州市| 迁西县| 桦川县| 新田县| 阿拉善盟| 惠东县| 达尔| 银川市| 德化县| 连城县| 同江市| 讷河市| 壤塘县| 扎鲁特旗| 苍南县| 星座| 若羌县| 乐陵市| 莫力| 嘉义县| 孝义市|