spring cloud gateway如何获取请求的真实地址

作者:一只猪啊啊 时间:2023-11-28 20:20:12 

spring cloud gateway获取请求的真实地址

在使用spring cloud gateway的时候,路由一般配置为服务名

例如 lb://BASE-API-WEB/xxx/bbb 路径,我们无从知道,他真正路由到什么地方去了。

经过查看源码我发现了,

org.springframework.cloud.gateway.filter.LoadBalancerClientFilter

这个filter中 对lb请求进行了处理,转换成真正的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();
               }
               //真实的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);
           }
       }
   }

其实,spring cloud gateway 已经打印了日志,但是默认的他是trace级别的,我们常用的日志级别是info级别,所有他不会打印,这就导致了我们在日志中看不到真实的url地址

以下是解决办法

1.在配置文件中设置org.springframework.cloud.gateway.filter.LoadBalancerClientFilter的日志级别

logging.level.org.springframework.cloud.gateway.filter.LoadBalancerClientFilter=TRACE

注意 这里的配置一定要在

logging.level.org.springframework之后配置 不然会覆盖

2.重写LoadBalancerClientFilter 建立org.springframework.cloud.gateway.filter包 将 类重写 spingboot默认会从本项目中加载类,原先的类就被弃用了。

3.继承LoadBalancerClientFilter 重写filter方法,将日志级别改为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如何获取请求的真实地址

spring cloud的GateWay网关中如何debug得到真实的路由地址

org.springframework.cloud.gateway.filter下面的

spring cloud gateway如何获取请求的真实地址

spring cloud gateway如何获取请求的真实地址

然后按下 Step over 就得到了 mergedUrl 这个变量,然后就可以看到真实请求的地址了

spring cloud gateway如何获取请求的真实地址

来源:https://blog.csdn.net/qq_37616173/article/details/82657964

标签:spring,cloud,gateway,请求,真实地址
0
投稿

猜你喜欢

  • C#使用FileStream复制一个任意文件

    2022-04-17 19:55:17
  • Java内部类及其特点的讲解

    2023-06-09 19:39:41
  • java 数据结构基本算法希尔排序

    2021-09-14 02:09:50
  • PullToRefreshListView实现多条目加载上拉刷新和下拉加载

    2022-07-21 02:26:01
  • Android实现底部导航栏功能(选项卡)

    2022-01-08 21:34:14
  • Android Mms之:短信发送流程(图文详解)

    2022-07-27 02:10:21
  • mybatis-plus QueryWrapper 添加limit方式

    2022-12-09 02:08:11
  • Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

    2023-11-24 23:24:21
  • C#实现为视频添加水印

    2022-02-16 05:30:07
  • android Launcher3设置默认桌面应用

    2022-07-20 20:18:42
  • 实现一个基于Servlet的hello world程序详解步骤

    2022-06-21 00:22:13
  • c# 使用HtmlAgilityPack解析Html

    2021-06-22 11:50:11
  • jmeter+ant+jenkins自动化测试环境配置搭建过程

    2023-11-17 23:38:06
  • Android仿京东分类效果

    2021-06-27 23:07:55
  • Android OkHttp实现全局过期token自动刷新示例

    2023-01-24 10:31:57
  • Spring Boot 利用 XML 方式整合 MyBatis

    2023-02-09 23:01:18
  • mybatis多表查询的实现(xml方式)

    2021-07-11 01:21:38
  • DevExpress实现为TextEdit设置水印文字的方法

    2021-11-11 14:27:32
  • C#中字符串的一般性和特殊性

    2023-03-23 19:06:07
  • c#语言程序构建基块

    2023-04-11 22:40:12
  • asp之家 软件编程 m.aspxhome.com