我在负载均衡环境中有2个Web服务器,并且两个Web服务器都在其tomcat服务器中部署了2个webapp。两个不同的域名用于访问这两个Web应用程序。
我很震惊,我必须在两个网络服务器中分别为两个网络应用程序重新加载某些东西。所以我必须向每个网络服务器发送http请求并重新加载每个webapp(基本上我想绕过负载均衡器)。
有没有办法添加HTTP标头,以便我可以在运行时将我的请求发送到特定的网络服务器以获取特定的域名?或者还有其他方法可以达到这个目的吗?
注意:此HTTP请求可以从任何一个Web服务器中部署的Java代码发送。所以基本上我们可以将其视为本地网络中的Web服务器之间的通信。
答案 0 :(得分:0)
IMO这个问题很奇怪
如果您有一个负载均衡器,这意味着您在2个后端服务器之间分配负载,即部署相同的应用程序且必须一致,这意味着两个部分必须具有完全相同的数据库(因为相同客户端可以通过一个连接中的一个服务器或下一个请求中的另一个服务器提供服务,具体取决于负载平衡器的配置。)
所以在这种情况下,由于两个部分应该同步,并且数据库本质上是镜像如果您发送具有特定解释的特定请求,那么哪个服务器接收它并不重要。另一台服务器也应该理解这个请求是在镜像数据之后出现的
即只需在数据库中进行特定更新,并在其他服务器中显示数据库更新后立即重新加载服务器。
除非您没有使用负载均衡器,否则您没有正确使用它......
并回答您的问题如何绕过负载均衡器。使用负载均衡器时,可以使用虚拟IP或指向负载均衡器的特定域名,负载均衡器会重定向到可用的服务器。因此,如果直接使用服务器的IP而不是负载均衡器的IP,则可以绕过负载均衡器。
答案 1 :(得分:0)
这是我要尝试的解决方案。它似乎适用于一个小概念验证,我将尝试在实际应用中。
解决方案:
网址应该是网络服务器的IP地址或服务器主机名 例如:http:///
对于HTTP请求,请将“Host”标头设置为您要访问的实际域名。就我而言,它是我在tomcat中部署的第二个webapp(test.myapp2.com)。
发送HTTP请求。
首先它在我尝试使用firefox中的“Poster”插件时起作用,但它在我的Java代码中没有用。它也没有显示任何错误。它只是忽略了我设置的“主机”标题。 java库限制覆盖一些Request头值,“Host”就是其中之一。所以我必须明确地设置它以接受受限制的标题。
我的初始代码是:
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);
}
}