首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用Java SDK通过反向代理连接到Azure Cosmos DB?

是否可以使用Java SDK通过反向代理连接到Azure Cosmos DB?
EN

Stack Overflow用户
提问于 2021-10-07 14:05:04
回答 1查看 225关注 0票数 3

我正在尝试使用java sdk连接到cosmos。我有一个在AKS中运行的Nginx代理,指向我的cosmos实例(下面是nginx.conf的子集):

代码语言:javascript
复制
  server {
    listen {{ .Values.cosmosDB.port }} so_keepalive=on;
    proxy_connect_timeout 5s;
    proxy_timeout 60m;
    proxy_buffer_size 30M;
    proxy_socket_keepalive on;
    proxy_ssl_session_reuse on;
    proxy_pass my-instance-cosmos-dev.documents.azure.com:443;
  }

我的想法是,通过端口转发,我可以通过这个代理使用我的本地作为cosmos主机url:

代码语言:javascript
复制
kubectl port-forward svc/data-proxy 3308:443

运行java的快速入门(通过Azure门户生成),我无法配置连接的cosmos客户端。我尝试了几种配置:

默认网关模式:

代码语言:javascript
复制
        client = new CosmosClientBuilder()
            .endpoint(AccountSettings.HOST)
            .key(AccountSettings.MASTER_KEY)
            .endpointDiscoveryEnabled(true)
            .gatewayMode()
            .userAgentSuffix("CosmosDBJavaQuickstart")
            .consistencyLevel(ConsistencyLevel.EVENTUAL)
            .buildClient();

但是,这会在启动Database Account localhost does not exist时返回错误

代码语言:javascript
复制
CosmosException{userAgent=azsdk-java-cosmos/4.4.0 MacOSX/10.15.7 JRE/15.0.2, 
error={"code":"Forbidden","message":"Database Account localhost does not exist\r\nActivityId: 742a632d-cd00-42b7-8599-8fc6ff1eccad, Microsoft.Azure.Documents.Common/2.14.0, StatusCode: Forbidden","additionalErrorInfo":null}, resourceAddress='null', requestUri='null', statusCode=403, message=Database Account localhost does not exist

然后,我尝试按如下方式传递代理配置,但却收到SSL验证错误:

代码语言:javascript
复制
    ProxyOptions opts = new ProxyOptions(ProxyOptions.Type.HTTP,  InetSocketAddress.createUnresolved("127.0.0.1", 3308));
    gatewayConnectionConfig.setProxy(opts);


    gatewayConnectionConfig.setMaxConnectionPoolSize(5);
    
    //  Create sync client
    client = new CosmosClientBuilder()
        .endpoint(AccountSettings.HOST)
        .key(AccountSettings.MASTER_KEY)
        .endpointDiscoveryEnabled(true)
        .gatewayMode(gatewayConnectionConfig)
        .userAgentSuffix("CosmosDBJavaQuickstart")
        .consistencyLevel(ConsistencyLevel.EVENTUAL)
        .buildClient();

输出:

代码语言:javascript
复制
INFO: Getting database account endpoint from http://localhost:3308
Oct 07, 2021 10:01:31 AM com.azure.cosmos.implementation.RxGatewayStoreModel 
lambda$toDocumentServiceResponse$2
SEVERE: Network failure
javax.net.ssl.SSLException: failure when writing TLS control frames
    at io.netty.handler.ssl.SslHandler.setHandshakeFailureTransportFailure(SslHandler.java:1863)
    at io.netty.handler.ssl.SslHandler.access$600(SslHandler.java:167)
    at io.netty.handler.ssl.SslHandler$2.operationComplete(SslHandler.java:978)
    at io.netty.handler.ssl.SslHandler$2.operationComplete(SslHandler.java:973)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:551)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490)
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615)
    at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:608)
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117)
    at io.netty.channel.PendingWriteQueue.safeFail(PendingWriteQueue.java:279)
    at io.netty.channel.PendingWriteQueue.removeAndFailAll(PendingWriteQueue.java:177)
    at io.netty.handler.proxy.ProxyHandler.failPendingWrites(ProxyHandler.java:435)
    at io.netty.handler.proxy.ProxyHandler.failPendingWritesAndClose(ProxyHandler.java:352)
    at io.netty.handler.proxy.ProxyHandler.setConnectFailure(ProxyHandler.java:347)
    at io.netty.handler.proxy.ProxyHandler.access$100(ProxyHandler.java:39)
    at io.netty.handler.proxy.ProxyHandler$2.run(ProxyHandler.java:199)
    at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: io.netty.handler.proxy.ProxyConnectException: http, none, /127.0.0.1:3308 => localhost/<unresolved>:3308, timeout
    ... 10 more

我不知道该怎么做。这是一个受支持的连接模式吗?也许我在这里误解了通过SDK的客户端设置…

EN

回答 1

Stack Overflow用户

发布于 2021-11-12 23:27:49

我认为代理方法应该可以工作,但您必须在AccountSettings.HOST中使用的连接字符串中编写原始的Cosmos-DB-URL。

我猜那里仍然引用了"localhost“,因为您第一次尝试直接访问。但是,由于您现在正在通过代理,因此应该有真实的URL。(my-instance-cosmos-dev.documents.azure.com)

此外,您不会收到SSL验证错误,它看起来像是超时。(因为代理尝试连接到本地主机)

如果您确实想使用第一种(直接)方法,那么您可以向您的/etc/hosts添加一个条目,这将使cosmos-db SDK在请求中发送正确的Host-header。

代码语言:javascript
复制
127.0.0.1 my-instance-cosmos-dev.documents.azure.com

然后,您还需要在connection-string中引用真正的URL,然后指向localhost。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69482601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档