【问题标题】:Springboot elastic search health management : ConnectException: Connection refusedSpring Boot弹性搜索健康管理:ConnectException:连接被拒绝
【发布时间】:2019-06-19 04:07:28
【问题描述】:

在我的 spring 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。

有谁知道我做错了什么?

谢谢。

【问题讨论】:

    标签: java spring-boot elasticsearch


    【解决方案1】:

    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"
    

    【讨论】:

      【解决方案2】:

      问题确实是,正如我提到的,执行器使用RestClient。如果您配置了RestHighLevelClient,则配置不会应用到RestClient

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

          @Bean(destroyMethod = "close")
          public RestClient restClient() {
              return restHighLevelClient().getLowLevelClient();
          }
      
      【解决方案3】:

      我遇到了同样的问题,我发现了问题所在。 对于运行状况检查,java spring boot 使用 RestClient,而我使用 HighLevelRestClient 进行 ES 索引/搜索/删除。

      因此,您似乎也有相同的情况,无论您使用高或低(或 tcp)级别的客户端进行 ES 查询,但运行状况检查需要 RestClient。 因此,解决方案是使用您的 env 参数覆盖 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));
      }
      

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

      参考文献

      【讨论】:

        猜你喜欢
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2016-03-22
        • 1970-01-01
        • 2020-01-19
        • 2019-06-15
        相关资源
        最近更新 更多