关于springboot升级到springboot2.0的一些问题总结(包括ElasticSearch、Redis、Gradle)

最近做项目遇到了一个很麻烦的需求,字段折叠,使用mysql查询的话,简化一下sql语句是这样的,我在项目中的查询涉及两张表并且有多项不定项的查询条件,也就是需要sql拼接;

select * from 表 group by 字段 limit i, j;

这样确实能够解决问题,但是由于有很多条件查询,会使索引失效,导致速度极慢,所以我们考虑使用elasticsearch进行数据查询,那么问题来了,springboot1.5版本所支持的elasticsearch最高版本为2.4,而这样的sql语句查询elasticsearch需要到5版本以上才能够支持查询,这就涉及了elasticsearch的升级;在这里提供一篇非常好的博客,很好的讲解了什么是字段折叠,本人十分感谢这篇文章!

https://elasticsearch.cn/article/132

升级ElasticSearch

springboot1.5版本支持的elasticsearch版本为2.4.0;而elasticsearch字段折叠需要在5版本以后才能够使用,所以我们要升级elasticsearch到5版本,如果我们不升级springboot,引用elasticsearch5的相关jar包,其实也可以做到数据交互,但是我们无法使用jpa进行数据交互,在实际项目中,这是很可怕的事情,因为你的改动会大的离谱;

那怎么办? 升级springboot到2.0.1版本试试看!

升级springboot到2.0.1版本

由于我们的项目是使用gradle进行项目构建,所以我们要创建一个springboot2.0.1的项目来看一下,2.0.1版本的配置有什么不一样,需要改哪些地方?

下面这是gradle构建springboot1.5.8版本的配置

buildscript {
    ext {
        springBootVersion = '1.5.8.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

jar {
    enabled = true
}

dependencies {
    compile project(":service-sss")
    compile project(":service-xxx")
}

下面是构建springboot2.0.1版本的gradle配置

buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile project(":service-xxx")
    compile project(":service-sss")
}

想必你已经发现了哪里有不同了,是的,除了版本号以外,2.0版本添加了一个插件配置,具体干什么用的我还不清楚。把所有的配置都修改后刷新一下gradle,你会发现你的gradle很可能出现问题! 什么问题呢?他会提示你,你得gradle版本不行,要你升级到gradle4.0版本以上;那么好,你说什么我干什么;很简单,去官网下载好zip安装包,解压就好了,然后打开你的setting;

springboot怎么实现jar的自升级 springboot 1.5升级2.0_springboot


这样就配置好了,很好,你也应该看到你的项目有无数个报错了把!来把,改把!

修改JPA方法

如果你数据库的交互用的jpa,那么恭喜你,你麻烦大了,jpa中的集合进行了修改,做了很大的优化,他给你返回的是Optional对象,他给我们提供了很好的优化,很大长度上避免了我们返回null值导致后面程序报错;

Optional<EsArticleEntity> esArticleEntity = esArticleRepository.findById(item);
            if (!esArticleEntity.isPresent()) {
                 // 如果为空就能进去
                System.out.println("如果能进来表示为null");
                return;
            }
                // 如果取不到返回null
            EsArticleEntity resultNull = esArticleEntity.orElse(null);

具体想了解,自行查找资料把;

Redis配置修改

当你前面都不报错了,建议你去看一下你的配置文件,估计又是红海行动了。
redis配置做了一些修改,这是springboot1.5版本的redis配置文件:

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=XX.XX.XXX.XXX
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0

这是修改后的redis配置文件

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=10.10.169.140
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedix.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0

里面的配置类也大同小异,细心观察下需要参数,修改起来应该没什么问题,如若不然,百度把,贼全!

字段折叠查询

这就不多说什么了,上代码把!

public ArrayList<EsArticleEntity>  getOpinionArticleByCondition(PageParam pageParam, List<Integer> categoryIds, List<Integer> sourceIds, String keyword, LocalDateTime fromTime, LocalDateTime toTime, String order) {
        SearchRequestBuilder searchBuilder = client.prepareSearch().setIndices("sentiment").setTypes("article");
        CollapseBuilder headerCollapse = new CollapseBuilder("headerId");
        searchBuilder.setCollapse(headerCollapse);

        //创建builder,设置查询条件
        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        // 设置关键字查询
        if(StringUtils.isNotEmpty(keyword)){
            BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
            queryBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("content", keyword)));
            queryBuilder.should(QueryBuilders.matchPhraseQuery("title", keyword).boost(10));
            builder.must(queryBuilder);
        }
        // 设置分类查询
        builder.must(QueryBuilders.termsQuery("secondCategoryId", categoryIds));
        // 设置来源查询
        if (Objects.nonNull(sourceIds) && sourceIds.size() > 0) {
            builder.must(QueryBuilders.termsQuery("sourceId", sourceIds));
        }
        // 设置时间范围查询
        if (Objects.nonNull(fromTime) && Objects.nonNull(toTime)) {
            Long fromLong = LocalDateTimeUtils.getMilliByTime(fromTime);
            Long toLong = LocalDateTimeUtils.getMilliByTime(toTime.plusDays(1).minusSeconds(1));
            builder.must(QueryBuilders.rangeQuery("syncOnSecond")
                    .gt(fromLong/1000)
                    .lt(toLong/1000));;
        }
        FieldSortBuilder sort;
        if ("ASC".equals(order)) {
            sort = SortBuilders.fieldSort("id").order(SortOrder.ASC);
        } else {
            sort = SortBuilders.fieldSort("id").order(SortOrder.DESC);
        }

        searchBuilder = searchBuilder.setQuery(builder).addSort(sort);
        // 这里注意分页是从第几条开始,并不是第几页开始
        SearchResponse response = searchBuilder.setFrom(pageParam.firstResult()).setSize(pageParam.getC()).get();
        ArrayList<EsArticleEntity> resultData = new ArrayList<>();
        SearchHit[] hits = response.getHits().getHits();
        for (SearchHit item : hits) {
            String dataJson = item.getSourceAsString();
            EsArticleEntity esData = JsonUtils.jsonToBean(dataJson, EsArticleEntity.class);
            resultData.add(esData);
        }
        return dataMap;
    }

这里需要注意一下,这里的response返回的总记录数与实际的总记录数不同,这里返回的总记录数是没有进行字段折叠前的记录数;我用的是二分法进行查找数据的总记录数;

Gradle打包

如果你都修改好了,你可以尝试打包了;

gradle clean build

好,就是这样的,对,报错了把!

springboot怎么实现jar的自升级 springboot 1.5升级2.0_redis_02


你可能说,我报错不是这个,那应该是这个?找不到符号?找不到程序包?

springboot怎么实现jar的自升级 springboot 1.5升级2.0_spring_03


应该就是这两种情况,springboot2版本打包方式做了一些变化,你需要更改一下你的操作:

gradle clean bootJar

但是好像并不好用,怎么办?
在所有的gradle配置里加上这样一个东西

buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}
// 添加这个后带包会成功!
jar {
    enabled = true
}

dependencies {
    compile project(":service-xxx")
    compile project(":service-sss")
}

一定要注意,把所有的gradle的配置文件都加上这样一行代码,再重新试一下gradle clean bootJar,应该成功了!


好了,最近遇到的问题大部分都在这里简答的说了一下,后续可能会更新,康桑密哒!