spring cloud gateway如何获取请求的真实地址
作者:一只猪啊啊 发布时间:2023-11-28 20:20:12
标签: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 这个变量,然后就可以看到真实请求的地址了
来源:https://blog.csdn.net/qq_37616173/article/details/82657964


猜你喜欢
- JAVA常用关键字及其用法简要说明Abstract: 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可
- 1、引入依赖<dependency><groupId>org.springframework.boot</gr
- 正常情况下,我们是直接去string的length的,但是汉字是有两个字节的,所以直接用length是错的。如下图:所以应该用以下代码来获取
- 微信开发API如何接入服务器,下面就为大家进行介绍一、说明* 本示例根据微信开发文档:http://mp.weixin.qq.com/wik
- 前言最近对 base-spring-boot 项目进行了升级。在将其用于应用开发中时遇到java.lang.ArrayStoreE
- 在nginx.conf文件的http模块新增以下内容gzip &nbs
- 使用工具:Android studio 3.0使用方法:一:在build.gradle(Module:app)中添加依赖implementa
- 本文实例讲述了Android实现音量调节的方法。分享给大家供大家参考。具体如下:main.xml布局文件:<?xml version=
- 一、可空类型修饰符(?)C#2.0里面实现了Nullable数据类型//A.比如下面一句,直接定义int为null是错误的,错误提示为无法将
- 在项目中,都会用到ListView或GridView等列表控件。一般会用来展示从网络请求的数据 。如果请求的数据为空或者在请求的时候正好无没
- IDEA SpringBoot项目配置热更新的步骤1.在pom.xml中添加依赖:<dependency><groupId
- 我们经常看到使用了ViewPager的App,在每页上面都会有一个滑块来标志当前处于哪一页。在PagerView包里有android.sup
- 需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启、程序升
- 完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。一、新闻的数据库的构建脚本代码如下:(使用的mysql5.0 数据库)SET SQL_
- 本文实例为大家分享了Android实现二级列表购物车功能的具体代码,供大家参考,具体内容如下MainActivity:package com
- 方式1:1. 明确 Spark中Job 与 Streaming中 Job 的区别1.1 Spark Core一个 RDD DAG Graph
- 你以前听到的谈论关于Java8的所有都是围绕lambda表达式. 但它仅仅是Java8的一部分. Java 8 有许多新特性—一些强大的新类
- 一、图示spring再简化:SpringBoot-jar:内嵌tomacat;微服务架构!二、springboot是什么spring是一个为
- 一、单文件压缩 场景,文件可能比较大,需要压缩传输,比如上传和下载/// <summary&g
- Unity脚本中枚举类型在inspector面板中文显示,供大家参考,具体内容如下效果:工具脚本:ChineseEnumTool.csusi