高版本SpringBoot兼容低版本ElasticSearch解决方案

这篇具有很好参考价值的文章主要介绍了高版本SpringBoot兼容低版本ElasticSearch解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

由于公司最近需要接入日志数据,然而日志数据在ElasticSearch(版本为 6.8.23)里面,但是接入数据项目使用的是Spring Boot 2.4.x版本,根据Spring Data官方提供的版本对应,明显对应不上,官方文档地址:Spring Data Elasticsearch - Reference Documentation

Spring Data Release Train Spring Data Elasticsearch Elasticsearch Spring Framework Spring Boot

2021.2 (Raj)

4.4.x

7.17.9

5.3.x

2.7.x

2021.1 (Q)

4.3.x

7.15.2

5.3.x

2.6.x

2021.0 (Pascal)

4.2.x[1]

7.12.0

5.3.x

2.5.x

2020.0 (Ockham)[1]

4.1.x[1]

7.9.3

5.3.2

2.4.x

Neumann[1]

4.0.x[1]

7.6.2

5.2.12

2.3.x

Moore[1]

3.2.x[1]

6.8.12

5.2.12

2.2.x

Lovelace[1]

3.1.x[1]

6.2.2

5.1.19

2.1.x

Kay[1]

3.0.x[1]

5.5.0

5.0.13

2.0.x

Ingalls[1]

2.1.x[1]

2.4.0

4.3.25

1.5.x

如果使用Spring Boot提供的spring-boot-starter-data-elasticsearch模块则存在兼容性问题;

ElasticSearch 5.x:支持多种Type(类似关系型数据的表概念);

ElasticSearch 6.x:仅支持一个Type;

ElasticSearch 7.x:将Type概念移出。

由于以上ElasticSearch 版本之间的差距导致对应Spring Data ElasticSearch包的差距;所以在不降低Spring Boot版本的情况需兼容低版本的ElasticSearch的客户端。

解决方法

方案一

具体使用

由于不兼容,即放弃Spring Data ElasticSearch框架包,使用最直接的Java ElasticSearch Client连接即可,将Client注入到Spring容器中,当前使用Transport方式连接ElasticSearch服务(在ES7.x版本已经不推荐使用TCP 9300端口),或者使用High/Low Level Client API连接也是可以的(HighLevel是在LowLevel Client的基础上封装而成的

使用Maven依赖如下:

        <dependency>
            <artifactId>elasticsearch</artifactId>
            <groupId>org.elasticsearch</groupId>
            <version>6.8.13</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>6.8.13</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.8.13</version>
        </dependency>

编写ElasticSearch配置类:

@Configuration
public class ElasticSearchConfig  {

    public static final String HOST = "127.0.0.1";   //ES集群服务器IP地址

    public static final Integer PORT = 9300;         //集群结点之间通信端口

    public static final String CONF = "cluster.name"; //配置集群名称(默认配置、无需修改)

    public static final String NAME = "elasticsearch"; //配置节点名称(默认配置、无需修改)


    @Bean
    public TransportClient transportClient() throws UnknownHostException {
        Settings settings = Settings.builder().put(CONF, NAME).build();
        return new PreBuiltTransportClient(settings)
                .addTransportAddress(new TransportAddress(InetAddress.getByName(HOST),PORT));
    }

}

查询示例:

@Component
public class ESTransportInit implements CommandLineRunner {

    @Resource
    private TransportClient transportClient;

    @Override
    public void run(String... args) throws Exception {
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        SearchResponse resp = transportClient.prepareSearch("blog").setQuery(queryBuilder).get();

        //3、返回结果
        System.out.println(resp);

    }
}

结论

由于使用原生Java连接ElasticSearch服务,所以在代码开发方式上有一定难度,不建议使用。

方案二(推荐)

具体使用

由于SpringBoot 2.3.x以上版本只支持ES7服务,所以对于一些本身为SpringBoot高版本的项目而言单纯的引入spring-boot-starter-data-elasticsearch模块包是存在兼容性问题的,所以需要将Spring Data ElasticSearch单独引入,由于ES6对应的Spring Data ElasticSearch 为3.2.x版本,单纯引入依赖如下配置:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.2.12.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>transport-netty4-client</artifactId>
            <groupId>org.elasticsearch.plugin</groupId>
        </exclusion>
        <exclusion>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <groupId>org.elasticsearch.client</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <groupId>org.elasticsearch.client</groupId>
    <version>6.8.13</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>6.8.13</version>
</dependency>
<dependency>
    <artifactId>elasticsearch</artifactId>
    <groupId>org.elasticsearch</groupId>
    <version>6.8.13</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>transport-netty4-client</artifactId>
    <version>6.8.13</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.8.13</version>
    <exclusions>
        <exclusion>
            <artifactId>elasticsearch</artifactId>
            <groupId>org.elasticsearch</groupId>
        </exclusion>
        <exclusion>
            <artifactId>transport-netty4-client</artifactId>
            <groupId>org.elasticsearch.plugin</groupId>
        </exclusion>
        <exclusion>
            <artifactId>elasticsearch-rest-client</artifactId>
            <groupId>org.elasticsearch.client</groupId>
        </exclusion>
    </exclusions>
</dependency>

引入如上依赖之后,spring-boot-starter-data-elasticsearch包无需再引,由于SpringBoot为自动配置类,所以在主类中需要将ElasticSearch自动配置类去除:

@SpringBootApplication(exclude = {ElasticsearchRepositoriesAutoConfiguration.class, ElasticsearchDataAutoConfiguration.class})
public class EsAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(EsAppApplication.class, args);
    }

}

去除自动配置类之后,需要手动将ElasticSearch配置类提供:

@Configuration
public class ElasticSearchConfig  {
	// 使用ES http客户端
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        // IP以及port可以写入到application.yml配置文件中
        return new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", 9200)));
    }
	// 引入ElasticsearchRestTemplate
    @Bean
    public ElasticsearchRestTemplate elasticsearchRestTemplate() {
        return new ElasticsearchRestTemplate(restHighLevelClient());
    }

}

编写索引实体类:

@Data
// 低版本依赖包注解有type标记
@Document(indexName = "blog", type = "doc")
public class Blog {
	@Id
    private String id;

    private String name;

    private String phone;

    private Integer age;

    private String ip;

    private String dec;

    private Date birth;

}

简单使用:

@Component
public class ESInit implements CommandLineRunner {
    // 引入ES Rest Template
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public void run(String... args) throws Exception {
        System.out.println("执行ES初始化.........");
        // 查询Query,查询age小于等于19并且第一页数据页大小为5
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.rangeQuery("age").lte(19))
                .withPageable(PageRequest.of(0,5))
                .build();

        List<Blog> blogs = elasticsearchRestTemplate.queryForList(searchQuery, Blog.class);

        blogs.stream().forEach(System.out::println);

        System.out.println("执行ES结束.........");
    }
}

结论

使用Spring Data ElasticSearch框架包中的ElasticsearchRestTemplate模板类,在代码开发上比原生开发提升了便携性。

其他

具体ElasticsearchRestTemplate使用官方文档:Spring Data Elasticsearch - Reference Documentation

ElasticsearchRestTemplate API文档:Spring Data Elasticsearch 3.2.12.RELEASE API文章来源地址https://www.toymoban.com/news/detail-467232.html

到了这里,关于高版本SpringBoot兼容低版本ElasticSearch解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot 数据库版本升级管理常用解决方案

    目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题

    2024年02月13日
    浏览(37)
  • 【微服务】springboot 整合mysql实现版本管理通用解决方案

    目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题

    2024年02月13日
    浏览(25)
  • 关于springboot整合elasticsearch8.4.3的找不到相关类JsonProvider、JsonProvider的解决方案

    环境是springboot是2.3.7,elasticsearch是8.4.3 关于8.4.3的官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/8.4/installation.html 创建ElasticsearchClient 对象: 一开始报错ClassNotFoundException: jakarta.json.spi.JsonProvider,然后看了下官方文档修改了下jakarta.json-api的版本.解决完成之后

    2024年02月02日
    浏览(43)
  • Apache Tomcat 最新信息泄露漏洞CVE-2023-28708详情及解决方案,springboot版本的对应的内嵌tomcat版本查看,tomcat相关。

    CVE - CVE-2023-28708 (mitre.org) NVD - CVE-2023-28708 (nist.gov) CVE-2023-28708 site:tomcat.apache.org - Google Search 当将 RemoteIpFilter 与通过 HTTP 从反向代理接收的请求一起使用时,包括设置为 https 的 X-Forwarded-Proto 标头,由 Apache Tomcat 11.0.0-M1 到 11.0.0.-M2、10.1.0-M1 到 10.1.5、9.0.0-M1 到 9.0.71 和 8.5.0 到 8

    2024年02月13日
    浏览(27)
  • 前端浏览器的兼容性问题探讨和解决方案

    解决不同浏览器之间的兼容性问题,可以采取以下一些常用的解决方案: 使用 CSS Reset:不同浏览器对于默认样式的定义存在差异,使用 CSS Reset 可以将不同浏览器的默认样式重置为统一的基准样式,从而减少浏览器之间的差异。 使用 CSS Hack 或浏览器前缀:某些 CSS 属性或值

    2024年02月14日
    浏览(32)
  • Apache DolphinScheduler中ZooKeeperCDH不兼容问题的解决方案

    看到Apache DolphinScheduler社区群有很多用户反馈和讨论这块问题,针对不兼容的问题,不仅需要自己重新编译各一个新包,而且因为默认是使用zk-3.8的配置,所以会出现不兼容问题。使用zk-3.4配置即可适配3.4.x 上述命令解释 指定多线程编译,可以增加~ 拓展 Maven中-DskipTests和-D

    2024年02月19日
    浏览(30)
  • 前端开发中常见的浏览器兼容性问题及解决方案

    提示:这里主要阐述浏览器兼容性产生的环境: 所谓的浏览器兼容性问题,是指 因为不同浏览器对同一段代码有着不同的解析,所造成页面显示效果不统一的情况。 为此,解决浏览器兼容,也成为了跨浏览器开发的一个核心问题。 当初微软不加入W3C,使得后者不采用IE的方

    2023年04月18日
    浏览(30)
  • Android安装apk出现 “安装包无效”或“安装包不兼容”的解决方案

    使用Android Studio安装apk到手机一切正常,但是分享出去出现安装apk出现“安装包无效”或“安装包不兼容”问题 这种情况需要我们设置一个签名方案 在app的build.gradle的android标签里加入 加入后如下 (1)Build 菜单下选择 Generate Signed Bundle / APK (2)选择 APK,点击 Next 下一步 (

    2024年02月08日
    浏览(30)
  • uni-app x生成的安卓包,安装时,提示不兼容。解决方案

    找到 manifest.json 进入:源码视图 packagename:包名;最好是和你“发行”(打包)时的包名一致。 abiFilters:需要兼容CPU的类型 minSdkVersion:应用兼容的最低Android版本(API等级) targetSdkVersion:应用适配的目标Android版本(API等级)   官方说明:manifest.json | uni-app官网 App-Android端发

    2024年02月03日
    浏览(52)
  • 秒云云原生信创全兼容解决方案再升级,助力信创产业加速落地

    近日, 成都元来云志科技有限公司(简称“秒云”)与中科方德软件有限公司(简称“中科方德”)完成产品兼容性互认证测试, 测试结果表明:秒云容器云平台MYCP V19.07.3产品与方德高可信服务器操作系统V3.1 / V4.0(海光版)、方德高可信服务器操作系统V3.1 / V4.0(兆芯版)

    2024年02月02日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包