项目场景
最近项目做Spring Boot版本升级,升级的同时也顺便把ES升级一波,因为旧的ES用的是2.X的版本,现在都7.X,导致一些功能无法正常使用,需要更新替换
遇到的问题
问题
因为楼主用的是spring date elasticsearch
封装的ES API,起初以为只是修改下端口号,将ElasticsearchTemplate
改为ElastcisearchRestTemplate
即可,结果没想到6.X之后,连接方式都改变了。
原先配置
spring:
data:
elasticsearch:
# 禁用安全检查
repositories:
enabled: false
cluster-name: elasticsearch
cluster-nodes: 192.168.1.111:9300
启动报错:Timeout connecting to [localhost/127.0.0.1:9200]
解决:更改配置文件
spring:
elasticsearch:
rest:
uris: 192.168.1.111:9200
这里还发生了一个小插曲,因为旧有配置文件的原因,导致楼主直接复制,然后替换之后变成了:
# 错误的连接方式,这里只是告知楼主因为粗心导致的问题
spring:
data:
elasticsearch:
rest:
uris: 192.168.1.111:9200
下面是关于这个问题的源码分析
原因分析
本来问题解决了不就好了吗?但是对于我们来说,知其所以然,不然下次遇到一些问题,博客上又找不到,那这个问题怎么解决?看源码是个学习的好方法
Spring项目启动时,初始化ElasticsearchRestTemplate
,从ElastcisearchDataAutoConfiguration
配置类开始,里面导入了几个类,画红框的就是我们引入的配置信息源头
点击进入,这个类的作用,引入配置文件的信息到ElactisearchRestClientProperties中
我们先看 ElasticsearchRestClientProperties
这个类
看到这个配置文件,了解下@ConfigurationPreperties
这个注解,意思是获取配置文件中的属性值,所以这个也就导致了楼主前面使用了spring.data.elasticsearch.rest
多写了一个data,所以就一直使用默认的连接方式 localhost:9200
配置信息读取到了,注入到 ElasticsearchRestClientProperties
中,回到ElasticsearchRestClientAutoConfiguration
,看引入的第一个类 RestClientBuilderConfiguration
HttpHost[]
,将host转为数组,然后存储到List<Node>
集合中。
在这个方法,进入RestClient.builder
里面
这里的意思,将host设置为node节点,然后创建一个 RestClientBuilder
类,里面的方法没什么,就判断非空,然后将node设置为一个常量final类型的node 泛型集合
之后成功返回 RestClientBuilder
类,接下来进入正式创建 客户端连接,看备注为2的类,RestHighLevelClientConfiguration
,点击进入
先初始化该类
重点在于这里
创建客户端连接
到这里就很清晰了吧,前面Builder一些参数,到这里正式建立连接,成功之后,看建立连接的Node节点,因为楼主模拟localhost:9200
连接失败的场景,所以Node节点是localhost:9200
而建立客户端连接之后,ElasticsearchRestTemplate
就开始初始化,执行一个预检请求,判断网络是否通畅,服务是否正常。
执行exceute
因为连接的是localhost:9200
,所以这里就报错了
到这里就结束了,整个报错原因,就都清晰了,当然,建立连接前面有一些类,这里楼主还没怎么学习过,就不误人子弟了,仅记录楼主查找问题的原因,从什么地方找起。
小窍门
这里分享一个小窍门,DEBUG模式下,按照Frames模块,往下点,就能知道上一个类调用的是哪个,避免实现类过多找不到
总结
多学会从源码找问题,这样分析下来,对后续看源码学习,帮助应该挺大的。后面如果也有使用遇到一些问题,也会更新。写博客实在太耗时间了。怕误人子弟又怕写不够好,完美主义作怪。