import java.net.InetSocketAddress;
import java.net.Proxy;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.cloud.http.HttpTransportOptions;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;

var proxy = new Proxy(Proxy.Type.HTTP,
    new InetSocketAddress("proxy.example", 8080));
var httpOptions = HttpTransportOptions.newBuilder()
    .setHttpTransportFactory(() ->
        new NetHttpTransport.Builder().setProxy(proxy).build())
    .build();

BigQuery bigQuery = BigQueryOptions.newBuilder()
    .setProjectId(projectId)
    .setCredentials(credentials)
    .setTransportOptions(httpOptions)
    .build()
    .getService();

REST 操作都使用这个 bigQuery 实例。projectId 与 credentials 来自应用现有的配置。

工厂创建经由中间层访问 BigQuery API 的 HTTP 传输。API 端点仍是目的地;把它换成代理地址等于请求另一个服务。若要经允许的公共代理访问 BigQuery,HTTP 代理列表可为 InetSocketAddress 字段提供候选。

凭据的获取或刷新可能拥有自己的 HTTP 传输,因此当其请求需要代理时,要配置这个受支持的输入。这些 REST 选项也不会配置独立的 gRPC 通道。

就系统探测而言,java.net.useSystemProxies 的行为因平台而异,并不能保证 Docker 的 HTTP_PROXY 值会成为该客户端的通路。上面的显式工厂让选定的 REST 传输在构造时就可见。

相关文章