bce-sdk-java icon indicating copy to clipboard operation
bce-sdk-java copied to clipboard

支持自定义DnsResolver

Open ihejunqiu opened this issue 3 months ago • 0 comments

我有一个场景,需要 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;
    }

ihejunqiu avatar Oct 27 '25 01:10 ihejunqiu