使用 java api 客户端的 elasticsearch 身份验证
elasticsearch authentication with java api client
我在使用 elasticsearch (2.3) with shield 时遇到身份验证问题。 elasticsearch 实例托管在云上的某个地方,我没有太多的调整权限。
我正在使用 Sense chrome-插件来发出测试请求,就在发送第一个请求之前,它要求 username/pwd(我假设它是某种用于 REST api界面)。使用 Sense 插件可以顺利进行所有查询。
现在,我必须使用 Java API 在客户端应用程序中针对此实例进行查询。我创建了 TransportClient,就像下面的代码片段一样:
String hostBasedClusterName = StatsConstants.ES_HOST.split("\.", 2)[0];
String clusterName = System.getProperty("cluster", hostBasedClusterName);
Settings settings = Settings.settingsBuilder()
.put("cluster.name", clusterName)
.put("shield.transport.ssl", "true")
.put("shield.user", String.format("%s:%s", StatsConstants.ES_USERNAME, StatsConstants.ES_PASSWORD))
.build();
client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings)
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(StatsConstants.ES_HOST), StatsConstants.ES_PORT));
根据其他示例和文档,似乎没问题。但是,当我尝试创建客户端时,出现 StreamCorruptedException 异常:
2016-05-13 13:53:47,396 WARN netty:788 - NettyTransport.java - [Burstarr] exception caught on transport layer [[id: 0x4ac12d10, ...]], closing connection
java.io.StreamCorruptedException: invalid internal transport message format, got (48,54,54,50)
at org.elasticsearch.transport.netty.SizeHeaderFrameDecoder.decode(SizeHeaderFrameDecoder.java:68)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:425)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
客户端版本为2.3.2,使用文档中描述的屏蔽客户端库,编译正常,无警告,只是在尝试创建该对象时抛出异常。
这对你们中的一些人来说似乎微不足道 - 但对我来说,这是我第一次进入 Java/elasticsearch 世界......
更新 - 在我做了更多 digging/reading 之后,当有人抱怨所使用的代理时,我发现了类似的 error/exception。我不使用任何代理,它直接连接到服务器;
问题已解决。在这里添加响应以减轻其他可怜人的负担......
来自 solr 背景,我试图连接到与 web 服务相同的端口 (http/https)。好吧,那是完全错误的。我应该连接到端口 9343。
我在使用 elasticsearch (2.3) with shield 时遇到身份验证问题。 elasticsearch 实例托管在云上的某个地方,我没有太多的调整权限。
我正在使用 Sense chrome-插件来发出测试请求,就在发送第一个请求之前,它要求 username/pwd(我假设它是某种用于 REST api界面)。使用 Sense 插件可以顺利进行所有查询。
现在,我必须使用 Java API 在客户端应用程序中针对此实例进行查询。我创建了 TransportClient,就像下面的代码片段一样:
String hostBasedClusterName = StatsConstants.ES_HOST.split("\.", 2)[0];
String clusterName = System.getProperty("cluster", hostBasedClusterName);
Settings settings = Settings.settingsBuilder()
.put("cluster.name", clusterName)
.put("shield.transport.ssl", "true")
.put("shield.user", String.format("%s:%s", StatsConstants.ES_USERNAME, StatsConstants.ES_PASSWORD))
.build();
client = TransportClient.builder()
.addPlugin(ShieldPlugin.class)
.settings(settings)
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(StatsConstants.ES_HOST), StatsConstants.ES_PORT));
根据其他示例和文档,似乎没问题。但是,当我尝试创建客户端时,出现 StreamCorruptedException 异常:
2016-05-13 13:53:47,396 WARN netty:788 - NettyTransport.java - [Burstarr] exception caught on transport layer [[id: 0x4ac12d10, ...]], closing connection
java.io.StreamCorruptedException: invalid internal transport message format, got (48,54,54,50)
at org.elasticsearch.transport.netty.SizeHeaderFrameDecoder.decode(SizeHeaderFrameDecoder.java:68)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:425)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:303)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
客户端版本为2.3.2,使用文档中描述的屏蔽客户端库,编译正常,无警告,只是在尝试创建该对象时抛出异常。
这对你们中的一些人来说似乎微不足道 - 但对我来说,这是我第一次进入 Java/elasticsearch 世界......
更新 - 在我做了更多 digging/reading 之后,当有人抱怨所使用的代理时,我发现了类似的 error/exception。我不使用任何代理,它直接连接到服务器;
问题已解决。在这里添加响应以减轻其他可怜人的负担......
来自 solr 背景,我试图连接到与 web 服务相同的端口 (http/https)。好吧,那是完全错误的。我应该连接到端口 9343。