Configurar proxies no SDK do Azure para Java

Este artigo apresenta uma visão geral de como configurar o SDK do Azure para Java para usar proxies de modo adequado.

Configuração de proxy HTTP

As bibliotecas de clientes do Azure para Java oferecem várias maneiras de configurar um proxy para um HttpClient.

Cada método de fornecer um proxy tem os próprios prós e contras e oferece níveis diferentes de encapsulamento. Quando você tiver configurado um proxy para um HttpClient, ele usará o proxy pelo restante do seu tempo de vida. Ter o proxy vinculado a um HttpClient individual permite que um aplicativo use várias instâncias de HttpClient, em que cada uma pode usar um proxy diferente para atender aos requisitos de proxy de um aplicativo.

As opções de configuração de proxy são:

Usar um proxy de ambiente

Por padrão, os construtores de cliente HTTP inspecionarão o ambiente para as configurações de proxy. Esse processo usa as APIs Configuration do SDK do Azure para Java. Quando o construtor cria um cliente, ele é configurado com uma cópia da "configuração global" recuperada chamando Configuration.getGlobalConfiguration(). Essa chamada será lida em qualquer configuração de proxy HTTP do ambiente do sistema.

Quando o construtor inspecionar o ambiente, ele pesquisará as seguintes configurações de ambiente na ordem especificada:

  1. HTTPS_PROXY
  2. HTTP_PROXY
  3. https.proxy*
  4. http.proxy*

O * representa as propriedades de proxy Java bem conhecidas. Para obter mais informações, confira Rede e proxies Java na documentação do Oracle.

Se o construtor encontrar alguma das configurações de ambiente, ele criará uma instância de ProxyOptions chamando ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration()). Este artigo apresenta a seguir mais detalhes sobre o tipo de ProxyOptions.

Importante

Para usar qualquer configuração de proxy, o Java exige que você defina a propriedade de ambiente do sistema java.net.useSystemProxies como true.

Você também pode criar uma instância de cliente HTTP que não use nenhuma configuração de proxy presente nas variáveis de ambiente do sistema. Para substituir o comportamento padrão, você define explicitamente uma Configuration configurada de modo diferente no construtor de cliente HTTP. Quando você definir uma Configuration no construtor, ele não chamará mais Configuration.getGlobalConfiguration(). Por exemplo, se você chamar configuration(Configuration) usando Configuration.NONE, poderá impedir explicitamente que o construtor inspecione o ambiente para configuração.

O exemplo a seguir usa a variável de ambiente HTTP_PROXY com valor localhost:8888 para usar o Fiddler como o proxy. Esse código demonstra como criar uma sub-rede e um cliente HTTP OkHttp. (Para obter mais informações sobre a configuração do cliente HTTP, confira pipelines e clientes HTTP.)

export HTTP_PROXY=localhost:8888
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder().build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder().build();

Para impedir o uso do proxy de ambiente, configure o construtor de cliente HTTP com Configuration.NONE, conforme mostra o seguinte exemplo:

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .configuration(Configuration.NONE)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .configuration(Configuration.NONE)
    .build();

Usar um proxy de configuração

Em vez de ler do ambiente, você pode configurar os criadores de cliente HTTP para usar uma Configuration personalizada com as mesmas configurações de proxy que já foram aceitas do ambiente. Essa configuração permite ter configurações reutilizáveis com escopo para um caso de uso limitado. Quando o construtor de cliente HTTP estiver compilando o HttpClient, ele usará as ProxyOptions retornadas de ProxyOptions.fromConfiguration(<Configuration passed into the builder>).

O exemplo a seguir usa as configurações de http.proxy* definidas em um objeto Configuration para usar um proxy que autentica o Fiddler como o proxy.

Configuration configuration = new Configuration()
    .put("java.net.useSystemProxies", "true")
    .put("http.proxyHost", "localhost")
    .put("http.proxyPort", "8888")
    .put("http.proxyUser", "1")
    .put("http.proxyPassword", "1");

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .configuration(configuration)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .configuration(configuration)
    .build();

Usar um proxy explícito

As bibliotecas de clientes Java são fornecidas com uma classe ProxyOptions que atua como o tipo de bibliotecas de clientes do Azure para configurar um proxy. Você pode configurar ProxyOptions com o protocolo de rede usado para enviar solicitações de proxy, o endereço de proxy, as credenciais de autenticação de proxy e os hosts que não são de proxy. Somente o protocolo de rede proxy e o endereço proxy são necessários. Ao usar credenciais de autenticação, você deve definir o nome de usuário e a senha.

O seguinte exemplo cria uma instância simples de ProxyOptions que os proxies solicitam para o endereço Fiddler padrão (localhost:8888):

ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));

O seguinte exemplo cria ProxyOptions autenticadas que os proxies solicitam a uma instância do Fiddler que requer autenticação de proxy:

// Fiddler uses username "1" and password "1" with basic authentication as its proxy authentication requirement.
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888))
    .setCredentials("1", "1");

Você pode configurar os integradores de cliente HTTP com ProxyOptions diretamente para indicar um proxy explícito a ser usado. Essa configuração é a maneira mais granular de fornecer um proxy e geralmente não é tão flexível quanto passar uma Configuration que você pode transformar para atualizar os requisitos de proxy.

O seguinte exemplo usa ProxyOptions para usar o Fiddler como o proxy:

ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .proxy(proxyOptions)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .proxy(proxyOptions)
    .build();

Próximas etapas

Agora que você está familiarizado com a configuração de proxy no SDK do Azure para Java, confira Configurar o rastreamento no SDK do Azure para Java para entender melhor os fluxos em seu aplicativo e para ajudar a diagnosticar problemas.