我正在尝试使用Spring Data Couchbase使用SSL证书连接到Couchbase服务器。我相信证书配置正确,并且可以使用CertAuth登录到存储桶,但是随后我看到了一个奇怪的ConnectTimeoutException。
在我的应用程序中,我正在使用Spring Data Couchbase(v 3.1.4RELEASE)连接到在Mac OS上运行的Couchbase 6.0服务器。要配置CouchbaseEnvironment,我将重写AbstractCouchbaseConfiguration类以提供我自己的CouchbaseEnvironment bean定义:
@Override
@Bean(destroyMethod = "shutdown", name = BeanNames.COUCHBASE_ENV)
public CouchbaseEnvironment couchbaseEnvironment() {
CouchbaseEnvironment environment = DefaultCouchbaseEnvironment
.builder()
.sslEnabled(true)
.sslKeystoreFile("src/main/resources/third.keystore")
.sslKeystorePassword("storepass")
.certAuthEnabled(true)
.build();
return environment;
}
Run Code Online (Sandbox Code Playgroud)
同样,集群bean被定义为:
@Bean(destroyMethod = "disconnect", name = BeanNames.COUCHBASE_CLUSTER)
public Cluster couchbaseCluster() throws Exception {
Cluster cluster = CouchbaseCluster.create(couchbaseEnvironment(), getBootstrapHosts());
cluster.authenticate(CertAuthenticator.INSTANCE);
return cluster;
}
Run Code Online (Sandbox Code Playgroud)
我已按照此处给出的说明进行操作:https : //docs.couchbase.com/server/6.0/manage/manage-security/configure-server-certificates.html在Couchbase服务器上创建所需的密钥/证书。
然后,我按照此处的说明进行操作:https : //docs.couchbase.com/server/6.0/manage/manage-security/configure-client-certificates.html 来配置客户端证书,并创建密钥库。该密钥库就是上面代码中提到的那个。
证书包含一个CN = <>,它对应于在Couchbase服务器上为存储桶创建的用户。
当我启动该应用程序并尝试与Couchbase和存储桶建立连接时,我认为这可行,因为当我将Couchbase服务器上的用户名更改为与客户端证书的CN =不同时, ,但出现异常,指出登录凭据无效。当我改回用户名以匹配证书中的内容时,看不到此类异常。
但是问题是我在日志中看到了ConnectExceptions(下面给出了完整的日志):
2019-02-05 09:36:06.869 WARN [-,,,] 91111 --- [tionScheduler-3] c.c.client.core.endpoint.Endpoint …Run Code Online (Sandbox Code Playgroud) 我一直在尝试让 GRPC 的负载平衡在部署到 Kubernetes 集群的 Java 应用程序中工作,但并没有取得太大成功。似乎没有太多关于此的文档,但从在线示例中我可以看到,我现在应该能够在设置 ManagedChannel 时使用 '.defaultLoadBalancingPolicy("round_robin")' (在更高版本的 GRPC Java lib 中) 。
更具体地说,我使用的是 GRPC Java 库的 1.34.1 版本。我创建了两个 Spring Boot (v2.3.4) 应用程序,一个名为 grpc-sender,另一个名为 grpc-receiver。
grpc-sender 充当 GRPC 客户端,并将 (Netty) ManagedChannel 定义为:
@Bean
public ManagedChannel greetingServiceManagedChannel() {
String host = "grpc-receiver";
int port = 6565;
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext().build();
}
Run Code Online (Sandbox Code Playgroud)
然后grpc-receiver充当GRPC服务器:
Server server = ServerBuilder.forPort(6565)
.addService(new GreetingServiceImpl()).build();
Run Code Online (Sandbox Code Playgroud)
我正在将这些应用程序部署到 Kubernetes 集群(暂时在 minikube 本地运行),并且我为 grpc-receiver 应用程序创建了一个 Service 作为无头服务,这样就可以实现 GRPC 负载均衡。
为了测试失败的请求,我做了两件事: