构建一个 Spring Boot Starter
Spring Boot Starter:介绍、对比、使用场景和如何自定义:
Spring Boot Starter:介绍、对比、使用场景和如何自定义Spring Boot Starter 是一组便 - 掘金 (juejin.cn)
在这个项目中,因为日志报告会有许多重复部分,比如成功或者失败的时候都会需要许多相同的功能模块,比如时间日期,定位包位置 ,
- Starter依赖:一个包含所有必需依赖的starter,方便开发者一键引入。
- 自动配置:自动配置类,用于根据配置文件自动设置日志系统。
- 配置文件:提供默认的配置文件模板,如application.properties或application.yml中的日志配置项。
- 日志Appender:自定义的日志Appender,用于将日志输出到不同的目的地。
- 日志布局:定义日志的布局,包括日志的格式和内容。
- 条件注解:使用Spring的条件注解,如
@ConditionalOnProperty
,来根据配置启用或禁用特定的日志功能。
日志中心需要包含复杂的初始化逻辑,比如配置特定的日志格式、日志级别、日志存储策略、异步处理机制等,那么将这些逻辑封装到一个自定义的 Spring Boot Starter 中是一个非常好的做法
SDK:
日志中心可以被视为一种特殊的 SDK(软件开发工具包)。在这种情况下,它提供了一组用于日志记录的 API 和工具,允许开发者在应用程序中轻松实现日志功能。这个 SDK 封装了日志记录的复杂性,提供了简单易用的接口,以便开发者能够集中精力于业务逻辑而不是日志系统的细节。
对于一个日志中心 SDK,它可能包含以下特点:
-
日志记录 API:提供一组方法来记录不同级别的日志(如 debug、info、warn、error)。
-
配置管理:允许开发者通过配置文件或代码来设置日志级别、格式、输出目标等。
-
异步处理:为了不阻塞主应用程序流程,提供异步日志记录的能力。
-
日志格式化:支持自定义日志消息的格式,包括时间戳、日志级别、线程信息等。
-
日志路由:能够将日志消息路由到不同的目的地,如控制台、文件、数据库或远程日志服务器。
-
性能优化:确保日志记录操作对应用程序性能的影响最小化。
-
安全性:提供日志脱敏、加密等功能,以保护敏感信息。
-
集成支持:能够与其他系统(如监控工具、告警系统)集成,提供更全面的日志解决方案。
-
多环境支持:提供在不同环境(开发、测试、生产)下灵活配置的能力。
在你的 Spring Boot Starter 中,你可以将这些日志中心的功能作为自动配置的一部分,使得开发者只需要添加一个依赖就能够在他们的 Spring Boot 应用程序中启用这些日志功能。这样,你的 Starter 不仅简化了日志记录的初始化和配置,而且提供了一个完整的日志记录解决方案,即日志中心 SDK。
这里我采用aop的思想来实现日志中心,可以大大的降低日志记录逻辑和业务逻辑的耦合程度。
2.通过定义一个切面,可以在一个地方集中管理所有需要记录日志的点,而不是在每个方法中重复相同的日志记录代码。
3.AOP允许在不修改原有业务代码的情况下,动态地添加或修改日志记录的行为,提高了代码的灵活性。
我通过opratRecord和requeestmapping自定义注解与实现绑定
operateContent()
:定义了操作的内容描述,这是一个默认值可以为空的字符串。convert()
:指定一个类,这个类必须实现Convert
接口。这个类用于将方法的参数转换为OperateLog
对象,以便记录日志。
这个注解被标记在方法上,表明这些方法的执行需要被记录日志。可以灵活地控制哪些方法需要记录日志,以及如何记录日志。
代码解读:
- 切面定义:在AOP代码中,
OperateAspect
类定义了一个切面,用于拦截被@OperateRecord
注解标记的方法。 - 切点(Pointcut):
@Pointcut
注解定义了一个切点,它指定了拦截规则,即拦截所有被@OperateRecord
注解标记的方法。
- 环绕通知(Around Advice):
@Around
注解的around
方法用于在目标方法执行前后添加额外的行为。在这个方法中,首先执行目标方法(通过proceedingJoinPoint.proceed()
),然后异步地记录日志。- 日志记录逻辑包括获取方法的注解信息(
OperateRecord
),创建OperateLog
对象,并设置操作内容和结果。
协同工作
- 当一个方法被
@OperateRecord
注解标记时,这个方法的执行就会被OperateAspect
切面拦截。 - 在
around
方法中,通过反射获取方法上的OperateRecord
注解,读取注解的属性值,包括操作内容和转换类。 - 使用注解中指定的转换类(实现
Convert
接口的类)来将方法的参数转换为OperateLog
对象。 - 最后,将这个
OperateLog
对象的相关信息(如操作内容和执行结果)记录到日志中。
service层调用方法,来实现对于增删改查的记录
数据脱敏:
基于Hutool优雅实现基于Hutool优雅实现数据脱敏在掘金上看到一些关于数据脱敏的文章,也有使用Hutool编写的数据脱敏方案。但在部分处理 - 掘金 (juejin.cn)
自定义一个简单的脱敏序列化工具
这里将传入的手机号的明文格式转换为json格式, 将传入的字符串参数 str 转换为固定电话脱敏形式。
使用 JsonGenerator 将脱敏后的字符串写入 JSON 输出流。
对于记录方法的入参出参也是采用aop的思想:
并且将入参出参序列化
数据库:
增加了对于mysql这种关系型数据库和mongodb这种文档型数据库的理解,也知道了为什么该日志中心使用
MongoDB 可以作为日志中心的数据库,特别是当日志数据以非结构化或半结构化形式存在,且对读写性能要求较高时在mongo进行。而且满足多一个业务用户就可以新建一张表的需求。
客户想建几张表就建几张表,想添加几个字段就添加几个字段,反正字段全都用中文加下划线数据类型,然后用前端表单添加就行了,核心业务字段不让删。反正绝大多数客户的需求整个就是一个高级的Excel而已。至于统计客户最多也就几百万数据,内存大点全部都可以放入内存中。只要不是高并发,无论是管道聚合还是mapreduce性能都是没得说的。原本一个月的需求,结果还没开始就结束了,写个通用组件直接交给实施。客户每张表搞几百个字段,爱咋玩咋玩。至于业务逻辑也简单,其实就是建立一个审批流表,查询审核到哪步了而已
-
灵活的表结构:MongoDB 允许用户创建动态的文档结构,这意味着可以在不删除核心业务字段的情况下,随意添加或修改字段。这种灵活性使得 MongoDB 非常适合快速变化的数据模型和业务需求。
-
无需预定义模式:在 MongoDB 中,不需要像关系型数据库那样预先定义表的模式(schema)。这使得用户可以轻松地根据需要调整数据结构,而不需要进行复杂的数据库迁移或修改。
-
大量的字段:MongoDB 的文档可以包含大量的字段,这对于某些应用来说是一个优势,因为它们可能需要存储大量的元数据或属性。
-
内存中的数据处理:MongoDB 可以利用大量的内存来缓存热点数据,这有助于提高数据检索的速度。对于数据量不是特别大(如几百万条记录)的应用,这可以显著提高性能。
-
简单的统计和聚合:MongoDB 提供了强大的聚合框架,可以轻松实现数据的统计和聚合操作,类似于 SQL 中的 GROUP BY 和 JOIN 操作。
-
非高并发场景:在非高并发的场景下,MongoDB 可以提供非常好的性能。它的管道聚合和 MapReduce 功能可以有效地处理数据。
-
通用组件:由于 MongoDB 的灵活性,可以为不同的客户或项目创建通用的数据存储组件,而不需要为每个项目定制数据库模式。
-
审批流表:描述中提到的审批流表可能是一个特定的业务逻辑,MongoDB 可以通过文档中的嵌入字段或引用来轻松实现这种类型的数据模型。
总的来说,这段描述强调了 MongoDB 在处理灵活数据模型、不需要复杂预定义结构、以及在非高并发环境下的性能优势。这些特性使得 MongoDB 成为许多现代应用的理想选择,特别是那些需要快速迭代和灵活数据结构的应用。
Docker启动
先在根目录下创建compose.yml文件,写好dockerfile然后在打开dockerdesktop,在任务管理器中确定docker是否已经启动