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不在同一台机器,
- 防火墙/安全组别忘开!客户端要能访问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




