# treasure **Repository Path**: xxsoftware/treasure ## Basic Information - **Project Name**: treasure - **Description**: treasure - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 75 - **Created**: 2023-07-20 - **Last Updated**: 2023-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

2020-05-05~至今

## 1 初衷 积累,成长 ## 2 分支规划 + `master` 微服务架构 业务场景模拟,学习案例 + `study` 单体架构、学习案例 + `scene` 单体架构、最佳实践、插件化、模块化、配置化 ## 3 简介 `Treasure`是一个`Java`技术生态项目 + 开源可免费商用 + 为兴趣而开源为、学习而开源、为技术而开源 + 学习成长过程中一些技术点、整合工作中积累的一些心得 + 面试中一些业务场景模拟及解决方案一些常见、通用业务的解决方案 + 合理应用设计模式进行一些业务代码的重构优化 + 常用小轮子的积累、一些更优雅的编码实现 + 常用、通用业务场景starter封装、日常使用自研小工具(同步更新阿里云制品仓库) ## 4 模块 ### 4.1 scene分支 ~~~ com.dingwen ├── scene // 综合场景启动器使用示例 │ └── pom.xml // Maven依赖 ├── starter // 启动器集 │ └── logv-spring-boot-starter // 依赖管理模块 │ └── logv-spring-boot-starter // 日志文件查看启动器 │ └── enums-spring-boot-starter // 枚举场景启动器 │ └── screw-spring-boot-starter // 数据库文档生成场景启动器 │ └── api-docs-spring-boot-starter // API文档再封装场景启动器 │ └── dic-spring-boot-starter // 字典场景启动器 │ └── config-spring-boot-starter // 系统配置场景启动器 │ └── webplus-spring-boot-starter // Web再封装场景启动器 │ └── quartz-spring-boot-starter // Quartz定时任务场景启动器 │ └── file-spring-boot-starter // 文件场景启动器 │ └── // Mongodb场景启动器 │ └── // 数据脱敏场景启动器 │ └── // JWT场景启动器 │ └── // Security场景启动器 │ └── // XXLJOB场景启动器 │ └── // 文件预览场景启动器 │ └── // 监控场景启动器 │ └── // 审核场景启动器 │ └── // ... ├── pom.xml // Maven依赖 ~~~ ### 4.2 study分支 ~~~ com.dingwen ├── treasure-canal-client // canal客户端 [80] ├── treasure-kettle // kettle集成企业级解决方案 [9999] ├── treasure-websocket // websocket方案 [8081] [8080] ├── treasure-sms4j // 通用短信解决方案 [8080] ├── pom.xml // Maven依赖 ~~~ ### 4.3 master分支 ~~~ com.cdn com.dingwen ├── treasure-auth // 认证服务 [20902] ├── treasure-business // 业务服务 [20903] ├── treasure-admin // 监控服务 [20901] ├── treasure-common // 通用模块 │ └── common-pom // 依赖管理模块 │ └── common-base // 基础模块 │ └── common-beansearcher // 对象搜索 │ └── common-config // 基础配置 │ └── common-core // 核心模块 │ └── common-jpa // 持久层JPA │ └── common-jwt // JWT令牌 │ └── common-knifej // 接口文档 │ └── common-model // 通用MODEL │ └── common-mongodb // MongoDB │ └── common-mybatisplus // 持久层Mybatisplus │ └── common-rabbitmq // RabbitMQ │ └── common-redis // Redis │ └── common-security // 安全模块 │ └── common-sensitive // 自定义注解实现数据脱敏 │ └── common-web // WEB模块 │ └── common-tkmybatis // tkmybatis模块 │ └── common-minio // minio文件存储 │ └── common-easyexcel // excel 文件导入导出 │ └── common-influxdb // 时序数据库案例 │ └── common-open-api // open api 案例 │ └── open-api-baidu-map // 百度地图 │ └── open-api-sms // 阿里云短信 │ └── open-api-tx // 天行数据基础服务 │ └── open-api-wechat-pub // 微信公众号 │ └── open-api-baidu-map // 百度地图 │ └── open-api-tianxing-rainbow // 天行数据彩虹屁 ├── treasure-gateway // 网关服务 [20904] ├── treasure-log // 日志服务 [20905] ├── treasure-manage // 后台管理 [20906] ├── treasure-file-generate // 文件生成服务 [20907] ├── treasure-task-quartz // 定时任务(Quarzt实现) [20908] ├── treasure-file // 文件服务 [20909] ├── treasure-code-generate // 代码生成服务 [20910] ├── treasure-slow-sql // 慢SQL [20911] ├── logs // 日志 ├── sql // sql ├── img // 图片 ├── pom.xml // 公共依赖 ~~~ ## 5 架构图 > 参考若依 ![若依架构图](./img/若依架构图.png) ## 6 概览
### 6.1 API文档 [在线文档](https://www.apifox.cn/apidoc/shared-2d9191fd-dfd4-45a3-bc29-57500b3a5f1b) ## 7 技术点 | | | | | | | | | | | |-----------|---------------------|------------|-----------------|--------------|-----------|---------|-----|-----|------------------| | Redis | Mysql | MongoDB | Canal | | | | | | Alibaba Druid | | Spring | SpringMVC | SpringBoot | Spring Security | | | | | | SpringBoot Admin | | Mybatis | MybatisPlus | TK Mybatis | | | | | | | JPA | | Mapstruct | MapstructPlus | Hutool | Screw | BeanSearcher | EasyExcel | knife4j | | | p6spy | | | | | | | | | | | Maven | | | | | | | | | | | Quartz | | Nacos | SpringCloud Alibaba | GateWay | Feign | Hystrix | | | | | Ribbon | | RabbitMQ | RocketMQ | | | | | | | | Kafka | | | | | | | | | | | ELK | | Thymeleaf | | | | | | | | | Layui | | Minio | | | | | | | | | JWT | ## 8 核心Starter封装 > Maven增加一下配置即可 ```xml rdc-releases 62c3e2f6a908b6a4db54fa26 5V8N7KJ]rvtt rdc-snapshots 62c3e2f6a908b6a4db54fa26 5V8N7KJ]rvtt mirror central,jcenter,!rdc-releases,!rdc-snapshots mirror https://maven.aliyun.com/nexus/content/groups/public rdc rdc-releases::default::https://packages.aliyun.com/maven/repository/2380560-release-WXL1gl/ rdc-snapshots::default::https://packages.aliyun.com/maven/repository/2380560-snapshot-vKCASA/ rdc ``` ### 8.1 日志文件查看启动器 > 基于Websocket、SpringBoot2.x、layui实现的可配置的Web版日志查看器 #### 8.1.1 核心功能 + 可选基础目录生成文件树 + 日志文件编码配置化 + 追加新日志自动滚动 #### 8.1.2 优化点 + 日志查看页增加文件下载 + 文件树按照创建时间降序 + 大量的日志输出导致内存飙升 + 大量的客户端链接导致CPU飙高 + UI美化 + 异常提示完善 #### 8.1.3 使用 ##### 8.1.3.1 引入依赖 ```xml com.dingwen logv-spring-boot-starter 1.0.0-SNAPSHOT ``` ##### 8.1.3.2 启动项配置 > 配置表扫描 ```java @SpringBootApplication(scanBasePackages = "com.dingwen") ``` > 配置接口文档放行、线程池、监控项 ```yml dingwen: treasure: # webplus webplus: debug: true handlers: - handler: "doc.html" locations: "classpath:/META-INF/resources/" - handler: "swagger-ui.html" locations: "classpath:/META-INF/resources/" - handler: "/webjars/**" locations: "classpath:/META-INF/resources/webjars/" # async async: logPrint: true pool: - core: 8 max: 16 keepAliveTime: 60 queueCapacity: 2000 poolNamePrefix: treasure-async- poolBeanName: logvExecutor poolPolicy: CallerRunsPolicy # 监控项 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always shutdown: enabled: true ``` #### 8.1.3 访问地址 > 默认启动端口: `2023` + [首页](http://127.0.0.1:2023/common/logv/manager.html) + [接口文档](http://127.0.0.1:2023/doc.htm) #### 8.1.4 概览
### 8.2 高效的通用枚举处理启动器 > 从前端到服务乃至数据库到枚举解决方案,零代码,开箱即用 > 已加缓存,速度杆杆滴 #### 8.2.1 主要功能 + 统一枚举实现 + 统一枚举响应 + 统一枚举MVC转换 + 统一枚举序列化 + 统一枚举反序列化 + 统一枚举接口实现 + 获取所有枚举时支持分页 + 统一异常处理 #### 8.2.3 内置接口 + 获取服务端所有枚举 `/common/enums` + 分页查询枚举 `/common/enums/page` + 指定枚举类全路径查询执行枚举 `/common/enums/{enumClassName}` ### 8.2.4 使用 > 枚举持久化依赖各自持久层实现。 > MybatisPlus 3.5.2后版本只需要在实体类中存储数据库值的字段标注 > `@EnumValue`即可 #### 8.2.5 引入依赖 ```xml com.dingwen enums-spring-boot-starter 1.0.0-SNAPSHOT ``` #### 8.2.6 创建自己到枚举 ```java package com.dingwen.treasure.mybatisplus.enums; import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.AllArgsConstructor; import lombok.Getter; import com.dingwen.treasure.enums.core.IBaseEnum; /** *  逻辑删除 *  @author dingwen *  @date 2022/6/14 */ @Getter @AllArgsConstructor public enum LogicDelete implements IBaseEnum { /** * 已删除 */ DELETED(0, "删除"), /** *存在 */ EXISTED(1, "存在"); /** * 状态值 */ @EnumValue private final Integer code; /** * 状态描述 */ private final String desc; } ``` #### 8.2.7 配置项 ```yml dingwen: treasure: # enums enums: # 枚举类扫描包 packagepath: "com.dingwen" # 枚举类所在类路径 classpath: "/**/*.class" ``` #### 8.2.8 注意点 > IBaseEnum中已提供枚举比较方法以及转换方法可直接使用 #### 8.2.9 概览
### 8.3 数据库文档生成启动器 > 基于Screw、Freemarker实现的支持word,markdown,html文件生成的数据库文档生器 #### 8.3.1 核心功能 + 包含可配置的详细注释生成 + 表名称,前缀,后缀等细粒度可配置化 + 文档名称,标题可配置化 + 同时支持work,markdown,html版本数据库设计文档 #### 8.3.3 使用 ##### 8.3.3.1 引入依赖 ```xml com.dingwen screw-spring-boot-starter 1.0.0-SNAPSHOT ``` ##### 8.3.3.2 启动项配置 > 配置表扫描 ```java @SpringBootApplication(scanBasePackages = "com.dingwen") ``` > 配置文档参数 ```yml dingwen: treasure: # 数据库文档生成 screw: # 数据源连接地址 jdbcUrl: ${spring.datasource.dynamic.datasource.master.url} # 数据源用户名 username: ${spring.datasource.dynamic.datasource.master.username} # 数据源连接密码 password: ${spring.datasource.dynamic.datasource.master.password} # 驱动类名称 driverClassName: ${spring.datasource.dynamic.datasource.master.driver-class-name} # 是否读取表注释信息 tableRemark: true # 文档版本号 docVersion: 1.0.0 # 文件输出目录 fileOutputDir: @project.name@/src/main/resources/static ``` #### 8.3.3 访问地址 + [首页](http://127.0.0.1:8080/treasure_doc_1.0.0.html) #### 8.3.4 概览
## 9 核心服务 ### 9.1 treasure-business > 业务场景模拟,最佳实践 + RabbitMQ保证顺序、可靠投递、可靠消费`MessageController` + 执行次数、耗时优化工具`MarketingController` + JavaScript动态规则校验`JavaScriptController` + 基于Redis实现接口限流`RateLimiterController` + 多线程异步多任务进度条`ProgressBarTaskController` + 行政区划截取替代优化实现`AreaUtilController` + 自定义线程池、异步任务`AsyncController` + 批量插入方案优化对比`BatchSaveController` + `CompletableFuture`案例`CompletableFutureController` + 后台跨域处理方式一`CorsController` + Validate自定义注解进行个性化规则校验 `CustomValidateController` + 自定义注解实现数据脱敏`DesensitizationController` + jackson反序列化自定义对象`DeserializerController` + 自定义注解动态查询数据库进行字典翻译`DictionaryController` + 自定义注解实现通用缓存逻辑 `EasyCacheController` + 枚举类型序列化和反序列化 `EnumConvertController` + 全局异常处理 `ExceptionController` + 国际化 `LocaleController` + 设计模式-状态模式案例(活动营销状态流转)`MarketingController` + Mybatis-PLus 案例 `MybatisPlusController` + 自定义注解实现操作日志记录 `OperationLogRecordController` + 设计模式-观察者模式案例-创建订单`OrderController` + 异步短信,请求削峰 `OweFeeController` + 设计模式-简单工厂+模版方法+策略模式+函数式接口`PayController` + 自定义注解实现防止重复提交`ReSubmitController` + Redis`setnx`版分布式锁案例 + `ResponseBodyAdvice`实现统一返回 `ResponseBodyAdviceController` + 开放接口对接-短信 `SmsController` + `feign`调用案例`TaskFeignController` + 设计模式-责任链-任务生成案例`TaskGenerateController` + 后端枚举类型统一翻译 `EnumController` + 自定义注解实现加解密、脱敏 `SensitiveController` + 微信公众号定制消息推送`WechatPubController` #### 9.1.1 RabbitMQ全链路顺序、可靠消费,100%不丢失 > API入口:`MessageController` + 生产者进行可靠性消息投递 + 消费者手动确认 + 消息落库(状态管理、消费顺序控制) + 定时任务补偿 ##### 9.1.1.1 流程图 ![顺序可靠消息主流程](./img/顺序可靠消息主流程.png) #### 9.1.2优化工具类 > 参考Spring StopWatch 的拓展优化,精确计算执行耗时,执行次数,方便进行优化 > `OptimizeUtilController` ```java /** *  OptimizeUtilController: 优化工具测试 *  @author dingwen *  @date 2022/8/28 */ @Api(tags = "优化工具API") @RestController @Slf4j @RequestMapping("optimize") @RequiredArgsConstructor public class OptimizeUtilController { @ApiOperation(value = "API使用测试") @GetMapping public void test() { optimizeApi(); } @SneakyThrows(Throwable.class) private void optimizeApi() { OptimizeUtil.start("任务1"); TimeUnit.SECONDS.sleep(1); OptimizeUtil.stop("任务1"); for (int i = 0; i < 100; i++) { OptimizeUtil.start("任务2"); for (int j = 0; j < 1000; j++) { OptimizeUtil.start("任务2-1"); OptimizeUtil.stop("任务2-1"); } OptimizeUtil.stop("任务2"); } OptimizeUtil.print("任务2"); OptimizeUtil.print(); } } ``` ![优化工具类](./img/OptimizeUtil.png) #### 9.1.3 复杂规则校验 > Redis + JVM 双缓存 ```js // 测试js function add(op1, op2) { return op1 + op2 } add(a, b) ``` ##### 9.1.3.1 整体思路、功能点 ![JavaScript规则业务思路](./img/JavaScript规则业务思路.png) > 通过Java调用JavaScript进行规则校验,实现复杂且灵活可配置的规则校验功能`JavaScriptController` + 服务启动即进行规则缓存、脚本预编译 + 多线程进行规则校验 + 异步、实时返回结果 + 灵活配置的特定业务特定规则 ##### 9.1.3.2 表结构 ###### 9.1.3.2.1 业务规则校验配置表(business_rule) | | | | | |------------------|----------|-----|-------------------------------------| | 名称 | 类型 | 长度 | 备注 | | rule_id | bigint | | 主键自增雪花id | | rule_name | varchar | 100 | 校验规则名称 | | rule_description | varchar | 200 | 规则描述 | | rule_state | smallint | | 规则状态:0禁用 1启用 | | rule_content | varchar | 255 | 规则内容(JavaScript) | | field_name | varchar | 255 | 校验字段名称(所需要多个字段逗号分隔) | | rule_code | varchar | 100 | 规则Code(保留字段) | | rule_type | smallint | | 规则类型:0必填 1长度 2必填+长度 3敏感词 4正则 | | business_id | bigint | | 业务Id | | create_time | datetime | | 创建时间(由MybatisPlus自动填充) | | update_time | datetime | | 修改时间(由MybatisPlus自动填充) | | deleted | smallint | | 逻辑删除标识,1:存在,2:已删除 | | version | smallint | | 版本号(乐观锁) | | create_by | varchar | 100 | 创建者(也可基于Security、MybatisPlus实现自动填充) | | update_by | varchar | 100 | 更新者(也可基于Security、MybatisPlus实现自动填充) | | remark | varchar | 255 | 备注(保留字段) | #### 9.1.4 Redis限流 > 基于`setnx`,通过自定义注解+脚本实现限流(参考若依实现) + 指定key + 凭借key + 基于方法 + 基于IP + 指定时间、次数 ```java /** * redis限流实现API * * @author dingwen * @date 2022/11/17 */ @Api(tags = "redis限流实现API") @RestController @RequestMapping("redis") public class RateLimiterController { @ApiOperation("redis限流测试") @RateLimiter(time = 1, count = 2) @GetMapping("/rate") public Result rateLimiterSimpleTest() { return ResultGenerator.genSuccessResult(); } } ``` #### 9.1.5 多线程任务进度条实现 > 基于`CompletableFuture`和`redis`的多线程任务进度条实现,后端异步进行任务,前端轮询调用进度条进度查询 > + `redis` > + `setnx` 检查任务key是否存在,任务是否在进行中 > + `hash` 存储任务进度信息 > + 指定哈希键值的`increment` > + `CompletableFuture` > + `whenComplete` 子任务完成时更新任务进度 > + `exceptionally` 发生异常时更新任务进度 > + `AbstractProgressBarTask` 抽象任务进度条组件,囊括进度条功能,子类继承实现业务逻辑即可 ##### 9.1.5.1 API调用 ```java /** * 进度条任务API * * @author dingwen * @date 2022/12/07 */ @Api(tags = "进度条任务API") @RestController @RequestMapping("bar") public class ProgressBarTaskController { @Resource(name = "testProgressBarTask") private TestProgressBarTask testProgressBarTask; @ApiOperation(value = "提交进度条任务") @ApiImplicitParams({ @ApiImplicitParam(name = "taskId", value = "任务id"), @ApiImplicitParam(name = "taskType", value = "任务类型") }) @PutMapping() public Result submit(@RequestParam("taskId") String taskId, @RequestParam("taskType") String taskType) { TaskType taskTypeByCode = EnumUtil.getEnumByCode(TaskType.class, taskType); return ResultGenerator.genSuccessResult( testProgressBarTask.execute( taskId, taskTypeByCode, 100, 100 ) ); } @ApiOperation(value = "查询任务进度") @ApiImplicitParams({ @ApiImplicitParam(name = "taskId", value = "任务id"), @ApiImplicitParam(name = "taskType", value = "任务类型") }) @GetMapping("/{taskId}") public Result queryProgress(@PathVariable("taskId") String taskId, @RequestParam("taskType") String taskType) { TaskType taskTypeByCode = EnumUtil.getEnumByCode(TaskType.class, taskType); return ResultGenerator.genSuccessResult(testProgressBarTask.queryProcess(taskId, taskTypeByCode)); } } ``` ##### 9.1.5.2 功能概览
#### 9.1.6 自定义注解实现加解密、脱敏 `SensitiveController` + 枚举类`SensitiveEnum` + 实体 `SensitiveEntity` + 自定义注解 + SensitiveDecode 解密 + SensitiveEncode 加密 + SensitiveField 字段标识 + SensitiveInfoUtil 加解密、脱敏工具类 + AesEncryptUtil AES工具类 ##### 9.1.6.1 功能概览
#### 9.1.7 阿里云短信对接 `SmsController` ##### 9.1.7.1 功能概览
#### 9.1.8 微信公众号定制消息推送`WechatPubController` > 开放平台对接(基于Spring提供定时任务实现): > + 天行数据 > + 百度地图 > + 微信公众号平台
#### 9.1.9 common-influxdb > 时序数据库案例 > + [官网](https://docs.influxdata.com/) > + 接口 `IotDataService`
### 9.2 treasure-slow-sql #### 9.2.1 深分页查询优化 ```sql SELECT * FROM sys_user WHERE id > #{offset} LIMIT 0,#{pageSize}; ``` ```java /** *  优化Api *  @author dingwen *  @date 2022/8/5 */ @Api(tags = "优化API") @RestController @Slf4j @RequestMapping("optimize") @Validated public class OptimizeController { @Resource private SysUserService userService; /** * 适用于自增id * 数据总条数:4301000
*

自带查询分页性能:

*
    *
  • 第 1 页 10 条关闭count查询优化耗时:4秒
  • *
  • 第 100,00 页 100 条关闭count查询优化耗时:5秒
  • *
  • 第 100,000 页 100 条关闭count查询优化耗时:5秒
  • * *
  • 第 1 页 10 条打开count查询优化耗时:4秒
  • *
  • 第 100,00 页 100 条打开count查询优化耗时:4秒
  • *
  • 第 100,000 页 100 条打开count查询优化耗时:4秒
  • *
* *

优化后性能:

*
    *
  • 第 1 页 10 条耗时:30~80毫秒
  • *
  • 第 100,00 页 100 条耗时:30~80毫秒
  • *
  • 第 100,000 页 100 条耗时:30~80秒
  • *
* * 再进行统计总记录条数时会遇到瓶颈,正确的处理方式应该是杜绝深分页,不会有用户往下翻到地100页 * 一般选择50页即可 * * @param pageDto 页面dto */ @PostMapping("/deep-page") @ApiOperation("深分页查询优化") public Result> deepPage(@RequestBody PageDto pageDto) { Long current = pageDto.getCurrent(); Long pageSize = pageDto.getPageSize(); Page page = new Page<>(current, pageSize); // 可以选择关闭count查询优化,解决一对多时分页查询总计记录条数不正确问题 page.setOptimizeCountSql(Boolean.TRUE); //return ResultUtil.genResult(userService.page(page)); return ResultGenerator.genSuccessResult(userService.optimizeSelectPage(current, pageSize)); } } ``` ### 9.3 treasure-kettle > 企业级的数据中台ETL处理服务,提供数据的定时抽取、转换、加载整体解决方案 #### 9.3.1 下载安装 > 官网:http://community.pentaho.com/projects/data-integration > Carte接口文档:https://help.hitachivantara.com/Documentation #### 9.3.2 组成部分 + spoon > window客户端设计器。windows平台可以直接使用官方程序,linux or mac os 平台建议使用网页版本的spoon + pan:执行转换(命令行方式+操作系统定时任务) + kitchen: (命令行方式+操作系统定时任务) + carte: kettle服务,rest接口提供服务(支持主从) #### 9.3.3 资源库 + 文件资源库 + 数据库资源库: 创建数据库,使用`spoon`配置连接后可自动创建表结构,共计46张表 ![kettle数据库资源库](./img/kettle数据库资源库.png) #### 9.3.4 方案思路 > Java集成定时远程调用和远程服务方式调用以及使用`spoon`客户端进行远程调用需要启动`carte`。 > carte.sh指定配置文件启动,单机考虑一主一从。默认用户密码(cluster),可在启动文件中配置 ##### 9.3.4.1Java集成定时远程调用 > 远程调用执行 > + id: master ip > + port: master port > + dataRepositoryName: 数据库资源库名称 > + user: 集群名称(master中配置) > + password: 集群密码(master中配置) > + transName: 转换文件名称 > + jobName: 作业文件名称 > + path: 路径 ```shell # 转换执行 https://{ip}:{port}/kettle/executeTrans/?rep={dataRepositoryName}&user={userName}&pass={password}&trans={path/transName.ktr} # 作业执行 https://{ip}:{port}/kettle/executeJob/?rep={dataRepositoryName}&user={userName}&pass={password}&job={path/jobName.kjb} # 查看状态监控 https://{ip}:{port}/kettle/status ``` ##### 9.3.4.2 远程服务方式调用 > 依赖于`carte`服务,可以采用`spoon`客户端触发远程作业,进行定时调用。(无需代码,配置即可实现) ##### 9.3.4.3 spoon 客户端 > windows平台可以直接使用官方程序,linux or mac os 平台建议使用网页版本的spoon ```shell docker search hiromuhota/webspoon docker run -d -p 8080:8080 --name spoon hiromuhota/webspoon ``` ![spoon-web](./img/spoon-web.png) #### 9.3.5 其他 ##### 9.3.5.1 Kettle自带监控页面 ![Kettle监控页任务列表](./img/Kettle监控页任务列表.png) ![Kettle监控页任务日志](./img/Kettle监控页任务日志.png) ##### 9.3.5.2 SpringBoot2.X和Kettle9整合 ```shell # 手动添加如下依赖 mvn install:install-file -DgroupId=组织名称 -DartifactId=坐标 -Dversion=9.3.0.0-428 -Dpackaging=jar -Dfile= jar包名称 ``` ### 9.4 treasure-task-quartz #### 9.4.1 整体介绍 > 基于`quartz` > 的定时任务实现,API灵活控制,精确日志记录,分布式部署完整的解决方案。注意:当次解决方案在分布式应用场景中时,确保任务不重复执行依赖与`quartz` > 持久化到数据库依赖数据库悲观锁实现。 #### 9.4.2 特点 > + 分布式部署保障不重复执行不漏跑 > + 模版方法:代码可重用性 > + 实时接口调用控制任务执行、停止 > + 接口调用修改任务信息 > + 执行日志记录 #### 9.4.3 表设计 + `QRTZ_BLOB_TRIGGERS` + `QRTZ_CALENDARS` + `QRTZ_CRON_TRIGGERS` + `QRTZ_FIRED_TRIGGERS` + `QRTZ_JOB_DETAILS` + `QRTZ_LOCKS` + `QRTZ_PAUSED_TRIGGER_GRPS` + `QRTZ_SCHEDULER_STATE` + `QRTZ_SIMPLE_TRIGGERS` + `QRTZ_SIMPROP_TRIGGERS` + `QRTZ_TRIGGERS` ##### 9.4.3.1 定时任务信息表`quartz_info` | 名称 | 类型 | 长度 | 备注 | |--------------------|----------|-----|-------------------| | id | bigint | | 数据库自雪花id | | code | varchar | 255 | 定时任务code标识 | | create_time | datetime | | 创建时间 | | cron_expression | varchar | 255 | cron表达式 | | fail | int | | 失败次数 | | full_class_name | varchar | 255 | 定时任务执行类 全类名,Job类 | | job_data_map | varchar | 255 | jobDataMap json格式 | | job_group_name | varchar | 255 | job组名称 | | job_name | varchar | 255 | job 名称 | | name | varchar | 255 | 定时任务名称 | | state | int | | 是否启用 1-启用 0-禁用 | | success | int | | 成功执行次数 | | trigger_group_name | varchar | 255 | 触发器组名称 | | trigger_name | varchar | 255 | 触发器名称 | | update_time | datetime | | 更新时间 | ##### 9.4.3.2 定时任务日志表 `quartz_log` | 名称 | 类型 | 长度 | 备注 | |----------------|----------|-----|---------------------------| | id | bigint | | 数据库自雪花id | | quartz_id | bigint | | 任务id关联 | | activate_time | datetime | | 激活时间 | | consumer_time | int | | 任务耗时 | | execute_result | int | | 执行结果:
1: 成功
0: 失败 | | remark | varchar | 255 | 备注 | ### 9.5 treasure-manage > 常用后台管理实现 ### 9.6 treasure-common > 公共模块 > + base: 基础、通用 > + config: 配置 > + core:核心通用组件 > + jpa:jpa场景 > + mybatisplus mybatisplus场景 > + web: web场景 > + knife4j: API文档 > + rabbitmq: RabbitMQ 应用场景 > + redis: Redis 应用场景 ### 9.7 treasure-admin > 基于`SpringBoot Admin`整合`Spring Security`的监控实现,目前暴露所有端点,权限账户信息通过`nacos`配置指定 ```yaml spring: security: user: name: actuator password: actuator ``` > TODO > + 自定义info、metrics、health、endpoint > + 邮件、钉钉预警 ### 9.8 其他临时文档 + business > 优雅代码业务组件实现(MybatisPlus) > 特色业务场景 > + 线程池案例 > + 批量save > + 自定义MVC反序列化方式 > + 缓存业务场景自定义注解:@EasyCache > + 国际化 > + 状态模式+简单工厂模式实现:多阶段灵活控制状态流转 设计模式六大原则: + 单一职责 + 接口隔离(Servlet filter) + 依赖倒置 + 迪米特(最少知道原则) + 里氏替换 (父类抽象方法应保持行为一致,非抽象方法不应去重写) + 开闭原则 + 合成复用 + 状态模式: 对象不同的状态导致不同的行为 + 主要角色: + 抽象状态(接口或抽象类) + 具体状态(抽象状态的子类或实现类) + 环境类 (状态持有着,依据不同的状态出发不同的行为) ![状态模式案例UML类图](./img/状态模式案例UML类图.jpg) > + MybatisPlus:乐观锁、逻辑删除、自动枚举转换、多数据源、Model、自动填充、分页等其他通用API > + 观察者模式:(事件对象、监听)下订单走库存以及日志,以事件驱动 > + 支付案例:简单工厂 + 模版方法 + 策略模式 + 函数式接口 ![支付案例UML](./img/支付案例UML.png) + 责任链模式:为请求创建了一个接收者对象的处理链,,对请求的发送者和接收者进行解耦 ![责任链模式调用图](./img/责任链模式调用逻辑图.jpg) ![责任链模式UML类图](./img/责任链模式UML类图.png) > + 基于redis、redisson的分布式锁 > + 防止重复提交自定义注解:@ReSubmit > + (解决数据库和缓存不一致的问题)系统配置:db、redis、自定义缓存(利用redis发布订阅实现三级缓存) > + 基于Mybatis的通用crudController封装已经整合API文档 > + 全局统一返回 > + 全局异常处理 > + 优雅DTO、VO、BO、PO转换 > + feign调用(整合hystrix实现服务降级) > + 系统配置实现(三级分布式缓存)redis 发布订阅实现跨内存刷新 > + AOP 切面实现方法调用前后入参、返回值、耗时等调试日志(全局所有controller)、基于配置灵活开启关闭 > + 消息队列业务模拟(保证顺序消费、保证不重复消费、消息可靠投递、消息可靠消费) > + 操作日志(AOP+Sprint EL 实现同步ElasticSearch)参考美团2021年技术年报实现、基于配置灵活开启关闭 > TODO > + redisson 分布式锁 > + 规范转换Bean mapstruct > + 基于JPA的通用crudController封装 > + 通用crudController封装 mongoDB + gateway > 网关,基于`nacos`的可配置白名单 > TODO > + 统一请求日志 > + 认证 > + 服务间其他信息 + pdf > 基于`freemarker`模版实现的后端生成PDF或在线预览功能 + manage > 后台管理模块 > 特色业务场景 > + 消息队列业务模拟(顺序消费、不重复消费、可靠消费) 死信队列、延时队列 + auth > 认证模块 > TODO > + 权限 > + RBAC > + 参考若依实现 > + 菜单、路由 > TODO > + 文件上传minio + API文档 + knife4j + business-service: 地址:http://127.0.0.1:20908/doc.html + task-service: 地址:http://127.0.0.1:20902/doc.html + 用户名:`test` + 密码:`123` + 监控面板 + spring-boot-admin、spring-boot-starter-security + 地址:http://127.0.0.1:20906/login + 用户名:`actuator` + 密码:`actuator` + 国际化 + 监控 + 定时任务 + API文档 + Aop + ReSubmit(防止重复提交) + EasyCache (缓存) + 通用业务组件 + 简单工厂 + 策略模式 + 模版方法 + Spring 高级 + 观察者模式(监听、事件机制) + 自动注入Map + 监控自定义 预警(钉钉、邮件) + Mybatis Plus + 多数据源 + 逻辑删除 + 乐观锁 + Model + lambda + 通用枚举 + 联合主键`@MppMultiId`、`IMppService`、`MppBaseMapper` + 自动填充新增时间、修改时间 + Mysql + 枚举类型 + Json 类型 + 分布式锁 + 分布式事务 + Sentinel + 链路追踪 + 定时任务 Quartz + 设计模式:模版方法 + Jpa 实现 + 基于数据库悲观锁实现分布式锁,支持多节点部署 + 保证不重复执行 + 保证不漏执行 + Rabbitmq + 可靠消费 + 可靠投递 + 顺序消费 + 全局异常处理 + 权限 > 参考若依实现 + SSO + 系统配置 + 通用日志 + 操作日志 + 系统日志 > 参考美团技术年报、若依。初步实现思路:Aop及Spring EL 表达式实现日志数据组装,通过RabbitMq将数据同步到ElasticSearch + MongoDB + WebFlux + canal + 依赖优化 + 规范转换Bean mapstruct + 全局异常 + 权限(market、ruoyi) + 系统配置 + Redis 实现分布式锁 + 状态模式 + 状态直接可以存在相互依赖关系 + 状态之间可以相互转换,可以反复 + 策略模式 + 多种算法行为选择一个就能满足 + 算法独立 + 自定义MVC反序列化进行Java Bean 数据封装 + 文件存储 + 短信 + spring 批处理 batch + 网关统一日志 + 统一系统配置 > redis & JVM 两级缓存,使用 redis 发布订阅实现,支持分布式 + JDBC 批处理 + DTO、VO、BO 转换 + 定时任务BUG + @EnableAspectJAutoProxy > 在SpringBoot2已经无效,需要通过,`spring.aop.proxy-target-class=false` > 指定为JDK方式实现,默认值为true,即采用CGLIB实现 + TODO + 分布式定时任务框架 xxl_job + 分布式事务 + 分布式锁 + 并发编程 + SQL优化 + 脚本 + 容器化 + ELK + 日志配置 + 启动初始化 + `ApplicationRunner` + `CommandLineRunner` + http://127.0.0.1:20900 网关 + 分布式文件存储 minio + 调试日志(入参、返回值、耗时)es + 后端渲染生产PDF (freemarker) + mybatis 场景整合 (动态标签等常用技巧备忘) + 文件预览 + excel 通用封装 (基于 hutool 、 poi) 参考若依 + sql 优化 + JVM + SQL 窗口函数 + 参数范围校验注解 + 字典 + 高德地图 + 日志配置 + 枚举 + 序列化、反序列化 + excel + docker 部署 + 若依数据权限 > 存储过程没有返回值 procedure call > 必须有返回值 function 直接调用 + token 刷新 + 全局拦截器 + nacos 刷新 + 慢sql监控 + 用户在线统计 + 站内信息 + 字典 aop + 观察者模式 + 状态模式 + 享元模式 + 单例模式 + 构建者模式 + 原型模式 + mongodb 索引优化 + lambda return + 常量定义 + feign 调用 localDatetime反序列化问题 + 工厂方法模式 应用场景 + 抽象工厂模式 应用场景 + JUC 中断三种方式 + 工作流 + validator 分组校验 + 字典 + 根据字典配置动态生成枚举类型 + 字典动态翻译 + 文件视频格式等问题预览 + 依赖模块优化 + 消息可靠性 + juc + spring cloud + kkfile + ffmepg + 可靠消费 不丢失 重复 实战 + 缓存双写实战 + 代码生成 + 动态数据源 druid 监控 + 数据权限 租户 若依 + xss + author2 + mapstruct + HashMap + ConcurrentHashMap + druid 数据源 + 跨域(Cross Origin Resource Sharing) + 发生在前端 + 浏览器的同源策略:协议、主机、端口 + 三种后端解决方式 + @CrossOrigin + Cross Filter + WebMvcConfigure + UML:Unified Modeling Language + 类图(两个矩形:顶类名称,上属性,下方法) + 属性: 权限 名称: 类型 + 方法: 权限 方法名称(参数列表): 返回值类型 + 权限: + ` ` default + `-` private + `+` public + `#` protected + 关系: + 关联关系: + 引用:实线实心三角形箭头指向被引用的一方 + 双向关联:实线 + 自关联: 实线实心三角形箭头指向自己 + 聚合关系:整体和部分的关系,强烈的聚合关系,部分可以离开整体 + 实线空心菱形指向整体 + 组合关系: 整体和部分的关系,更强烈的聚合关系,部分不可以离开整体(头、嘴) + 实线实心菱形指向整体 + 依赖关系: 耦合度最弱的一种关联关系(调用,引用) + 虚线虚线箭头指向被依赖的类 + 继承关系(泛化关系) + 实线空心三角形指向父类 + 实现关系 + 虚线空心三角形箭头指向接口 + nullSafeEquals + 枚举优化 + redis 队列、map + 大文件上传、切片、多线程、断点续传 + Spring cache + @Cacheable + InitializingBean + xss + @CacheEvict + @EventListener + 微服务 过滤器认证 market + treasure 开放平台 + 交换平台 + webservice + websocket + pig4 + nacos内置 + 数据权限 + 代码生成 + js 规则引擎 + webflux + security 方式认证授权 + 开放平台 4种授权 三方登录 + xss + @inner + webservice + websocket + @PositiveOrZero + base controller + redis 限流 + 通用返回优化 + 自增主键,分页优化方案 git config --local http.postBuffer 157286400 + ER + 详细设计 + 技术文档 + @Configuration(proxyBeanMethods = false) + true: 走代理,配置类中各个方法相互依赖 + false: 不走代理,配置类中各个方法不依赖,可提高性能 + pom优化 + kettle + 缓存 + 上下文待优化 + 登录待优化 + TokenService待优化 + StringJoiner + 数据脱敏考虑隐私权限、用户权限 + 数据权限 + 开放平台 + 集成三方登录 + 短信、天气 + 本地缓存 + 如何停止一个线程 + rpc + docker 部署 + 脚本 启动等 + influxdb 时序数据库 + navicat 模型 + java -jar -Dfile.encoding=utf-8 -DTREASURE_NACOS_NAMESPACE=treasure treasure-business.jar + docker build -t treasure-business:v1.0 . + docker run -p 20903:20903 --name treasure-business -d treasure-business:v1.0 + 开放平台 oauth + 第三放登录 + 高德地图导入行政区划 + 若依数据权限 【PLus】 + 验证码登录 + 枚举 + 若依 @Anonymous + 异常国际化处理 + git 指定某次提交合并到指定分支【先切换到目标分支 在执行git cherry-pick 8888189f】 + `XXXController` > 功能动词 + `obtainXXX`获得 + `discardXXX`删除 + `XXXManager`、`IXXXManager`、`IXXXManagerImpl`【Optional】 > 功能动词+For使用场景 + `obtainDeptTree`【获得部门树】 + `XXXService`、`IXXXService`、`IXXXServiceImpl` 【Optional】 > 功能动词+By条件+For使用场景 + `queryDeptById`【通过部门id查询部门信息】 + `queryDeptsForMini` 【小程序端查询部门列表】 + `queryDeptsForWeb` 【Web端查询部门列表】 + `queryDeptPage` 【部门列表分页查询】 + `modifyDept`【修改部门信息】 + `createDept`【创建一个部门】 + `createDepts`【创建多个部门】 + `removeDeptById`【通过部门id删除部门】 + `removeDeptByIds`【通过部门ids删除部门】 + `XXXMapper` + `insertDept` 【插入一个部门】 + `insertDepts` 【批量插入部门】 + `updateDeptById` 【通过部门id修改部门信息】 + `deleteDeptById`【通过部门id删除部门】 + `deleteDeptByIds`【通过部门ids删除部门】 + `selectDeptsByRLikeName` 【通过部门名称右模糊查询部门列表】 + `selectDeptPage` 【分页查询部门列表】 + `XXXProcessor` 处理 + `XXXHolder` 持有 + `XXXFactory` 工厂 + `XXXProvider` 提供者 + `XXXRegistor` 注册 + `XXXEngine` 核心处理逻辑 + `XXXTask` 任务 + `XXXContext` 上下文 + `XXXHandler`、`XXXCallback`、`XXXTrigger`、`XXXListener` + `XXXAware` 感知 + `XXXMetric`指标 + `XXXPool`池 + `XXXChain` 链 + `XXXFilter` 过滤 + `XXXInterceptor` 拦截器 + `XXXEvaluator` 判断条件是否成立 + `XXXStrategy` 策略 + `XXXAdapter`适配器 + `XXXEvent` 事件 + `XXXBuilder` 构建 + `XXXTemplate` 模版 + `XXXProxy` 代理 + `XXXConverter` 转换 + `XXXRessolver`解析 + `XXXParser`解析器 + `XXXUtils` 工具类 + `XXXHelper` 帮助类 + `XXXConstant` 常量 + `XXXGenerator` 生成 ## 10 后续计划 + 通用业务场景拆分封装 + Cloud系、Dubbo系 + 监控、告警 + 前端部分 + Vue3 + Uniapp + Flutter + ELK + 容器化 ## 10 联系我