Elasticsearch Java应用启动失败,请求排查连接异常问题
解决Elasticsearch 8.5与Spring Boot 2.7.1连接ClosedException问题
核心问题原因
Elasticsearch 8.x版本默认启用了HTTPS加密传输和内置用户身份认证,你的客户端配置未适配这两个默认安全设置,导致服务器主动关闭未加密/未认证的连接,抛出ConnectionClosedException。
解决方法
方案一:开发环境临时关闭安全验证(快速测试)
- 修改Docker启动Elasticsearch的命令,添加以下环境变量:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e "xpack.security.enabled=false" \ -e "xpack.security.http.ssl.enabled=false" \ elasticsearch:8.5.0 - 重启现有容器(如果已启动):
docker stop elasticsearch docker rm elasticsearch # 执行上面的run命令重新启动容器 - 此时原有客户端配置无需修改,Spring Boot应用即可正常连接HTTP协议的Elasticsearch服务。
方案二:生产环境适配HTTPS与身份认证(推荐)
1. 获取Elasticsearch CA证书
- 进入运行中的Elasticsearch容器:
docker exec -it elasticsearch /bin/bash - 生成CA证书(容器初始化未生成时执行):
bin/elasticsearch-certutil ca --out config/ca/ca.crt - 将证书复制到本地Spring Boot项目的
src/main/resources目录:docker cp elasticsearch:/usr/share/elasticsearch/config/ca/ca.crt ./src/main/resources/
2. 获取elastic用户密码
- 查看容器初始化时生成的默认密码(容器日志包含):
docker logs elasticsearch | grep "password for the elastic user" - 或者重置elastic用户密码:
docker exec -it elasticsearch bin/elasticsearch-reset-password -u elastic
3. 修改客户端配置类
更新ElasticsearchClientConfig,添加SSL证书信任和基础认证信息:
@Configuration @EnableElasticsearchRepositories(basePackages = "io.pratik.elasticsearch.repositories") @ComponentScan(basePackages = { "io.pratik.elasticsearch" }) public class ElasticsearchClientConfig extends AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration .builder() .connectedTo("0.0.0.0:9200") .usingSsl(new ClassPathResource("ca.crt")) // 加载本地CA证书 .withBasicAuth("elastic", "你的elastic用户密码") // 配置账号密码 .build(); return RestClients .create(clientConfiguration) .rest(); } }
验证
重启Spring Boot应用,调用ProductRepository的方法测试连接是否正常,此时应不再抛出连接关闭异常。
内容的提问来源于stack exchange,提问作者DrunkenPotato
相关产品推荐
相关产品推荐

