• SpringBoot一站式功能提供框架(三)整合ElasticSearch、EasyES、读取本地Json配置--柚子真好吃


    SpringBoot一站式功能提供框架(三)整合ElasticSearch、EasyES、读取本地Json配置--柚子真好吃

    一、前言

    此框架主要针对SpringBoot项目各类功能做出封装,整合各类插件,提供简便快速用法;

    二、功能描述

    已完成功能:

    1. 整合Mybatis Plus单表查询;
    2. 整合Swagger接口文档;
    3. 整合Druid配置多数据源;
    4. 封装全局异常捕获;
    5. 封装同字段对象间转换方法;
    6. 整合Mybatis Plus分页查询;
    7. 整合WebSocket服务端;
      1)客户端注册;
      2)消息推送;
      3)针对IP推送;
    8. 封装Word工具类;
      1)提取Word中图片;
    9. 封装读取本地Json配置工具类(新);
    10. 搭建ElasticSearch+kibana(新);
    11. 整合Easy-Es(新);

    待整合功能

    Nacos
    easy-es
    RabbitMQ
    Redis
    Debezium
    Cancel
    请求拦截器
    内部过滤器
    常用工具类
    gateway
    auth2
    文件上传下载接口封装
    hdfs/fastdfs文件存储
    本地文件夹监控
    文件读取
    压缩包读取
    数据库配置加密
    切面
    配置文件读取
    日期自动填充
    自定义注解转换 0-false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    三、具体实现

    1. 封装读取本地Json配置工具类
      首先根据需求编写配置文件目录为(resources/config/Equipment.json)内容如下:

      Equipment.json
      {
        "CT": [
          "M4A1-S",
          "USP-S",
          "Knife",
          "FlashBomb"
        ],
        "T": [
          "AWP",
          "Glock",
          "Knife"
        ]
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      配置读取源码如下:

      /**
       * @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;
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
       注意:需要在项目启动时初始化配置读取 initConfig(),代码如下:
      
      • 1
      /**
       * @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();
          }
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

      服务启动请求Swagger接口效果如下:
      在这里插入图片描述

    2. 整简单搭建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
      
      • 1
      • 2

      启动成功后可访问: 127.0.0.1:9200 127.0.0.1:5601 查看状态

       查看镜像状态:docker ps 效果如下:
      
      • 1

      在这里插入图片描述

    3. 整合Easy-ES操作ElasticSearch;

      官网连接:https://www.easy-es.cn/

      Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE是MP的Es平替版,在有些些方面甚至比MP更简单,同时也融入了更多Es独有的功能,助力您快速实现各种场景的开发.
      依赖如下:

       
           cn.easy-es
           easy-es-boot-starter
           0.9.80
       
      
      • 1
      • 2
      • 3
      • 4
      • 5

      此案例仅对单个索引进行操作,实体如下:

      /**
       * @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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      使用此框架需配置mapper与mapper扫描,详情代码如下:

       注意:此es的mapper要与Mybatis-Plus的mapper区分位置;
      
      • 1
      /**
       * @author Ryan
       * @date 2022/8/8 17:33
       * @description
       */
      @Component
      public interface BookEsMapper extends BaseEsMapper<BookDO> {
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      /**
       * @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();
          }
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

      针对此实体简单封装各类方法,接口如下:

      /**
       * @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();
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51

      具体实现类如下:

      /**
       * @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;
          }
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74
      • 75
      • 76
      • 77
      • 78

      最终Swagger调用接口,结果如下:
      数据库查询:在这里插入图片描述ES查询:在这里插入图片描述

    四、开源地址(含源码)

    GitHub: https://github.com/fsyxjwxw/SpringBoot-Framework

    如有其他想法或想要整合的插件请与本人联系;

  • 相关阅读:
    Python基础内容训练3(常用的数据类型-----列表)
    DRF的filter组件
    es6_数组新增的遍历方法
    springboot遇到的错误
    累计-同比
    马斯克这波操作赢麻了?网友:这是我们玩剩下的
    计算机毕业设计ssm校园排球联赛管理系统y513u系统+程序+源码+lw+远程部署
    js创建对象的几种设计模式
    PCL 滤波采样(二)——MLS平滑
    java计算机毕业设计计算机类在线学习管理系统MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/baidu_39265156/article/details/126249189