Skip to content

支持自定义DnsResolver #42

@ihejunqiu

Description

@ihejunqiu

我有一个场景,需要 bce-java-sdk的BceHttpClient支持自定义DNS解析。

我翻阅了源代码,一个解决方案是在BceClientConfiguration.java中,引入Apache HttpClient的org.apache.http.conn.DnsResolver
并在BceHttpClient.java的私有方法createHttpClient引入Configuration,配置自定义dns。

BceClientConfiguration.java

public class BceClientConfiguration {
    private DnsResolver dnsResolver;

    public void setDnsResolver(DnsResolver dnsResolver) {
        this.dnsResolver = dnsResolver;
    }

    public DnsResolver getDnsResolver() {
        return this.dnsResolver;
    }

    public BceClientConfiguration withDnsResolver(DnsResolver dnsResolver){
        this.setDnsResolver(dnsResolver);
        return this;
    }
}

BceHttpClient.java

private CloseableHttpClient createHttpClient(HttpClientConnectionManager connectionManager, BceClientConfiguration config) {
        HttpClientBuilder builder =
                HttpClients.custom().setConnectionManager(connectionManager).disableAutomaticRetries()
                    .setDnsResolver(config.getDnsResolver());  // set dns resolver

        int socketBufferSizeInBytes = this.config.getSocketBufferSizeInBytes();
        if (socketBufferSizeInBytes > 0) {
            builder.setDefaultConnectionConfig(
                    ConnectionConfig.custom().setBufferSize(socketBufferSizeInBytes).build());
        }

        return builder.build();
    }

private HttpClientConnectionManager createHttpClientConnectionManager(BceClientConfiguration config) {
        ConnectionSocketFactory socketFactory = PlainConnectionSocketFactory.getSocketFactory();
        LayeredConnectionSocketFactory sslSocketFactory;
        try {
            sslSocketFactory = new SSLConnectionSocketFactory(SSLContext.getDefault(),
                    SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
        } catch (NoSuchAlgorithmException e) {
            throw new BceClientException("Fail to create SSLConnectionSocketFactory", e);
        }
        Registry<ConnectionSocketFactory> registry =
                RegistryBuilder.<ConnectionSocketFactory>create().register(Protocol.HTTP.toString(), socketFactory)
                        .register(Protocol.HTTPS.toString(), sslSocketFactory).build();
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry, config);
        connectionManager.setDefaultMaxPerRoute(this.config.getMaxConnections());
        connectionManager
                .setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(this.config.getSocketTimeoutInMillis())
                        .setTcpNoDelay(true).build());
        connectionManager.setMaxTotal(this.config.getMaxConnections());
        return connectionManager;
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions