【问题标题】:Forward http request to other server that will respond to the original requester using java servlets将 http 请求转发到将使用 java servlet 响应原始请求者的其他服务器
【发布时间】:2014-11-12 22:13:45
【问题描述】:

我有一个问题,我有多个服务器将 HttpRequests(使用轮询来决定发送到哪个服务器)发送到多个处理请求并返回响应的服务器。

我希望中间有一个代理来检查请求并决定将其转发到哪个服务器,但响应可能非常大,所以我希望响应只发送给原始请求者而不是传递通过经纪人回来。有点像代理,但我理解代理的方式是所有数据都通过代理发回。这可能吗?

我正在使用遗留代码,不想改变处理请求和响应的方式,而只是在中间放置一些可以对请求进行更智能路由的东西。

所有这些目前都是使用 HttpServletRequest/Response 和在嵌入式 Jetty Web 服务器上运行的 Servlet 完成的。

谢谢!

【问题讨论】:

  • 这是不可能的(使用 TCP/IP 上的 HTTP),因为从源连接到代理,所以源将侦听响应的唯一位置是那里(即它从未发出连接到目标服务器)。但是你想通过这样做来保存什么?代理几乎不会在 CPU、响应时间等方面增加任何开销。由于您使用的是 Jetty,因此您可以使用异步处理引擎,因此线程也不应该成为问题。
  • @stringy05,感谢您的帮助!目标服务器可能会在 HttpServletResponse 对象的 PrintWriter 上写入大量数据,我不想从目标 -> 代理 -> 源发送数据。所以我要保存的是在网络上发送的兆字节。
  • 不幸的是,去中介不是一个选项,您可以对您的服务器进行任何更改,例如 gzip req/resp 或类似的吗?
  • 好吧,我怀疑这可能是不可能的。 Gzip 是一个好的开始,我想作为替代方案,我可以发回某种 UUID,源可以用来从目标中获取数据。你觉得@stringy05 怎么样?
  • 这是可能的,但变得相当复杂 - 目标需要使响应可用,正确缓存它(过期,清除等)所有这些都是缺陷和不起作用的东西的沃土,所以除非网络真的很昂贵/无法扩展,否则我会避免它..

标签: java http servlets


【解决方案1】:

您所追求的是代理组件在连接到目标服务器时正在使用客户端的 IP 地址。这称为IP spoofing。 您确定要自己实现吗?这种解决方案的网络实现的复杂性是相当令人生畏的。考虑使用内置此选项的软件,例如 HAProxy。请参阅theseblog 帖子。

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多