Undertow - 如何设置反向代理来监控我的 REST API 的 HTTP/HTTPS 流量
Posted
技术标签:
【中文标题】Undertow - 如何设置反向代理来监控我的 REST API 的 HTTP/HTTPS 流量【英文标题】:Undertow - How to Setup a Reverse Proxy to Monitor HTTP/HTTPS Traffic to my REST API 【发布时间】:2018-06-03 22:12:51 【问题描述】:我想基本上从我的计算机嗅探 HTTP/HTTPS 请求和响应到远程 URL(基本上是 REST API)。我知道有很多工具可以帮助我获得我想要的东西,但我必须编写一个实用程序来在 Java 中执行此操作(因为我们正在开发的一些应用程序将使用它)。
我想要做的是设置一个代理(或反向代理 - 我对术语的理解仅限于此),通过它我将所有请求路由到真正的 API。此代理必须捕获请求正文(在 POST 或 PUT 的情况下)并将请求转发到真正的 API,捕获其响应并将其发送回客户端。
我遇到了 Undertow,我可以使用它的 LoadBalancingProxyClient
代理客户端创建和运行反向代理。但我有几个问题。
假设我的 API 是 http://myrealapplication.com/rest/operation1
,我想向这个 API 发布一个 JSON。
我已经创建了一个代理服务器如下:
LoadBalancingProxyClient loadBalancer = new LoadBalancingProxyClient();
loadBalancer.addHost(new URI("http://myrealapplication.com"));
loadBalancer.setConnectionsPerThread(20);
Undertow reverseProxy = Undertow.builder()
.addHttpListener(8990, "localhost")
.setIoThreads(4)
.setHandler(Handlers.requestDump(new ProxyHandler(loadBalancer, 3000, null)))
.build();
reverseProxy.start();
所以一旦我启动了我的反向代理服务器,有两件事:
-
我的反向代理实际上已成为我真实 API 的别名,但我如何在这一层捕获请求和响应?
通过上述设置,为了让我的请求通过此代理,我必须将我的 URL 更改为
http://localhost:8990/rest/operation1
,这可能是不可接受的,因为我们期望做的是设置 localhost:8990
作为代理,并将我的 URL 保留为 http://myrealapplication.com/rest/operation1
,这样它就可以看到最终客户端,因为响应来自实际的 API。
我可以使用 undertow 来实现这一点吗?或者是否有任何其他工具可以公开我可以在我的程序中使用的 Java API?
请帮忙!
谢谢, 斯里拉姆
【问题讨论】:
【参考方案1】:我认为您实际上正在寻找的是Forward Proxy。 这是示例代码,可帮助您创建一个。
public class ForwardProxyWithUndertow
public static void main( String[] args )
final HttpHandler forwardProxyHandler = new ConnectHandler(ForwardProxyWithUndertow::handleNotFound );
Undertow.builder()
.addHttpListener(8080, "localhost")
.setHandler( forwardProxyHandler )
.build()
.start();
static void handleNotFound( HttpServerExchange e )
e.setStatusCode(404);
e.endExchange();
希望对您有所帮助! ;)
【讨论】:
谢谢,但是如何捕获请求和响应?以上是关于Undertow - 如何设置反向代理来监控我的 REST API 的 HTTP/HTTPS 流量的主要内容,如果未能解决你的问题,请参考以下文章
实现一个行为类似于 nginx 的 Undertow 反向代理