
组件开发
文章平均质量分 70
扩展点设计与实现。
梦想歌
微信号:pipiluo1813986321
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
只需一行配置!日志从22万行压缩到3万行,节省 90% 资源成本
本次改动没有任何代码侵入,研发团队只需要在 log4j2.yml 微调 pattern,就可以将日志的占用空间缩减 10 倍,并且,在排查问题只需要关注第一段堆栈的信息,就能定位到业务代码问题。原创 2025-03-20 01:05:21 · 529 阅读 · 0 评论 -
使用 Spring Boot 优雅实现用户操作日志审计
在现代应用系统中,事件审计是一个至关重要的功能。通过记录用户的操作行为,我们可以追踪问题、分析用户行为,甚至在出现安全问题时提供关键证据。由于目前没有较好的事件审计框架,笔者决定实现一套可扩展的事件审计组件,要求对业务低侵入性,可以轻松获取前后变更的内容。原创 2025-02-27 23:24:22 · 649 阅读 · 0 评论 -
告别MQ强耦合!一文了解如何实现消息队列无缝切换
在复杂的分布式系统中,消息队列(如 RocketMQ、Kafka、RabbitMQ)常用于优化系统性能。然而,直接在代码中引入这些消息队列的 API 会导致系统与特定消息队列的强耦合,后续难以切换其他消息队列组件。虽然 Spring Cloud Stream 提供了一种抽象层,但其引入了复杂的概念(如绑定器、通道、处理器等),且与低版本的 Spring Boot 不兼容。原创 2025-02-27 15:50:28 · 1015 阅读 · 0 评论 -
从 Leaf 到通用插件:Spring Boot 分布式 ID 生成方案
在复杂的分布式系统中,往往需要对大量的数据和消息进行唯一标识。方案和方案。Leaf-snowflake 方案沿用 Twitter 开源的雪花算法,在原有的基础上使用 Zookeeper 持久顺序节点进行优化,如下图。Leaf-segment 方案基于数据库实现,每次获取一批递增号段的值,用完之后再去数据库获取新的号段,可以生成趋势递增的 ID,同时 ID 号是可计算的,因此不适用于订单 ID 生成场景(容易被竞争对手算出一天的订单量),相关原理如下图。原创 2025-02-14 00:18:39 · 2656 阅读 · 0 评论 -
分布式锁不再复杂:Spring Boot 无缝切换 Redis、Curator 与 Zookeeper
在 Java 中分布式锁的实现框架主要包括基于数据库Redis和Zookeeper的实现方式。使用Redis实现的组件可以选择Jedis API或者,使用Zookeeper实现的组件可以选择或者。笔者在项目中看到不少这种混用 API 的情况,维护性较差。原创 2025-02-13 22:55:10 · 184 阅读 · 0 评论 -
告别手动赋值!优雅处理 MyBatis-Plus 的创建时间和更新时间
Spring JPA 提供了注解,用于自动赋值实体类的创建时间和更新时间。但我们的团队主要使用 MyBatis-Plus 作为 ORM 框架,需要提供同类的机制支持。原创 2025-02-11 14:46:18 · 478 阅读 · 0 评论 -
一招搞定! 自定义MyBatis拦截器,SQL日志存储成本直降30%
默认的日志输出格式存在以下不足:1. 缺少日志时间,无法快速定位 SQL 执行时间。2. SQL 语句可读性差,复杂的 SQL 语句难以阅读。3. 日志存储成本高:SQL 模板占用较多字符,增加了日志存储成本。原创 2025-02-10 23:19:25 · 919 阅读 · 0 评论 -
Sentinel 集成到 Prometheus 监控线上流量
由于 Sentinel Dashboard 开源版本没有实现监控数据的持久化,只能查看 5 分钟的内存数据。在项目初期,我们没有足够的精力对 Sentinel 进行改造,因此,将 Sentinel 的监控数据集成到 Prometheus,并导入到 Grafana 可视化管理。原创 2025-02-09 23:59:17 · 563 阅读 · 0 评论 -
前后端对接必备!基于 Spring 实现自定义错误信息返回
Spring 提供了用来实现 HTTP 协议的全局异常处理。在异常信息的处理上通常只返回特定的 Response 对象,如下。作为基础框架,笔者就遇到项目A 要求返回 Response1 对象,项目B 要求返回 Response2 对象,这个时候,适配起来就很痛苦,例如下方的代码。另外,只适用于 Web 异常捕获,我们还要考虑其他组件的情况,例如 Dubbo 捕获 RPC 异常、Sentinel 组件触发限流、Spring Security 安全框架抛出认证异常。原创 2025-02-09 14:20:05 · 273 阅读 · 0 评论 -
Prometheus 动态获取 Pod 监控数据改造
Spring Boot Actuator 提供了一个监控和管理生产环境的端点,可以查看应用的运行状态。由于运维人员对 Prometheus 和 Grafana 的配置不是很熟悉,使用静态 IP 来获取监控数据,并且从 Grafana 模板市场获取的 Dashboard 不能较好的区分运行环境。使用 Prometheus 服务发现动态获取 Pod 的监控数据,支持 K8s 运行环境筛选监控数据。配置 Actuator 端点原创 2025-02-04 23:35:05 · 388 阅读 · 0 评论 -
log4j2.yaml 动态更新,免重启生效!
有时候生产环境需要临时调整日志级别 Level 或者修改日志输出路径 Appender,使用 Spring Boot 提供的日志刷新不能满足这个需求,最终还是重启服务才能生效。为了解决这个问题,需要实现 log4j2 配置文件的动态加载。原创 2025-02-04 23:27:49 · 780 阅读 · 0 评论 -
不修改程序,引入 Log4j2 插件实现日志脱敏!
日志脱敏是常见的安全需求。为了金融交易的安全性,国家强制规定对于等信息需要数据脱敏。一般我们会采取注解的形式指定字段进行脱敏处理,但这样对代码的侵入性较高。假设公司有几十个系统要改造,或者采购了一些系统没有源代码,怎么办?还有,日志脱敏后,系统用户需要通过手机号找出对应的日志,怎么匹配?原创 2025-02-04 23:26:01 · 785 阅读 · 0 评论 -
不重启服务,实现 Spring Bean 注册和销毁
Spring Boot Starters 的自动装配机制给我们提供了非常丰富的扩展点,但有时候需要动态开启或者关闭某些组件,只能修改配置,重启服务才能生效。例如,我们接入了 Arthas 工具,有时候需要关闭,有时候需要开启,但又不能随意重启服务。原创 2025-02-04 23:22:21 · 347 阅读 · 0 评论 -
分享一个通用的 Spring AOP 日志切面组件
看到有些框架在实现日志切面时,直接编写一个切面类,在@Aspect注解指定好 package 路径,然后通过开启 AOP。业务代码引入这个框架,必须按照框架约定好的 package 路径匹配,才能生效。这样的框架对业务代码有较大的侵入性,不适合所有场景。原创 2025-02-04 23:21:26 · 386 阅读 · 0 评论 -
教您如何扩展 Spring Boot @AutoConfiguration 开关
Spring Boot Starters 提供了很多常用的组件,有些组件例如Kafka和RocketMQ,引入到工程后会自动装配,它会检查您的配置,跟外部的组件创建一些连接,这个时候,我们很难控制Kafka关闭,RocketMQ开启。原创 2025-02-04 23:20:03 · 349 阅读 · 0 评论