Java REST模板平衡DNS请求

Java REST模板平衡DNS请求,java,spring,spring-boot,resttemplate,Java,Spring,Spring Boot,Resttemplate,考虑到以下准则: ResponseEntity response=restemplate.exchange(“http://balanced.domain.com:9000/api/endpoint,HttpMethod.PUT,requestObject,String.class); 其中,balanced.domain.com指向多个IP平衡DNS,比如说1.1.1和2.2.2 如果我多次(在一个循环中)执行exchange请求,所有请求都会发送到同一IP(比如1.1.1.1),即这两个I

考虑到以下准则:

ResponseEntity response=restemplate.exchange(“http://balanced.domain.com:9000/api/endpoint,HttpMethod.PUT,requestObject,String.class);
其中,
balanced.domain.com
指向多个IP平衡DNS,比如说
1.1.1
2.2.2

如果我多次(在一个循环中)执行exchange请求,所有请求都会发送到同一IP(比如
1.1.1.1
),即这两个IP之间没有平衡负载

所有这些都意识到,在JVM中配置一个参数以启用使用
networkaddress.cache.ttl=0
(与-1不同)刷新
$JAVA\u HOME/jre/lib/security/JAVA.security
上的DNS信息是必要的

我实施的丑陋解决方案如下所示:

InetAddress=InetAddress.getByName(“balanced.domain.com”);
//这会在多个执行上为您提供不同的IP
字符串ip=address.getHostAddress();
HttpHeaders requestHeaders=新的HttpHeaders();
setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
requestHeaders.setAcceptCharset(Collections.singletonList(Charset.forName(“utf-8”));
//路由所需的标头
requestHeaders.set(“Host”,“balanced.domain.com:9000”);
HttpEntity请求=新的HttpEntity(requestObject,requestHeaders);
//用获得的IP替换域
ResponseEntity response=restemplate.exchange(“http://“+ip+”:9000/api/endpoint”,方法,请求,字符串.class);
此外,要设置主机头,还需要以下配置
sun.net.http.allowertrictedheaders=true
,例如在
setenv.sh
中的Tomcat中,将
export CATALINA_OPTS=“$CATALINA_OPTS-Dsun.net.http.allowertrictedheaders=true”


我对这段代码并不感到自豪,因此,如果您有解决此问题的不同方法,请与我们分享。

这看起来相当依赖于用于负载平衡的机制。通常情况下,平衡的端点将解析为单个公共ip地址,然后在内部网络上进行负载平衡。这看起来可能只是一个开发环境的问题?如果是这样的话,请考虑平衡策略是循环(事实上它是)。