2015-02-06 15 views
5

Tôi đã tự hỏi nếu nó có thể cung cấp một cài đặt tùy chỉnh cho tra cứu DNS trên java.net.URL - DNS cung cấp hosting của tôi bị bong tróc vào những thời điểm nhất định trong ngày và sau đó tra cứu DNS thất bại trong một vài phút, nhưng nếu tôi tự cấu hình các lĩnh vực liên quan trong tập tin host của tôi, họ làm việc tốt, vì vậy những gì tôi muốn làm là có một số loại bộ nhớ cache DNS ở mức phần mềm, nếu tra cứu DNS thành công, cập nhật bộ nhớ cache, nếu nó không thành công, rơi trở lại đến địa chỉ IP lưu trữ và mở URLConnection trên địa chỉ IP.Cung cấp thực hiện tùy chỉnh cho tra cứu DNS trong lớp java.net.URL

Đây là thực hiện kết nối URL của tôi:

URL endpoint = new URL(null, url, new URLStreamHandler() { 
     @Override 
     protected URLConnection openConnection(URL url) 
       throws IOException { 
      URL target = new URL(url.toString()); 
      URLConnection connection = target.openConnection(); 
      // Connection settings 
      connection.setConnectTimeout(connectionTimeout); 
      connection.setReadTimeout(readTimeout); 
      return (connection); 
     } 
    }); 

Tôi đã nhìn vào proxy trên Oracle, nhưng không thể nhìn thấy bất cứ cách nào ngay lập tức để làm tra cứu tùy chỉnh DNS ở cấp phần mềm.

Hạn chế:

1: Nó cần phải làm việc trong Java6 (có thể Java7, nhưng khách hàng sẽ không được chuyển sang Java8 sớm)

2: Không thể thêm JVM args

3: Tôi không sở hữu các thiết bị đầu cuối này, vì vậy thay thế tên máy chủ bằng địa chỉ IP không phải là giải pháp vì cân bằng tải sẽ phân phối các nội dung/API khác nhau tùy thuộc vào việc bạn đến từ tên máy chủ hay địa chỉ IP. Như một ví dụ: mail.google.com quyết tâm 216.58.223.37, đi đến địa chỉ IP sẽ phục vụ google.com nội dung và nội dung không mail.google.com, vì cả hai dịch vụ đang ngồi đằng sau những cân bằng tải cùng sử dụng một địa chỉ IP duy nhất .

4: Tôi không biết có bao nhiêu độ phân giải DNS của URL mà tôi cần để lưu vào bộ nhớ cache, nhưng tôi biết nó sẽ không nhiều hơn 1000. Giải pháp lý tưởng sẽ là để có độ phân giải DNS trong tĩnh hashmap, nếu có độ phân giải DNS thành công, cập nhật hashmap, nếu nó không thành công, sử dụng độ phân giải DNS trong hashmap.

5: Nếu có một giải pháp java mẹ đẻ, tôi muốn rằng qua sử dụng JNI - Understanding host name resolution and DNS behavior in Java

+0

Muốn có giải pháp thanh lịch hơn, bạn có thể thay thế phần máy chủ của URL bằng địa chỉ IP mà triển khai DNS tùy chỉnh của bạn sẽ trả về không? Sử dụng thao tác String cũ đồng bằng, ý tôi là. –

+0

Tôi có khoảng 500 URL mà tôi sẽ cần phải duy trì, tôi đã hy vọng cho một giải pháp mà tôi chỉ có thể có một hashmap tĩnh và làm trong tra cứu bộ nhớ cho DNS 90 giây là flaky có thể một lần một ngày. –

+0

@JanVladimirMostert bạn đã giải quyết vấn đề? mã của tôi không thể truy cập AWS đang chạy trên hackerrank. bất kỳ id làm thế nào để có được ip hoặc thay đổi dns? – Error

Trả lời

0

Bạn chỉ có thể xây dựng một URL:

URL target = new URL(
    url.getProtocol(), 
    customDns.resolve(url.getHost()), 
    url.getFile()); 

Bạn có thể thực hiện customDns.resolve(String) sử dụng bất cứ chiến lược bạn cần .

+0

Thay thế máy chủ bằng địa chỉ IP sẽ là giải pháp nếu kiểm soát thiết bị đầu cuối. không phải. Hãy lấy mail.google.com làm ví dụ tùy ý, nó giải quyết thành 216.58.223.37, nhưng truy cập vào google.com thay vì mail.google.com –

0

Bạn có thể tạo phương thức tùy chỉnh để kiểm tra xem máy chủ có chuyển sang IP hay không. Trước khi mở kết nối nếu máy chủ không giải quyết được thì làm tra cứu của bạn và sử dụng IP trực tiếp để xây dựng URL thay vì:

Ở cấp lớp:

private Map<String,InetAddress> cacheMap = new HashMap<String,InetAddress>(); 

.... sau đó một vài phương pháp để tạo URL của bạn:

private URL buildUrl (String host) throws MalformedURLException { 
    InetAddress ia = resolveHostToIp(host); 
    URL url = null; 

    if (ia != null) { 
     url = new URL(ia.getHostAddress()); 
    } else { 
     // Does not resolve and is not in cache....dunno 
    } 
    return url; 
} 


private InetAddress resolveHostToIp(String host) { 
    InetAddress ia = null; 
    try { 
     ia = InetAddress.getByName(host); 
     // Update your cache 
     cacheMap.put(host, ia); 
    } catch (UnknownHostException uhe) { 
     System.out.println("\"" + host + "\" does not resolve to an IP! Looking for it in the cacheMap...."); 
     // Head off to your cache and return the InetAddress from there..... 
     ia = cacheMap.get(host); 
    } 
    return ia; 
} 
+0

Một số điểm cuối mà tôi kết nối đang ngồi trên AWS và GCE, nếu bạn giải quyết một địa chỉ IP cho www.example.com, bạn nhận được một địa chỉ IP, nhưng POSTing đến một địa chỉ IP và POSTING đến một tên HOST sẽ cho kết quả hoàn toàn khác nếu có nhiều dịch vụ đang chạy trên địa chỉ IP đó. –

+0

OK. Đã không nhận thức được điều đó từ câu hỏi của bạn. Vì vậy, làm thế nào sẽ "nếu nó không thành công, rơi trở lại địa chỉ IP được lưu trữ và mở URLConnection trên địa chỉ IP" làm việc sau đó nếu có nhiều dịch vụ đang chạy trên IP? –

+0

Thay thế máy chủ bằng địa chỉ IP sẽ là giải pháp nếu kiểm soát các điểm cuối, rất tiếc là tôi không. Hãy lấy mail.google.com làm ví dụ tùy ý, nó giải quyết thành 216.58.223.37, nhưng truy cập vào google.com thay vì mail.google.com –

Các vấn đề liên quan