Springboot弹性搜索运行状况管理:ConnectException:连接被拒绝

时间:2019-01-25 10:23:46

标签: java spring-boot elasticsearch

在我的春季Yaml文件中:

spring:
  application:
    name: myApp
  elasticsearch:
    jest:
      uris: ["http://myelasticserver:9200"]
      multi-threaded: true
      read-timeout: 10000

management:
  health:
    elasticsearch:
      indices: ["one","two"]
      response-timeout: 1000
      enabled: true

事实是,Jest客户端可以被注入和使用而没有任何问题。但是以某种方式,运行状况检查始终会因以下错误而失败:

  

Elasticsearch运行状况检查失败java.net.ConnectException:   连接被拒绝

似乎未使用URL“ http://myelasticserver:9200”,而运行状况检查则使用localhost:9200。

有人知道我在做什么错吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

确实,如前所述,问题确实在于执行器使用了RestClient。如果已配置RestHighLevelClient,则该配置不会应用于RestClient

如果您已有RestHighLevelClient可用,则可以按如下所示轻松地使已配置的RestClient可用:

    @Bean(destroyMethod = "close")
    public RestClient restClient() {
        return restHighLevelClient().getLowLevelClient();
    }

答案 1 :(得分:0)

我遇到了同样的问题,并且找出了问题所在。 为了进行健康检查,java春季启动使用RestClient,其中我使用HighLevelRestClient进行ES索引/搜索/删除。

因此,对于ES查询使用高级别还是低级别(或tcp)客户端,似乎您也遇到相同的情况,但是运行状况检查需要RestClient。 因此,解决方案是使用环境参数覆盖RestClient bean。将以下内容添加到您的配置文件中(用您的替换环境值):

@Bean(destroyMethod = "close")
public RestClient restClient() {
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY,
            new UsernamePasswordCredentials(
                    environment.getProperty("elasticsearch.username"),
                    environment.getProperty("elasticsearch.password")));

    List<HttpHost> hosts = new ArrayList<>();
    hosts.add(new HttpHost(
            environment.getProperty("elasticsearch.hosts.host.name", String.class),
            environment.getProperty("elasticsearch.hosts.host.port", Integer.class),
            "http"));

    LOGGER.info("Elasticsearch connection establishing..." + hosts.toArray().toString());

    return RestClient.builder(Iterables.toArray(hosts, HttpHost.class))
            .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
}

如果这不起作用,请允许我查看(请发帖)您的配置。 祝你好运!

参考

答案 2 :(得分:0)

Spring boot elasticsearch需要知道连接到哪个端口(和主机)以进行健康检查。添加:

spring:
  elasticsearch:
    rest:
      uris: "myelasticserver:9200"
      #username: ""
      #password: ""

这是您已经拥有的配置的补充。这是分开的,因为像我一样,许多人都使用elasticsearch的(非http)端口9300进行实际搜索,而不是使用配置的一部分。我没有management.health.elasticsearch。我对elasticsearch的总体配置是:

spring:
  elasticsearch:
    rest:
      uris: "myelasticserver:9200"
  data:
    elasticsearch:
      cluster-nodes: "myelasticserver:9300"
      cluster-name: "my-cluster-name"