9
votes

Gestion de l'intégrité de la recherche élastique Springboot: ConnectException: connexion refusée

Dans mon fichier yaml de printemps:

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

Le fait est que le client Jest peut être injecté et utilisé sans aucun problème. Mais d'une manière ou d'une autre, la vérification de l'état échoue toujours avec cette erreur:

La vérification de l'état d'Elasticsearch a échoué java.net.ConnectException: Connexion refusée

Il semble que l'URL " http: // myelasticserver: 9200 " n'ait pas été utilisée, et la vérification de l'état utilise à la place localhost: 9200.

Quelqu'un sait-il ce que j'ai fait de mal?

Merci.


0 commentaires

3 Réponses :


0
votes

J'ai eu le même problème et j'ai compris quel était le problème. Pour la vérification de l'état de santé, java spring boot utilise RestClient où j'utilisais HighLevelRestClient pour l'indexation / la recherche / la suppression d'ES. requête mais la vérification de l'état nécessite RestClient. Donc, la solution est de remplacer le bean RestClient par vos paramètres d'env. Ajoutez ce qui suit à votre fichier de configuration (remplacez les valeurs d'environnement par les vôtres):

@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));
}

Permettez-moi de voir (plz poster) votre configuration si cela ne fonctionne pas. Bonne chance!

Références


0 commentaires

7
votes

Le problème est en effet, comme mst l'a mentionné, que l'actionneur utilise le RestClient . Si vous avez configuré le RestHighLevelClient , la configuration n'est pas appliquée au RestClient .

Si vous avez déjà le RestHighLevelClient disponible, vous pouvez rendre facilement disponible un RestClient configuré comme suit:

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



9
votes

Spring Boot elasticsearch a besoin de savoir à quel port (et hôte) se connecter pour la vérification de l'état. Ajoutez:

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

Ceci est en plus de la configuration que vous avez déjà. Ceci est séparé car beaucoup de gens, comme moi, utilisent le port (non-http) 9300 d'elasticsearch pour les recherches réelles au lieu de votre partie de la configuration. Je n'ai pas non plus management.health.elasticsearch. Ma configuration totale pour elasticsearch est:

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


0 commentaires