Skip to content

基于springboot2.x的微服务脚手架。集成redis操作,动态定时任务,mino操作,mq发布订阅,分布式主键生成,swagger、sql盲注防护、xss防护等常见功能

License

Notifications You must be signed in to change notification settings

luckhanjie/sakura-boot

 
 

Repository files navigation

微服务脚手架

技术清单

技术 版本 说明
Spring Cloud Hoxton.SR12 快速构建分布式系统的框架
Spring Cloud Alibaba 2.2.7.RELEASE 阿里巴巴快速构建分布式系统的框架
Nacos 2.0.3 发现、配置和管理微服务
Spring Boot 2.3.12.RELEASE 容器+MVC框架
MybatisPlus 3.3.2 ORM框架
Swagger-UI 3.0.0 文档生产工具
knife4j 3.0.0 基于swagger更美观好用的文档UI
RabbitMq 3.7.14 消息队列
Redis 6.0 分布式缓存
MySQL 8.0 关系型数据库
easypoi 4.2.0 文档解析工具
Druid 1.2.4 数据库连接池
Lombok 1.18.6 简化对象封装工具
fastdfs 1.26.2 分布式文件系统
flyway 5.2.4 数据库版本管理工具
hutool 5.5.7 常用工具类
uid-generator 1.0.3 百度开源的唯一id生成器,雪花算法的升级版
minio 2021-06-17 文件服务器

计划与安排

模块 集成开发进度
SpringCloud Security + Gateway + Oauth2 待集成
微服务聚合swagger 待集成
aop日志公共模块 已完成
PowerJob分布式调度 待集成
sa-token 待集成
Redis + Lua 脚本实现分布式限流 已完成
Guava RateLimiter 实现单机版限流 已完成

脚手架使用demo

sakura-boot-demo

脚手架依赖说明

root.pom

顶级pom,确定各种依赖包的版本,这样的话,子pom引入包不需要添加版本号

添加依赖

<parent>
    <artifactId>sakura-boot</artifactId>
    <groupId>com.sakura</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

sakura-cache

提供reids缓存操作

引入此依赖后,在controller层使用此模块的@RateLimiter注解可实现限流

sakura-common

公共组件

  1. 常用功能

    • 日志打印

      controller层的方法上,添加@MyLog注解,即可打印出请求的参数,方法,这个接口是否正常返回等日志信息

    • aop结合GuavaRateLimiter实现单机限流

      controller层的方法上,添加@RateLimiter注解,具体用法可参考sakura-boot-demo/UserController.java类中的方法上的注解

    • 通用异常类,如YErrorExceptionCloudException等,用法如下

      @Override
      public void saveUser(UserDTO userDTO) {
          try {
             ....
             if (result == 0) {
                     throw new YErrorException("添加用户失败!");
             }
          } catch (Exception e) {
              //未知异常,通用处理
              throw new CloudException("用户插入出错!", e);
          }
      }
    • 公共返回类

      分页结果集封装:CommonPage.restPage自定义分页处理

      公共返回:使用com.sakura.common.result.CommonResult相关API

      用法如下

      @GetMapping(value = "/users")
      public CommonResult<CommonPage<UserVO>> queryUsers() {
          IPage<UserVO> users = userService.queryUsers();
          return CommonResult.success(CommonPage.restPage(users));
      }
    • URL转码解码

      @Test
      public void testURLCodec() throws Exception {
          URLCodec codec = new URLCodec();
          String data = "http://urlCode";
          //转码
          String encode = codec.encode(data, "UTF-8");
          System.out.println("url转码后的结果:" + encode);
          //解码
          String decode = codec.decode(encode, "UTF-8");
          System.out.println("url解码后的结果:" + decode);
      }
    • 加密解密

      • Base64

        @Test
        public void testBase64() {
            System.out.println("===============base64======================");
            byte[] data = "sakura-demo".getBytes();
            Base64 base64 = new Base64();
            //转码
            String encode = base64.encodeAsString(data);
            System.out.println("base64加密后:" + encode);
            //解码
            String decode = new String(base64.decode(encode));
            System.out.println("base64解密后:" + decode);
        }
      • 使用加密工具类DigestUtils

        /**
         * DigestUtils工具类里有多种加密的方式,自行选择
         */
        @Test
        public void testDigestUtils() {
            System.out.println("===============testMD5======================");
            String result = DigestUtils.md5Hex("sakura-demo-md5");
            System.out.println("md5加密后:" + result);
        
            System.out.println("===============testsha256Hex======================");
            String sha256Hex = DigestUtils.sha256Hex("sakura-demo-sha256");
            System.out.println("sha256加密后:" + sha256Hex);
        }
    • 第三方工具类,如commons-lang3、commons-collections、commons-io、hutool、mapstruct、easypoi等

      • easypoi官方文档

         什么场景该用哪个方法

         - 导出
         1.正规excel导出 (格式简单,数据量可以,5W以内吧)
         注解方式:  ExcelExportUtil.exportExcel(ExportParams entity, Class<?> pojoClass,Collection<?> dataSet) 
         2.不定多少列,但是格式依然简单数据库不大
         自定义方式: ExcelExportUtil.exportExcel(ExportParams entity, List<ExcelExportEntity> entityList,Collection<?> dataSet)
         3.数据量大超过5W,还在100W以内
         注解方式 ExcelExportUtil.exportBigExcel(ExportParams entity, Class<?> pojoClass,IExcelExportServer server, Object queryParams)
         自定义方式: ExcelExportUtil.exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,IExcelExportServer server, Object queryParams)
         4.样式复杂,数据量尽量别大
         模板导出 ExcelExportUtil.exportExcel(TemplateExportParams params, Map<String, Object> map)
         5.一次导出多个风格不一致的sheet
         模板导出 ExcelExportUtil.exportExcel(Map<Integer, Map<String, Object>> map,TemplateExportParams params) 
         6.一个模板但是要导出非常多份
         模板导出 ExcelExportUtil.exportExcelClone(Map<Integer, List<Map<String, Object>>> map,TemplateExportParams params)
         7.模板无法满足你的自定义,试试html
         自己构造html,然后我给你转成excel  ExcelXorHtmlUtil.htmlToExcel(String html, ExcelType type)
         8.数据量过百万级了.放弃excel吧,csv导出
         注解方式: CsvExportUtil.exportCsv(CsvExportParams params, Class<?> pojoClass, OutputStream outputStream)
         自定义方式: CsvExportUtil.exportCsv(CsvExportParams params, List<ExcelExportEntity> entityList, OutputStream outputStream) 
         9.word导出
         模板导出: WordExportUtil.exportWord07(String url, Map<String, Object> map)
        
         - 导入 
         如果想提高性能 ImportParams 的concurrentTask 可以帮助并发导入,仅单行,最小1000
         excel有单个的那种特殊读取,readSingleCell 参数可以支持
         1. 不需要检验,数据量不大(5W以内)
         注解或者MAP: ExcelImportUtil.importExcel(File file, Class<?> pojoClass, ImportParams params)
         2. 需要导入,数据量不大
         注解或者MAP: ExcelImportUtil.importExcelMore(InputStream inputstream, Class<?> pojoClass, ImportParams params)
         3. 数据量大了,或者你有特别多的导入操作,内存比较少,仅支持单行
         SAX方式  ExcelImportUtil.importExcelBySax(InputStream inputstream, Class<?> pojoClass, ImportParams params, IReadHandler handler)
         4. 数据量超过EXCEL限制,CSV读取
         小数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params)
         大数据量: CsvImportUtil.importCsv(InputStream inputstream, Class<?> pojoClass,CsvImportParams params, IReadHandler readHandler)
        

sakura-web

web相关,sql盲注处理,MybatisPlus配置,动态修改日志等级接口,swagger+knife4j配置

sakura-db

数据库相关依赖,mysql连接依赖、MybatisPlus依赖、jpa依赖

  • MybatisPlus分页配置,扫描mapper文件的包路径为com.sakura.cloud.**.mapper*

    包扫描路径修改:MybatisPlusConfig.java

sakura-ms

集成了nacos,openfeign、gateway微服务组件

  • feign客户端(注意:使用时,需要在启动类上添加@EnableFeignClients注解)

sakura-mq

通用消息发布、订阅工具

此模块需要新建消息内容和消息记录两张表,使用时引入sakura-flyway模块进行初始化,

建表sql脚本为V1_1__init_20210510.sql

sakura-flyway

初始化数据库,支持数据库脚本的版本管理

flyway初始化数据库,需要引入数据库驱动以及数据源依赖,配合sakura-db模块一起

引入即可

  1. Flyway知识

    • Flyway 默认会去读取 classpath:db/migration,可以通过 spring.flyway.locations 去指定自定义路径,多个路径使用半角英文逗号分隔,内部资源使用 classpath:,外部资源使用 file:

    • 如果项目初期没有数据库文件,但是又引用了 Flyway,那么在项目启动的时候,Flyway 会去检查是否存在 SQL 文件,此时你需要将这个检查关闭,spring.flyway.check-location = false

    • Flyway 会在项目初次启动的时候创建一张名为 flyway_schema_history 的表,在这张表里记录数据库脚本执行的历史记录,当然,你可以通过 spring.flyway.table 去修改这个值

    • Flyway 执行的 SQL 脚本必须遵循一种命名规则,V<VERSION>__<NAME>.sql 首先是 V ,然后是版本号,如果版本号有多个数字,使用_分隔,比如1_01_1,版本号的后面是 2 个下划线,最后是 SQL 脚本的名称。

      这里需要注意:V 开头的只会执行一次,下次项目启动不会执行,也不可以修改原始文件,否则项目启动会报错,如果需要对 V 开头的脚本做修改,需要清空flyway_schema_history表,如果有个 SQL 脚本需要在每次启动的时候都执行,那么将 V 改为 R 开头即可

    • Flyway 默认情况下会去清空原始库,再重新执行 SQL 脚本,这在生产环境下是不可取的,因此需要将这个配置关闭,spring.flyway.clean-disabled = true

sakura-file-util

集成了fastdfs文件上传下载工具类

sakura-uid-generator

百度的开源分布式ID生成器

baidu/uid-generator: UniqueID generator (github.com)

使用此模块生成分布式id,需要先建一张记录表,每次重启项目都会生成一条记录

建表sql脚本:初始化脚本.sql

sukura-minio

集成了minio文件上传工具类

sukura-cron

动态定时器配置

使用此模块,需要初始化一张任务记录表,记录任务的开启状态,cron表达式等等

建表sql脚本:初始化脚本.sql

About

基于springboot2.x的微服务脚手架。集成redis操作,动态定时任务,mino操作,mq发布订阅,分布式主键生成,swagger、sql盲注防护、xss防护等常见功能

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 99.4%
  • Lua 0.6%