2017-01-16 3 views
3

ich von einem Client an einen Server anschließe Hostnamen wie folgt: -Java: Get IP-Adresse eines Server hinter DNS Load Balancer

HttpPost post = new HttpPost(serverUrl); 
    post.setEntity(new StringEntity(jsonRequestString, ContentType.APPLICATION_JSON)); 
    HttpResponse response = httpClient.execute(post); 
    int ret = response.getStatusLine().getStatusCode(); 

ich org.apache.http.* Pakete verwenden. Jetzt befindet sich der Server hinter dem DNS-Lastenausgleich mit 8 eindeutigen IP-Adressen, die an den Hostnamen gebunden sind. Aber ich glaube, dass alle Anfragen in einem einzigen Lauf der JVM auf die gleiche IP-Adresse gehen.

  1. Gibt es eine Möglichkeit zum Drucken der tatsächlichen IP zurückgegeben nach DNS-Auflösung?
  2. Führt JVM lokales DNS-Caching durch?

Edit:

Einstellung networkaddress.cache.ttl und networkaddress.cache.negative.ttl als 0 funktioniert nicht. Entweder setze ich sie nicht richtig.

public static void main(String[] args) throws Exception { 
    java.security.Security.setProperty("networkaddress.cache.ttl", "0"); // no 
    // cache 
    java.security.Security.setProperty("networkaddress.cache.negative.ttl", "0"); // no 
    while (true) { 
     System.out.println(InetAddress.getByName("google.com")); 
     Thread.sleep(100); 
    } 

}

Ausgang:

google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
google.com/216.58.197.78 
........ 
........ 
+0

Ihr Betriebssystem könnte auch Cache, der sich aus der JVMs Kontrolle. –

+0

Bereits überprüft, mit Ping jede Sekunde. Es pingt jedes Mal verschiedene ips –

+0

@MangatRaiModi: ICMP Ping nicht Host-Name zu IP für jeden Rundgang auflösen. Also ich denke, dass anstelle von RR DNS Loadbalancer, Sie etwas anderes haben (zB Netzwerk Loadbalancer mit LLCP oder Bonding ...) – rkosegi

Antwort

2

Gibt es eine Möglichkeit die tatsächliche IP zurückgegeben, nachdem die DNS-Auflösung zu drucken?

Sie können versuchen, Logger zu konfigurieren und überprüfen Log-Meldungen von "org.apache.http.impl.conn.HttpClientConnectionOperator"

Reference

Does JVM tut lokalen DNS-Caching?

Es hängt von der Konfiguration, aber höchstwahrscheinlich ja, überprüfen Sie folgende Einstellungen:

networkaddress.cache.ttl in java.security Spezifizierte die Caching-Richtlinie für eine erfolgreiche Namenssuche aus dem Namen-Service, um anzuzeigen, .. Der Wert wird als Ganzzahl angegeben, um die Anzahl der Sekunden anzugeben, in denen die erfolgreiche Suche zwischengespeichert werden soll.

Ein Wert von -1 bedeutet "Cache für immer". Das Standardverhalten besteht darin, bei der Installation eines Sicherheitsmanagers für immer zu cachen und für einen implementierungsspezifischen Zeitraum zu cachen, wenn kein Sicherheitsmanager installiert ist.

networkaddress.cache.negative.ttl (Standard: 10) in java.security Spezifizierte die Caching-Richtlinie für nicht-erfolgreichen Lookups von Namen aus dem Namen-Service, um anzuzeigen .. Der Wert wird als ganze Zahl angegeben, um anzuzeigen, die Anzahl der Sekunden, um den Fehler für nicht erfolgreiche Suchvorgänge zwischenzuspeichern.

Ein Wert von 0 bedeutet "niemals zwischenspeichern". Ein Wert von -1 bedeutet "Cache für immer".

Reference

UPDATE

Haben Sie versucht, API aufrufen direkt Hostnamen an alle IP-Adressen aufzulösen?

InetAddress.getAllByName(host) 

Von javadocs:

der Namen eines Host gegeben, gibt einen Array von seinen IP-Adressen, basierend auf dem konfigurierten Namensdienst auf dem System.

Auch interesting article on this topic (nicht von mir selbst ausprobiert)

+0

Ehrfürchtig, ich werde dies jetzt versuchen. –

+0

Tut mir leid, funktioniert nicht. Schrieb ein grundlegendes Programm zum Drucken der IP-Adresse von einem Domain-Namen. Siehe die Bearbeitung –

+0

@MangatRaiModi: siehe Update – rkosegi

Verwandte Themen