java - Google Cloud Java 客户端 : forcing HTTP when setting a custom endpoint

标签 java google-cloud-platform

我正在使用 Google 的 LanguageServiceClient来自com.google.cloud:google-cloud-vision:1.16.0 ,和ImageAnnotatorClient来自com.google.cloud:google-cloud-language:1.16.0 .

它们用于在私有(private) VPN 内运行的项目。公司的基础设施规定访问外部服务必须通过转发代理来完成。此外,VPN 中的所有转发代理都必须使用 HTTP,而不是 HTTPS。

所以我有一个转发代理 xx.xx.xx.xx,以及像 http://xx.xx.xx.xx/somePath 这样的所有请求转发至https://language.googleapis.com/somePath 。我用一些curl请求对此进行了测试,它们工作正常。

我已更改端点如下:

LanguageServiceSettings serviceSettings = LanguageServiceSettings.newBuilder()
                .setEndpoint("xx.xx.xx.xx:80")
                //the default value of this is "language.googleapis.com:443"
                .build();
languageServiceClient = LanguageServiceClient.create(serviceSettings);

但是,客户端似乎是通过 HTTPS 访问新端点。我不知道如何设置该方案。任何帮助将不胜感激。

最佳答案

事实证明,即使在 HTTPS 上获取转发代理也不起作用,因为库会在发现 SSL 证书域 (language.googleapis.com) 与请求 URL(转发代理 IP)不匹配时拒绝请求。

相反,我坚持使用 HTTP 代理并使其按如下方式工作:

HttpHost proxy = new HttpHost("xx.xx.xx.xx", 80);

HttpTransportFactory transportFactory = () -> new ApacheHttpTransport.Builder()
                .setProxy(proxy)
                .build();

CredentialsProvider credentialsProvider = () -> GoogleCredentials.getApplicationDefault(transportFactory);

LanguageServiceSettings serviceSettings = LanguageServiceSettings.newBuilder()
                .setCredentialsProvider(credentialsProvider)
                .build();

LanguageServiceClient languageServiceClient = LanguageServiceClient.create(serviceSettings);

这会处理身份验证步骤,但是,实际请求仍在向 language.googleapis.com 发出。

这不能被类似地覆盖,因为请求是使用 GRPC 而不是 Google Http 发出的。据我所知,GRPC 没有任何在代码中设置代理的规定。解决此问题的一种方法是设置此环境变量:

export GRPC_PROXY_EXP=xx.xx.xx.xx:80

注意事项:

  • GRPC_PROXY_EXP 变量将影响应用程序中使用 GRPC 的所有请求。
  • 您的代理必须支持CONNECT请求以使 GRPC_PROXY_EXP 变量发挥作用
  • 在撰写本答案时,google-cloud-vision/language 的版本为 1.20.0,并使用 GRPC 版本 1.9.0。此版本的 GRPC 有一个错误,导致 GRPC_PROXY_EXP 无法正常工作。 1.10.0版本也有同样的bug。唯一有效的版本是 1.9.1。 您必须检查 google 云库的所有依赖项,并且对于您找到的每个 io.grpc:*:1.9.0 包,将该包的 1.9.1 版本的依赖项添加到您的项目中。

关于java - Google Cloud Java 客户端 : forcing HTTP when setting a custom endpoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49167306/

相关文章:

java - JMH 超时不中断

google-cloud-platform - Google DataProc 的 Jupyter 中的 Python 版本错误

security - 我应该如何存储由其他应用程序使用 Google Cloud KMS 生成的访问 token ?

java - Google Cloud Spring Boot InvoiceTargetException

java - Intellij-idea看不到生成的源目录

java - 使用 JSON 将包含“的 JSONObject 转换为普通字符串

apache-spark - 在数据帧上使用partitionBy时出现dataproc警告

google-cloud-platform - 调整默认10GB启动驱动器Google Cloud Platform的大小

java - 防止 JSF 对话框 AJAX CRUD 上的重复提交

c# - JavaScript 中的 SHA256Cng