当前位置: 首页 > 知识库问答 >
问题:

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

端木野
2023-03-14

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

在zuul filter中,我可以获得如下请求URL:

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 controller中获取请求URL时:

String requestUrl = request.getRequestURL();

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

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

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

共有2个答案

梁丘凯定
2023-03-14

祖尔创建了一个新的Http请求到用户服务。显然有不同的网址。所以在用户服务中,不可能通过设计获得对原始请求的访问。

Zuul应该封装原始请求,而不是公开它。所有的头、请求参数、请求正文都应该保留,这只是一个需要更改的路径。

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

张逸清
2023-03-14

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

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

 类似资料:
  • 我有一个相当简单的Spring CloudNetflix设置。我们使用Zuul作为反向代理,Eureka用于服务发现和注册。我们有我们正在慢慢窒息的遗留服务。我们有许多简单的服务,其endpoint配置如下: 因此,现在当每个服务都在eureka注册并随后向Zuul添加路由时,zuul终结点如下所示: 我想阻止Zuul将前缀从eureka服务的路由URI中剥离,以便我的Zuulendpoint如下

  • 我们当前的项目需求是将一些请求路由到第三方外部api服务器。为此,我们使用的是基于spring祖尔的路由器服务。 现在的要求是,对于某些endpoint,到外部api服务器的请求已经通过不属于我们的外部代理服务器路由, 如何通过卷曲完成此操作: 通过给定的代理重定向请求。如何通过spring-祖尔服务器做到这一点? 我有一条线索?https://github.com/spring-cloud/sp

  • Zuul Server是一个网关应用程序,可处理所有请求并执行微服务应用程序的动态路由。 Zuul服务器也称为边缘服务器。 例如, /api/user映射到用户服务,/ api/products映射到产品服务,Zuul Server将请求动态路由到相应的后端应用程序。 在本章中,我们将详细介绍如何在Spring Boot中创建Zuul Server应用程序。 创建Zuul服务器应用程序 Zuul

  • 我正在为我们的应用程序使用Spring boot Microservices体系结构。在我们的项目中,我们使用的是OAuth2、Jwt、Zuul和Eureka服务,我的疑问是,我是否需要将这些服务作为一个独立的服务来实现,或者我是否可以将所有服务开发成一个单一的应用程序。 如果我必须作为单个应用程序实现,那么更好的方法是什么。请澄清

  • null 例如,将返回JSON格式的用户。 用户应用程序也有一个HTTPendpoint,它应该将请求转发给其他应用程序--让我们将其中一个称为作业应用程序。 此endpoint为。例如, 请注意,初始请求到达用户应用程序,然后它被转发到作业应用程序。 我把我思考的一些方法。也许你过去做过类似的事情,所以你可以分享你这样做的经验。甚至改进我的一种方法。 我将使用映射在用户应用程序中创建 null

  • 路由服务 首先,要理解什么是 router,router是提供跨 subnet 的互联功能的。比如用户的内部网络中主机想要访问外部互联网的地址,就需要router来转发(因此,所有跟外部网络的流量都必须经过router)。目前router的实现是通过iptables进行的。 同样的,router服务也运行在自己的名字空间中,可以通过如下命令查看: $ sudo ip net exec qroute