es Spring boot 整合elesticsearch报错 解决思路

es Spring boot 整合elesticsearch报错 解决思路

  1. 报错类型
    报错None of the configured nodes are available

  2. 云服务部署的es版本 为5.6.16

  3. 项目依赖

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
         <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
        </dependency>
  1. 项目配置
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=172.30.0.8:9300
spring.data.elasticsearch.repositories.enabled=true

通过http 的方式是 直接访问9200端口是可以访问的 http://172.30.0.8:9200 显示内容为

{
    "name": "VQ8kJxh",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "Gcrn0TsYStW_jNl6fsxdAQ",
    "version": {
        "number": "5.6.16",
        "build_hash": "3a740d1",
        "build_date": "2019-03-13T15:33:36.565Z",
        "build_snapshot": false,
        "lucene_version": "6.6.1"
    },
    "tagline": "You Know, for Search"
}

通过Spring boot 连接 http://localhost:8080/getById/1(写了一个Controller 这里省略掉) 就报错
报错内容

{
    "code": 400,
    "message": "None of the configured nodes are available: [{#transport#-1}{jAgsg2vVSxSTzR4vbztiMA}{129.28.189.234}{129.28.189.234:9300}]"
}

期间单独写一个测试类 是这样的


public class Client {

    public static void main(String[] args) {
        Settings settings = Settings.EMPTY;
        TransportClient client = null;
        try {
             client = new PreBuiltTransportClient(settings)
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("129.28.189.234"), 9300));
            GetResponse documentFields = client.prepareGet("website", "blog", "123").execute().actionGet();
            System.out.println(documentFields.getSourceAsString());

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }finally {
            if (client != null) {
                client.close();
            }

        }
    }
}

发现这个类没有找到 InetSocketTransportAddress 大概猜到 是版本的问题

网上搜索 https://github.com/spring-projects/spring-data-elasticsearch/ 发现

Spring-data-elesticsearch版本与 elesticsearch 有一定的关系 关系如下

=====
|Spring Data Elasticsearch |Elasticsearch

|3.2.x |6.7.2
|3.1.x |6.2.2
|3.0.x |5.5.0
|2.1.x |2.4.0
|2.0.x |2.2.0
|1.3.x |1.5.2
======

spring boot 2.1.6 中引入的Spring-data-elasticsearch版本是3.1.9.RELEASE 所以对应的es版本是和我服务器上的版本不一致的 顺便说一句,es7 es67 es5 的语法以及使用会稍稍有一些不一样 排除原有的和es相关的jar包,引入正确的jar包

解决方式

<!--        统一使用 5.6.16 这个版本的elesticsearch 版本不一致,会出问题-->
       <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.plugin</groupId>
                    <artifactId>transport-netty4-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>transport</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--        统一使用 5.6.16 这个版本的elesticsearch   start-->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.6.16</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>5.6.16</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.16</version>
        </dependency>
        <!--        统一使用 5.6.16 这个版本的elesticsearch   end-->

再连 发现还是这个问题 woca 。。。。。。。

期间在本地开了一个 es 服务, 是可以的 连接的,但是服务器上就不行了

然后想起来昨天配置服务器 的时候将 9200 端口对外放开了,这个时候查看服务器防火墙

sudo ufw status

显示

Status: active

To                         Action      From
--                         ------      ----
9200                       ALLOW       Anywhere                  
5601                       ALLOW       Anywhere                  
3306                       ALLOW       Anywhere                  
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
9200 (v6)                  ALLOW       Anywhere (v6)             
5601 (v6)                  ALLOW       Anywhere (v6)             
3306 (v6)                  ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)      

这就知道问题了 9300 没有放开,好吧,要么直接放开9300 要么直接把防火墙关掉

我选择的是直接关掉防火墙(公司环境不建议这么操作)

然后在重启Spring boot http://localhost:8080/getById/123 好的 就直接给我吧结果显示出来了

{
    "message": "success",
    "code": 200,
    "result": {
        "id": "123",
        "firstName": null,
        "lastName": null,
        "age": 0,
        "about": null
    }
}

最后附上自己的elesticsearch.yml文件 网上有的地方说这里的network.host 配置不能是0.0.0.0 要配置本机ip, 其实在这里配置成本机ip 和0.0.0.0 都是一样的

#network.host: 172.30.0.8
network.host: 0.0.0.0 
http.port: 9200

总结以及教训:

这种每个版本之间区别很大的中间件,在使用jar包的时候一定保持版本统一

上一篇:如何美化你的ubuntu


下一篇:华为“剑鱼”出世记:长风破浪会有时,直挂云帆济沧海