Skip to content

DnsServer & DnsClient

youfan edited this page Nov 17, 2022 · 7 revisions

dns

Jdk底层dns解析方法在InetAddress.getAllByName()中,不管是FeignClient url 还是其它任何组件,域名解析都会走这个方法。Rxlib实现注入InetAddress.getAllByName()变更要查询的dnsServer地址,支持非53端口。这样类似FeignClient url可以写死,在dns层面解析对应ip,全局代码无入侵! 代码已贡献给Netty

    @Test
    public void dns() {
        final String domain = "devops.f-li.cn";
        final InetAddress hostResult = InetAddress.getByName("2.2.2.2");
        DnsServer server = new DnsServer(54);
        server.getCustomHosts().put(domain, hostResult.getAddress());

        //注入InetAddress.getAllByName()变更要查询的dnsServer的地址,支持非53端口
        Sockets.injectNameService(Sockets.parseEndpoint("127.0.0.1:54"));
//        System.out.println(HttpClient.godaddyDns("", "f-li.cn", "dd", "3.3.3.3"));

        List<InetAddress> r0 = DnsClient.inlandClient().resolveAll(domain);
        InetAddress[] r1 = InetAddress.getAllByName(domain);
        System.out.println(r0 + "\n" + toJsonArray(r1));
        assert !r0.get(0).equals(r1[0]);

        sleep(2000);
        DnsClient client = new DnsClient(Sockets.parseEndpoint("127.0.0.1:54"));
        InetAddress result = client.resolve(domain);
        assert result.equals(hostResult);
    }