Spring Boot容器部署时Elasticsearch客户端默认访问localhost报错问题
问题根因
该问题是Spring Data Elasticsearch不同客户端类型的配置属性不通用导致的:
- 错误栈中出现
org.springframework.data.elasticsearch.client.reactive.SingleNodeHostProvider,说明你使用的是响应式ReactiveElasticsearch客户端,而你配置的spring.elasticsearch.rest.uris仅对非响应式的RestHighLevelClient生效,响应式客户端读取的配置项和非响应式不一致 - 未配置响应式客户端地址时,Spring Data Elasticsearch会使用默认值
localhost:9200,这就是错误日志里一直尝试连接本地9200端口的原因 - 本地运行时你的Elasticsearch刚好在本地启动,默认地址能通所以没有报错,容器中运行时Elasticsearch不在当前容器本地,就触发了连通异常
解决步骤
- 删除废弃无效的配置项
spring.data.elasticsearch.cluster,该配置在Spring Data Elasticsearch 4.x(对应Spring Boot 2.5.x版本)中已经被移除,不会生效 - 新增响应式Elasticsearch客户端的地址配置,调整后的完整配置如下:
# 非响应式客户端配置(如果使用RestHighLevelClient可保留) spring.elasticsearch.rest.uris=elasticsearch:9200 # 响应式客户端配置(错误日志显示使用的是该客户端,必须配置) spring.data.elasticsearch.client.reactive.endpoints=elasticsearch:9200 spring.data.elasticsearch.repositories.enabled=true
- 如果你有手动自定义注册
ReactiveElasticsearchClient的Bean,确认Bean创建逻辑中没有硬编码localhost:9200地址,需要从配置文件中读取对应配置值 - 如果使用
@PropertySource加载自定义配置文件,需要确认配置文件在容器镜像的classpath下存在,且注解添加到了被Spring扫描到的配置类上
内容的提问来源于stack exchange,提问作者SriniMurthy
相关产品推荐
相关产品推荐

