我第一次尝试构建自己的Spring Cloud应用程序
My Spring Cloud Gateway(从现在起的SCG(位于nginx的正后方
SCG将请求从nginx中继到我的Eureka服务器
我的尤里卡客户最终收到了这些请求。
问题是,当其中一个Eureka客户端服务试图提取
原始客户端的IP地址(如下所示(时,检索到的地址是运行
nginx的主机的地址,而不是客户端的地址。
@ResponseBody
public ResponseEntity<?> controllerMethod (
@RequestBody MyDto myDto
, HttpServletRequest request
) throws Exception {
String clientAddress = null;
if (Strings.isBlank(request.getHeader("X-Forwarded-For")) == true) {
clientAddress = request.getHeader("X-FORWARDED-FOR");
if (Strings.isBlank(clientAddress) == true) {
clientAddress = request.getRemoteAddr();
}
}
// ...
}
因此,我尝试了下面提到的另一个线程所描述的变通方法,
但对我来说似乎不起作用。
https://stackoverflow.com/a/67018627/2318920
我尝试应用Spring官方参考文件中的指南
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#modifying-解析远程地址的方式我无法想象示例中的整个GatewayConfig.java
文件会是什么样子。
因此,我写了我的GatewayConfig.java
如下
package root.project.path.config;
import java.net.InetSocketAddress;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.cloud.gateway.support.ipresolver.XForwardedRemoteAddressResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class GatewayConfig implements KeyResolver {
@Bean
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
XForwardedRemoteAddressResolver resolver = XForwardedRemoteAddressResolver.maxTrustedIndex(1);
InetSocketAddress inetSocketAddress = resolver.resolve(exchange);
return Mono.just(inetSocketAddress.getAddress().getHostAddress());
}
} // END: public class GatewayConfig
然后我启动我的SCG服务,它会打印如下错误消息并停止。
Jul 27 20:21:33 account gateway[2219027]: ***************************
Jul 27 20:21:33 account gateway[2219027]: APPLICATION FAILED TO START
Jul 27 20:21:33 account gateway[2219027]: ***************************
Jul 27 20:21:33 account gateway[2219027]: Description:
Jul 27 20:21:33 account gateway[2219027]: Parameter 0 of method resolve in root.project.path.config.GatewayConfig required a bean of type 'org.springframework.web.server.ServerWebExchange' that could not be found.
Jul 27 20:21:33 account gateway[2219027]: Action:
Jul 27 20:21:33 account gateway[2219027]: Consider defining a bean of type 'org.springframework.web.server.ServerWebExchange' in your configuration.
我想我误解了什么。但我现在找不到它是什么
请帮帮我。
我找到了原因。事实上,SCG并没有出现这个问题。
在与我的问题相同的设置下,Eureka客户端服务中application.properties
(或我的源树中的application.yml
(处的server.forward-headers-strategy
属性项被设置为framework
。在用native
替换它之后,控制器方法中的request.getHeader("X-Forwarded-For")
部分开始返回最终客户端的IP地址。
虽然这不是SCG的问题(至少对我来说(,但我希望这篇文章能帮助那些可能正在与类似症状作斗争的人😊