關於kafka鏈接的一個小問題

最近有一個項目中用到了java api鏈接kafka的代碼,原來測試的時候:bootstrap.servers這個值一直寫的是ip,而後生產和消費數據都沒有問題,但在預發測試的時候配合運維的需求,把ip要改爲域名來訪問,結果就啓動就出問題了,啓動不起來,拋出的異常以下:java

DNS resolution failed for url in .......

咱們的kafka的版本是apache 0.9.0.0,而後我第一時間在網上搜索看是否有相關的例子,結果沒找到特別明確的問題解決辦法,國內的大部分都是說須要改kafka的服務端配置文件,國外的大部分是說三個域名中,有一個域名出錯致使不能鏈接,雖然跟個人case很像,但不是一回事,由於我肯定個人三個域名都是正確的。具體能夠參考這個kafka的issue: https://issues.apache.org/jira/browse/KAFKA-2657apache

爲了排除是環境的問題,我在本身的電腦上用虛擬機搭了一個三節點的kafka的集羣,而後用域名訪問,結果居然能訪問通,那就算說明域名也是沒問題的,而後我對比了我本身機器上的域名和咱們預發佈環境的域名,發現個人預發佈的域名裏面包含了大寫字符還有符號-和.的操做符,而我本身的域名徹底是小寫的英文字母加數字。而後我推測是否是加了特殊字符做爲分隔符的緣由,而後我分別以及聯合測試了.和-組合的域名發現跟這個不要緊,那最後就剩下了一種可能,域名裏面包含大寫字母,果真,在我測試以後發現含有大寫字母的域名在kafka鏈接的時候截取的域名徹底是錯的,因此致使鏈接不上,故而就出現了dns解析失敗的那個問題。最後把域名改爲小寫字母的組合後,就能夠正常訪問。bootstrap

最後查了一下kafka的client的源碼,發現用的是下面的代碼方式提取域名的規則:api

private static final Pattern HOST_PORT_PATTERN = Pattern.compile(".*?\\[?([0-9a-z\\-.:]*)\\]?:([0-9]+)");

    public static String getHost(String address) {
        Matcher matcher = HOST_PORT_PATTERN.matcher(address);
        return matcher.matches() ? matcher.group(1) : null;
    }


    public static void main(String[] args) {

        System.out.println(getHost("DEV-KAFKA-03"));
        //結果是null
    }

到這裏一切都清楚了,在0.9.0.0的版本是不支持大寫的域名訪問,最後我查了0.10.0.0的kafka的源碼,發現這個bug已經修復了,因此大夥在使用的時候能夠注意下這個小問題。運維

相關文章
相關標籤/搜索