您好,登錄后才能下訂單哦!
本篇內容介紹了“Java如何自定義DNS解析器”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
前言:
最近終于用上了高性能的測試機(54C96G * 3),相較之前的單機性能提升了三倍,數量提升了三倍,更關鍵的寬帶提單機升了30倍不止,總體講提升了100多倍,這下再也不用擔心單機壓力機瓶頸,直接原地起飛。
不過沒高興5分鐘,我發現接口居然請求不通,經過一陣撥亂反正終于找到原因:域名無法解析,IP無法直接訪問。
自然而然,解決方案呼之欲出:自定義Java DNS解析器。
經過同事指點、資料搜索和探索實踐。終于鎖定了兩個核心類:org.apache.http.impl.conn.InMemoryDnsResolver
和org.apache.http.impl.conn.SystemDefaultDnsResolver
,下面我會演示一下這兩個類的使用實踐,其中主要區別還是在負載均衡的實現上,這個有空再分享。
這個類使用比較簡單,先寫一個Demo,實現一個簡單的域名解析。
/** * 重寫Java自定義DNS解析器,非負載均衡 * * @return */ private static DnsResolver getDnsResolver2() { InMemoryDnsResolver dnsResolver = new InMemoryDnsResolver(); try { dnsResolver.add("fun.tester", InetAddress.getByName("127.0.0.1")); } catch (Exception e) { e.printStackTrace(); } return dnsResolver; }
這樣我們就可以把fun.tester解析到127.0.0.1上了,后面我會進行一個簡單的測試。
這個看名字是系統默認DNS解析器,但默認在哪,我也沒看出來,唯一可以查到的引用就是異步線程池管理器使用
org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager#PoolingNHttpClientConnectionManager(org.apache.http.nio.reactor.ConnectingIOReactor, org.apache.http.nio.conn.NHttpConnectionFactory<org.apache.http.nio.conn.ManagedNHttpClientConnection>, org.apache.http.config.Registry<org.apache.http.nio.conn.SchemeIOSessionStrategy>, org.apache.http.conn.SchemePortResolver, org.apache.http.conn.DnsResolver, long, java.util.concurrent.TimeUnit),
接下來我們看這個Demo
/** * 重寫Java自定義DNS解析器,負載均衡 * * @return */ private static DnsResolver getDnsResolver() { return new SystemDefaultDnsResolver() { @Override public InetAddress[] resolve(final String host) throws UnknownHostException { if (host.equalsIgnoreCase("fun.tester")) { return new InetAddress[]{InetAddress.getByName("127.0.0.1")}; } else { return super.resolve(host); } } }; }
通過源碼可以看出,兩個實現類都是通過實現org.apache.http.conn.DnsResolver
這個接口中org.apache.http.conn.DnsResolver#resolve
方法。我們自己可以完全自己實現。
/** * 自定義本地DNS解析器實現 * * @return */ private static DnsResolver getDnsResolver3() { return new DnsResolver() { @Override public InetAddress[] resolve(final String host) throws UnknownHostException { if (host.equalsIgnoreCase("fun.tester")) { return new InetAddress[]{InetAddress.getByName("127.0.0.1")}; } else { return InetAddress.getAllByName(host); } } }; }
仔細看不難發現,其實就是代碼縫合怪。
下面分享一下如何使用自定義的org.apache.http.conn.DnsResolver
,就是在創建連接池管理器的時候設置一下就可以。
首先我在本地起一個HTTP服務,端口12345,非常簡單。代碼如下:
static void main(String[] args) { def util = new ArgsUtil(args) def server = getServerNoLog(util.getIntOrdefault(0, 12345)) server.response("Have Fun ~ Tester !") def run = run(server) waitForKey("fan") run.stop() }
然后我準備一個測試腳本:
public static void main(String[] args) { String url = "http://fun.tester:12345/" def get = getHttpGet(url) def funtester = { fun { getHttpResponse(get) } } 10.times { funtester() } }
控制臺日志輸出:
INFO-> 27.214 F-1 請求uri:http://fun.tester:12345/ , 耗時:304 ms , HTTPcode: 200
INFO-> 27.214 F-4 請求uri:http://fun.tester:12345/ , 耗時:304 ms , HTTPcode: 200
INFO-> 27.214 F-10 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-5 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-2 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-8 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-3 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-7 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-6 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
INFO-> 27.214 F-9 請求uri:http://fun.tester:12345/ , 耗時:305 ms , HTTPcode: 200
“Java如何自定義DNS解析器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。