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

 更新时间:2023年05月06日 09:06:28   作者:一只猪啊啊  
这篇文章主要介绍了spring cloud gateway如何获取请求的真实地址问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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网关中如何debug得到真实的路由地址

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatis-plus分页插件失效探究解决

    mybatis-plus分页插件失效探究解决

    这篇文章主要为大家介绍了mybatis-plus分页插件失效探究解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java实现文件点击没反应的方法

    Java实现文件点击没反应的方法

    jsp页面链接,点击访问action用IO流去下载服务器上的文件,问题是任凭怎么点击都没反应,日志也不报错。这篇文章给大家介绍Java实现文件点击没反应的方法,需要的朋友参考下吧
    2018-07-07
  • spring通过jdbc连接数据库

    spring通过jdbc连接数据库

    这篇文章主要为大家详细介绍了spring通过jdbc连接数据库的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • IDEA内存调试插件(好用)

    IDEA内存调试插件(好用)

    本文给大家分享IDEA中一个很有用的内存调试插件,非常不错,具有参考借鉴价值,需要的朋友参考下
    2018-02-02
  • Spring注入方式有哪些

    Spring注入方式有哪些

    你知道Spring的注入方式有哪几种吗?这篇文章主要为大家详细介绍了Spring的注入方式,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Java 如何调用long的最大值和最小值

    Java 如何调用long的最大值和最小值

    这篇文章主要介绍了Java 如何调用long的最大值和最小值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    Spring Boot 整合 Fisco Bcos的案例分析(区块链)

    本篇文章介绍的 Spring Boot 整合 Fisco Bcos的案例,是在阿里云服务器上部署验证的。大家可根据自己的电脑环境,对比该案例进行开发即可,具体案例代码跟随小编一起看看吧
    2022-01-01
  • Java实现简单的日历界面

    Java实现简单的日历界面

    这篇文章主要为大家详细介绍了Java实现简单的日历界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 线程池中使用spring aop事务增强

    线程池中使用spring aop事务增强

    这篇文章主要介绍了线程池中使用spring aop事务增强,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringBoot集成JWT的工具类与拦截器实现方式

    SpringBoot集成JWT的工具类与拦截器实现方式

    这篇文章主要介绍了SpringBoot集成JWT的工具类与拦截器实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论