You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot 2.1.4中Spring Data Elasticsearch使用及连接异常排查

嘿,我来帮你搞定这个问题!先给你吃个定心丸,再一步步解决异常和配置的事儿:

版本兼容性确认

Spring Boot 2.1.4 RELEASE集成的spring-data-elasticsearch 3.1.4 完全兼容Elasticsearch 6.2.2——官方版本映射表明确标注,spring-data-elasticsearch 3.1.x对应的就是Elasticsearch 6.2.x系列,所以版本组合本身没问题,NoNodeAvailableException基本是配置、网络或者ES服务端设置的锅。

先排查基础问题(别上来就改配置)

先把几个最容易踩的坑排除掉:

  • 先确认ES 6.2.2服务真的跑起来了,用curl http://你的ES机器IP:9200测一下,能返回集群信息才说明服务正常
  • 检查ES的elasticsearch.yml
    • 如果客户端和ES不在同一台机器,network.host不能是默认的localhost,改成0.0.0.0或者具体的对外IP
    • 要是用TransportClient(后面会说两种客户端),得确保transport.tcp.port是9300(默认值),而且discovery.zen.ping.unicast.hosts要包含客户端能访问的地址
  • 防火墙/安全组别忘开!客户端要能访问ES的9200(Rest端口)或者9300(Transport端口)
两种客户端配置方案(推荐用RestClient)

ES从6.x开始就主推RestHighLevelClient了,TransportClient在7.x之后直接被废弃,所以优先给你推荐Rest方案:

方案1:RestHighLevelClient(官方推荐)

Spring Boot 2.1.x已经原生支持通过spring.elasticsearch.rest配置这个客户端,省心又主流。

application.yml配置示例:

spring:
  elasticsearch:
    rest:
      uris: http://你的ES机器IP:9200
      # 要是ES开了账号密码验证,加下面两行
      username: elastic
      password: your-es-password

代码里直接注入就能用:

@Autowired
private RestHighLevelClient restHighLevelClient;

方案2:TransportClient(旧版兼容方案)

如果非要用spring-data-elasticsearch传统的TransportClient,就配置spring.data.elasticsearch

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch # 要和ES配置文件里的cluster.name一模一样
      cluster-nodes: 你的ES机器IP:9300 # Transport协议默认端口9300
      # 可选的连接超时配置,按需加
      properties:
        client:
          transport:
            ping_timeout: 10s
            nodes_sampler_interval: 5s

⚠️ 注意:如果你的ES开了X-Pack安全认证,TransportClient配置证书和账号密码会比较麻烦,这也是为啥更推荐RestClient的原因之一。

额外提几个注意点
  • 确保你的依赖里有spring-boot-starter-data-elasticsearch,它会自动帮你管理RestHighLevelClient的依赖版本,避免版本冲突
  • 别手动乱加Elasticsearch的Jar包,要是加了,版本必须和6.2.2完全一致,不然容易出各种奇怪的问题
  • 要是ES跑在Docker容器里,除了端口映射对,还要把ES的network.host设为0.0.0.0,不然容器外的客户端连不上

内容的提问来源于stack exchange,提问作者gdk

火山引擎 最新活动