我正在使用 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/