SpringBoot一站式功能提供框架(三)整合ElasticSearch、EasyES、读取本地Json配置--柚子真好吃
一、前言
此框架主要针对SpringBoot项目各类功能做出封装,整合各类插件,提供简便快速用法;
二、功能描述
已完成功能:
- 整合Mybatis Plus单表查询;
- 整合Swagger接口文档;
- 整合Druid配置多数据源;
- 封装全局异常捕获;
- 封装同字段对象间转换方法;
- 整合Mybatis Plus分页查询;
- 整合WebSocket服务端;
1)客户端注册;
2)消息推送;
3)针对IP推送; - 封装Word工具类;
1)提取Word中图片; - 封装读取本地Json配置工具类(新);
- 搭建ElasticSearch+kibana(新);
- 整合Easy-Es(新);
待整合功能
Nacos
easy-es
RabbitMQ
Redis
Debezium
Cancel
请求拦截器
内部过滤器
常用工具类
gateway
auth2
文件上传下载接口封装
hdfs/fastdfs文件存储
本地文件夹监控
文件读取
压缩包读取
数据库配置加密
切面
配置文件读取
日期自动填充
自定义注解转换 0-false
三、具体实现
-
封装读取本地Json配置工具类
首先根据需求编写配置文件目录为(resources/config/Equipment.json)内容如下:Equipment.json { "CT": [ "M4A1-S", "USP-S", "Knife", "FlashBomb" ], "T": [ "AWP", "Glock", "Knife" ] }
配置读取源码如下:
/** * @author Ryan * @date 2022/8/6 16:56 * @description 读取JSON配置文件 */ @Slf4j public class JsonConfig { private static Map<String, List<String>> equipmentMap = new LinkedHashMap<>(); public static void initConfig() { try { equipmentMap = JSON.parseObject(new ClassPathResource("/config/Equipment.json").getInputStream(), Map.class); } catch (IOException e) { log.error("【配置读取】读取Json配置失败"); e.printStackTrace(); } log.info("【配置读取】初始化Json配置完成"); } public static Map<String, List<String>> getEquipmentMap() { return equipmentMap; } }
注意:需要在项目启动时初始化配置读取 initConfig(),代码如下:
/** * @author Ryan * @date 2022-07-27 * @description 启动类 */ @SpringBootApplication @MapperScan("com.ryan.fw.mapper") @EsMapperScan("com.ryan.fw.easyes.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); //初始化json数据 JsonConfig.initConfig(); } }
服务启动请求Swagger接口效果如下:
-
整简单搭建ElasticSearch + Kibana;
服务采用Docker部署,点击跳转
镜像采用 nshou/elasticsearch-kibana 为ElasticSearch+Kibana合并镜像镜像拉取:docker pull nshou/elasticsearch-kibana 启动命令:docker run -d -p 9200:9200 -p 5601:5601 nshou/elasticsearch-kibana
启动成功后可访问: 127.0.0.1:9200 127.0.0.1:5601 查看状态
查看镜像状态:docker ps 效果如下:
-
整合Easy-ES操作ElasticSearch;
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.
依赖如下:<dependency> <groupId>cn.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>0.9.80</version> </dependency>
此案例仅对单个索引进行操作,实体如下:
/** * @author Ryan * @date 2022/8/8 9:36 * @description 图书-实体 */ @TableName("fw_book") @Data @ToString @EqualsAndHashCode(callSuper = true) @IndexName("fw_book") public class BookDO extends BaseDO { @TableId(type = IdType.AUTO) @IndexId(type = cn.easyes.common.enums.IdType.CUSTOMIZE) private Long id; private String name; private BigDecimal price; private String author; private String type; private String description; }
使用此框架需配置mapper与mapper扫描,详情代码如下:
注意:此es的mapper要与Mybatis-Plus的mapper区分位置;
/** * @author Ryan * @date 2022/8/8 17:33 * @description */ @Component public interface BookEsMapper extends BaseEsMapper<BookDO> { }
/** * @author Ryan * @date 2022-07-27 * @description 启动类 */ @SpringBootApplication @MapperScan("com.ryan.fw.mapper") @EsMapperScan("com.ryan.fw.easyes.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); //初始化json数据 JsonConfig.initConfig(); } }
针对此实体简单封装各类方法,接口如下:
/** * @author Ryan * @date 2022/8/8 17:04 * @description */ public interface BookService extends IService<BookDO> { /** * 查询单条图书信息 * * @param id 图书Id * @return */ public BookVO one(Long id); /** * 查询全部图书信息 * * @return */ public List<BookVO> getAllBooks(); /** * 同步全部图书信息至ES * * @return */ public Boolean syncEsAllBooks(); /** * 查询全部ES图书信息 * * @return */ public List<BookVO> getAllEsBooks(); /** * 删除全部ES图书信息 * * @return */ public Boolean deleteAllEsBooks(); /** * 对比Es与Mysql * * @return 响应信息 */ public Map<String, Object> contrastEsAndDb(); }
具体实现类如下:
/** * @author Ryan * @date 2022/8/8 17:06 * @description */ @Slf4j @Service public class BookServiceImpl extends ServiceImpl<BookMapper, BookDO> implements BookService { @Resource private BookEsMapper bookEsMapper; @Override public BookVO one(Long id) { BookDO bookDO = this.getById(id); ObjUtils.checkNull(bookDO, "当前id:" + id + "无法确认图书信息"); return ObjUtils.convert(bookDO, BookVO.class); } @Override public List<BookVO> getAllBooks() { return ObjUtils.toList(super.list(), BookVO.class); } @Override public Boolean syncEsAllBooks() { List<BookDO> list = super.list(); if (bookEsMapper.existsIndex("fw_book")) { for (BookDO bookDO : list) { BookDO es = bookEsMapper.selectById(bookDO.getId()); if (Objects.nonNull(es)) { bookEsMapper.updateById(bookDO); } else { bookEsMapper.insert(bookDO); } } } else { list.forEach(item -> bookEsMapper.insert(item)); } return true; } @Override public List<BookVO> getAllEsBooks() { try { List<BookDO> list = bookEsMapper.selectList(new LambdaEsQueryWrapper<>()); return ObjUtils.toList(list, BookVO.class); } catch (UndeclaredThrowableException e) { throw new RuntimeException("【索引无效】fw_book不存在"); } } @Override public Boolean deleteAllEsBooks() { return bookEsMapper.deleteIndex("fw_book"); } @Override public Map<String, Object> contrastEsAndDb() { Map<String, Object> map = new HashMap<>(2); if (bookEsMapper.existsIndex("fw_book")) { Integer num = 500; long start = System.currentTimeMillis(); for (int i = 0; i <= num; i++) { this.getAllBooks(); } map.put("DB", "【查询对比】DB查询耗时:" + (System.currentTimeMillis() - start)); for (int i = 0; i <= num; i++) { this.getAllEsBooks(); } map.put("ES", "【查询对比】ES查询耗时:" + (System.currentTimeMillis() - start)); } return map; } }
最终Swagger调用接口,结果如下:
数据库查询:ES查询:
四、开源地址(含源码)
GitHub: https://github.com/fsyxjwxw/SpringBoot-Framework
如有其他想法或想要整合的插件请与本人联系;