文档章节

Spring Cloud Gateway动态指定目标URI

夜雨寄北09
 夜雨寄北09
发布于 2018/06/27 18:03
字数 398
阅读 2408
收藏 4

在网关中经常有这样的需求,客户端访问网址"http://a.com/hello",网关将请求转发到"http://b.com/world"。

按照Spring的官方文档 http://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.0.0.RELEASE/multi/multi__developer_guide.html#_writing_custom_gatewayfilter_factories ,在PreGatewayFilterFactory中,修改ServerHttpRequest的uri,发现请求路径是变了,但是域名并没有生效,请求依然被转发到声明Route时的uri。

原因:

将Gateway日志设置为debug模式:logging.level.org.springframework.cloud.gateway=debug,请求filter时控制台打印日志:

2018-06-27 15:37:41.208 DEBUG 93609 --- [ctor-http-nio-3] o.s.c.g.handler.FilteringWebHandler      : Sorted gatewayFilterFactories: 
[OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter@53aa2fc9}, order=-2147482648}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@69364b2d}, order=-1}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.ForwardPathFilter@ea00de}, order=0}, 
OrderedGatewayFilter{delegate=com.example.cloud.filter.previous.PreviousFilterFactory$$Lambda$412/104912388@4127cf4b, order=1}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=com.example.cloud.filter.AuthFilter@6f9ab79d}, order=100}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@4792f119}, order=10000}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.LoadBalancerClientFilter@64ae105d}, order=10100}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@23ca36d}, order=2147483646}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyRoutingFilter@10a18e3e}, order=2147483647}, 
OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.ForwardRoutingFilter@5bde57ab}, order=2147483647}]

查看源码org.springframework.cloud.gateway.filter.NettyRoutingFilter,发现httpClient请求的url是通过exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);获取的。我们在自定义的Filter中设置目标uri:exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, targetUri); 发现并没有生效。

继续查看源码org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter,发现Spring Gateway在这个全局Filter中使用声明Route时的Uri覆盖了上面我们自己制定的GATEWAY_REQUEST_URL_ATTR。

解决:

找到问题出在Route中,我们只要在自定义的Filter中重新设置Route的Uri即可。

再次访问,已经正确跳转到我们指定的uri。

© 著作权归作者所有

共有 人打赏支持
夜雨寄北09
粉丝 14
博文 17
码字总数 16884
作品 0
浦东
程序员
私信 提问
spring cloud gateway集成hystrix实战

序 本文主要研究一下spring cloud gateway如何集成hystrix maven 添加spring-cloud-starter-netflix-hystrix依赖,开启hystrix 配置实例 首先filter里头配置了name为Hystrix的filter,实际是...

go4it
2018/06/10
0
0
Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接...

Java填坑路
2018/12/19
0
0
Spring Cloud Gateway 之Predict篇

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/84926662 转载请标明出处...

方志朋
2018/12/09
0
0
聊聊spring cloud的RequestHeaderToRequestUri

序 本文主要研究一下spring cloud的RequestHeaderToRequestUriGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gate......

go4it
2018/06/16
0
0
Spring Cloud Gateway 整合Eureka路由转发

前面我们对Spring Cloud Gateway进行了一个入门的学习,具体文章可以查看《Spring Cloud Gateway 网关尝鲜》进行学习。 网关负责转发工作,那么它需要知道后端的服务信息,今天我们来学习下S...

尹吉欢
2018/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用keepalived实现nginx的高可用

概述 是这样子的,我想让家中所有的应用服务都从nginx中出去,让nginx处于访问的最边缘地带,为了让nginx可靠性加强,所以nginx就得实现高可用,分别是下面两台机器要做nginx的集群 10.10.10...

bboysoulcn
今天
1
0
Mysql索引机制B+Tree

1、问题引入 有一个用户表,为了查询的效率,需要基于id去构建索引。构建索引我们需要考虑两个方面的问题,1个是查询的效率,1个是索引数据的存储问题。该表的记录需要支持百万、千万、甚至上...

万山红遍
今天
40
0
RDD

1.概念: RDD是spark整个体系中最基础核心的概念,RDD(Resilient Distributed DataSet)即弹性分布式数据集 弹性: RDD支持横向多分区,纵向操作内存不足写入磁盘,hdfs等,实现数据在内存和...

仟昭
今天
1
0
springboot整合mycat

动态数据源项目整合 Maven依赖信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relat......

须臾之余
今天
2
0
深入解析Vue 和微信小程序的区别、比较

写了vue项目和小程序,发现二者有许多相同之处,在此想总结一下二者的共同点和区别。 一、生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多。 vue的...

前端攻城小牛
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部