需要将 HTTP 请求复制到两个服务器

需要将 HTTP 请求复制到两个服务器

我们正在开发一个新服务器来替换旧服务器,并且希望将其并排进行前后测试 - 以便我们可以比较最终结果并发现差异。

两个服务(新旧)的输入都是 HTTP 请求(大部分都是 GET,也可能是 POST),我们需要复制并发送至旧服务器的流量也到新服务器(而不是)。当然,我们需要对请求中的主机名和端口做一些轻微的重写,以避免无限循环。

旧服务器在 Apache(PHP)上运行,新服务器在 Jetty(Java、Dropwizard)上运行

一定有办法做到这一点,我只是找不到 Google 搜索的关键词......

答案1

我们最终选择使用 Gor(现在是 GorReplay)https://github.com/buger/goreplay

该解决方案允许在原始主机上安装一个监听器,它的作用是记录任何传入的 HTTP 请求,而无需修改它或阻止生产服务器处理它。

然后,它将这些请求推送到 Gor 重放服务器,该服务器可以根据传入的请求处理各种有用的拆分/增加负载逻辑 - 您可以将一定比例的请求发送到开发服务器,或者将请求相乘以在您的暂存环境中创建模拟(但来自真实流量)负载,或两者兼而有之......

遗憾的是,这是在服务器级别,因此您必须在每个生产服务器上安装才能获取所有流量,但您不必这样做,它为我的问题中列出的问题提供了一个很好的解决方案。

答案2

虽然这不是您所要求的,但我还是建议使用另一种方法来测试新服务器。

如果您在两台服务器前面放置一个负载平衡器并使用负载平衡算法,您可以同时测试新服务器并逐步替换旧服务器。您可以将 99% 的请求发送到旧服务器,其余 1% 的请求将发送到新服务器,您可以在其中仔细检查服务是否按预期运行。

如果一切正常,您可以逐渐增加负载;90%-10%,80%-20%,等等。

提示:检查 haproxy 和weightstatic-rr选项。

答案3

还有另一个用 NodeJS 编写的工具,它是免费的https://www.npmjs.com/package/duplicator或者在 githubhttps://github.com/agnoster/duplicator

由于这个问题已经过去太久了,即使对最初的请求者来说这不是什么好事,至少希望这可以帮助其他读者。

答案4

这可能有点晚了,但对于那些以后需要它的人来说;

您可以使用mitmproxy这样做。它允许复制和修改(在您的情况下更改主机)捕获的请求。事实上,有一个例子关于 github repo 中的这个。我在客户端使用了它,但据我了解,它可以在服务器端使用,方法是为旧服务器设置反向代理。

相关内容