关于ES版本升级为7.9.2后,遇到的一些问题

项目场景

最近项目做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中
image-20201017140609969

我们先看 ElasticsearchRestClientProperties 这个类

image-20201017124742016

看到这个配置文件,了解下@ConfigurationPreperties 这个注解,意思是获取配置文件中的属性值,所以这个也就导致了楼主前面使用了spring.data.elasticsearch.rest 多写了一个data,所以就一直使用默认的连接方式 localhost:9200

配置信息读取到了,注入到 ElasticsearchRestClientProperties 中,回到ElasticsearchRestClientAutoConfiguration,看引入的第一个类 RestClientBuilderConfiguration

image-20201017125300158

HttpHost[],将host转为数组,然后存储到List<Node>集合中。

在这个方法,进入RestClient.builder 里面

image-20201017130038303

这里的意思,将host设置为node节点,然后创建一个 RestClientBuilder类,里面的方法没什么,就判断非空,然后将node设置为一个常量final类型的node 泛型集合

image-20201017130302881

之后成功返回 RestClientBuilder 类,接下来进入正式创建 客户端连接,看备注为2的类,RestHighLevelClientConfiguration,点击进入

先初始化该类

image-20201017140721622

重点在于这里

image-20201017140815044

创建客户端连接

image-20201017140956486

到这里就很清晰了吧,前面Builder一些参数,到这里正式建立连接,成功之后,看建立连接的Node节点,因为楼主模拟localhost:9200连接失败的场景,所以Node节点是localhost:9200

image-20201017141156092

而建立客户端连接之后,ElasticsearchRestTemplate就开始初始化,执行一个预检请求,判断网络是否通畅,服务是否正常。

image-20201017141653761

执行exceute

image-20201017141740680

因为连接的是localhost:9200,所以这里就报错了

image-20201017141809760

到这里就结束了,整个报错原因,就都清晰了,当然,建立连接前面有一些类,这里楼主还没怎么学习过,就不误人子弟了,仅记录楼主查找问题的原因,从什么地方找起。

小窍门

这里分享一个小窍门,DEBUG模式下,按照Frames模块,往下点,就能知道上一个类调用的是哪个,避免实现类过多找不到

image-20201017142038579

总结

多学会从源码找问题,这样分析下来,对后续看源码学习,帮助应该挺大的。后面如果也有使用遇到一些问题,也会更新。写博客实在太耗时间了。怕误人子弟又怕写不够好,完美主义作怪。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值