2

我在负载平衡环境中有 2 个网络服务器,并且两个网络服务器都在它们的 tomcat 服务器中部署了 2 个网络应用程序。使用两个不同的域名来访问这两个 Web 应用程序。

我遇到了一种情况,我必须分别在两个 Web 服务器中为两个 Web 应用程序重新加载一些东西。所以我必须向每个网络服务器和每个网络应用程序发送 http 请求以重新加载(基本上我想绕过负载平衡器)。

有没有办法添加 HTTP 标头,以便我可以在运行时将请求发送到特定的网络服务器以获取特定的域名?或者有没有其他方法可以实现这一目标?

注意:这个 HTTP 请求可以从部署在任何一个网络服务器中的 java 代码发送。所以基本上我们可以假设它是本地网络中网络服务器之间的通信。

4

2 回答 2

0

这是我要尝试的解决方案。它似乎适用于一个小的概念证明,我将在实际应用中尝试。

解决方案:

  1. URL 应该是网络服务器的 IP 地址或服务器主机名。
    例如:http:///

  2. 对于 HTTP 请求,将“Host”标头设置为您要访问的实际域名。就我而言,这是我在我的 tomcat 中部署的第二个 webapp (test.myapp2.com)。

  3. 发送 HTTP 请求。

首先,当我在 Firefox 中尝试使用“海报”插件时它起作用了,但它在我的 Java 代码中不起作用。它也没有显示任何错误。它只是忽略了我设置的“主机”标题。Java 库限制覆盖某些请求标头值,“主机”就是其中之一。所以我必须明确地设置它来接受受限制的标头。

我的初始代码是:

URL url = new URL("http://<IP-ADDRESS>/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Host", "test.myapp2.com");
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));

新修复:

String allowRestrictedHeader = System.getProperty("sun.net.http.allowRestrictedHeaders");
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
try {
    URL url = new URL("http://<IP-ADDRESS>/");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Host", "test.myapp2.com");
    // use connection
    .
    .
    .
}
finally {
    if (allowRestrictedHeader == null) {
        System.clearProperty("sun.net.http.allowRestrictedHeaders");
    } else {
        System.setProperty("sun.net.http.allowRestrictedHeaders",
                allowRestrictedHeader);
    }
}
于 2012-10-29T20:06:19.000 回答
0

IMO这个问题很奇怪。
如果您有一个负载均衡器,这意味着您在 2 个后端服务器之间分配负载,即部署相同的应用程序并且必须保持一致,这意味着两个部分必须具有完全相同的数据库(因为可以从一台服务器为同一个客户端提供服务在一个连接或另一个连接中的下一个请求中,也取决于负载平衡器的配置)。
因此,在这种情况下,由于这两个部分应该是同步的,并且如果您发送具有某种解释的特定请求,则数据库本质上是镜像的,因此哪个服务器接收它并不重要。另一台服务器也应该明白,这个请求是因为数据被镜像而发出的。
即,只需在数据库中进行特定更新,并在数据库更新在其他服务器中可见时让服务器重新加载。
除非你没有使用负载均衡器或者你没有正确使用它......

并回答您的问题如何绕过负载均衡器。当您使用负载均衡器时,您可以使用“指向”负载均衡器的虚拟 IP 或特定域名,并且负载均衡器会重定向到可用服务器。因此,如果您直接使用服务器的 IP 而不是负载均衡器的 IP,则可以绕过负载均衡器。

于 2012-10-26T20:06:58.033 回答