使用Zuul服务和Spring Boot时如何在路由服务中获取实际的请求URL?

时间:2018-06-29 14:05:35

标签: spring-mvc spring-boot netflix-zuul

我正在使用zuul服务作为我所有微服务的API网关。

在zuul过滤器中,我能够获得如下所示的requestUrl:

import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.context.RequestContext;
.....
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String requestUrl = request.getRequestURL();

在这里requestUrl:http://localhost:8052/api/userservice/users

在用户服务中,当我尝试使用HttpServletRequest在spring boot rest控制器中获取请求URL时:

String requestUrl = request.getRequestURL();

在这里requestUrl:http://localhost:8055/userservice/users

我得到的是路由服务请求url,而不是客户端请求的实际URL。

如何在路由服务中获取实际的请求URL?

2 个答案:

答案 0 :(得分:0)

之所以获得路由服务,是因为在修改请求URL后调用getRequestURL方法时。在pre过滤器中调用相同的方法(例如,顺序为-50),可以获得实际收到的URL zuul服务器。

到目前为止,在修改请求后,我没有找到任何方法来获取路由/发布过滤器中的实际URL,我认为解决此问题的一种方法是定义一个前置过滤器,以在修改前获取实际URL,并将该网址放入Threadlocal字段,然后可以通过访问该字段在路由/发布过滤器中获取该网址。

答案 1 :(得分:0)

Zuul为用户服务创建一个新的Http请求。显然使用不同的URL。 因此,在用户服务中,无法通过设计访问原始请求。

Zuul应该封装原始请求,而不是透露它。 所有标头,请求参数,请求正文都应保留,这只是要更改的路径。

如果出于某种原因需要从原始请求中获取参数,则可以在Zuul过滤器中将其提取并设置为“新”请求的标头,然后再发送给用户服务。 然后,在UserService中还应该有一个过滤器,该过滤器将“读取”这些标头并根据需要使用信息

相关问题