- 博客(102)
- 收藏
- 关注
原创 从入门到实践:玩转分布式链路追踪利器SkyWalking
SkyWalking是一款国产开源的分布式链路追踪与性能监控系统,专为微服务架构设计。它通过Java Agent实现无侵入监控,支持全链路追踪、JVM监控、服务依赖分析等功能。相比其他方案(如Zipkin、Pinpoint),SkyWalking具有高性能、低侵入和丰富中文文档等优势。其架构包含探针Agent、OAP平台、存储和UI四部分,支持ElasticSearch等多种存储方式。部署简单,只需下载安装包并启动服务即可。Spring Boot项目通过添加Java Agent参数快速接入,可实时监控服务性
2025-12-23 10:37:48
272
原创 一文带你掌握MyBatis-Plus代码生成器:从入门到精通,实现原理与自定义模板全解析
本文介绍了MyBatis-Plus Generator(MPG)代码生成工具,它能根据数据库表结构自动生成Entity、Mapper、Service、Controller等全套代码。文章详细展示了5分钟快速入门方法,包括引入依赖、创建测试表以及基础配置代码生成过程。MPG通过流畅的Builder模式API,支持自定义包名、模板引擎等配置,大幅提升后端开发效率,特别适用于处理重复性代码工作。
2025-12-04 11:04:40
916
原创 Vue-Vben-Admin 从入门到实战:后端开发的前端探索之旅
本文介绍了一名后端工程师如何通过Vue-Vben-Admin快速入门前端开发。该框架基于Vue3+TypeScript+Vite技术栈,提供开箱即用的企业级后台解决方案。文章从环境搭建入手,详细解析了项目结构(API层对应Controller、路由类似RequestMapping),并通过创建测试页面的实战演示了组件开发流程。作为后端转全栈的优质学习资源,Vue-Vben-Admin能帮助开发者理解前端工程化、组件化思维,建议从模仿现有页面开始,结合后端知识逐步掌握前后端协作模式。该框架特别适合需要快速构建
2025-11-20 14:08:48
1303
2
原创 破局延时任务(下):Spring Boot + DelayQueue 优雅实现分布式延时队列(实战篇)
本文详细介绍了基于Spring Boot和DelayQueue的分布式延时队列组件实现方案。文章首先回顾了上篇提出的架构设计,包含协调服务、任务存储、任务处理器和分布式延时队列四大核心模块。重点阐述了组件实现细节,包括延时任务实体封装、任务处理器接口设计,以及基于Redis的任务存储层实现。通过实现Delayed接口的任务实体类和统一的任务存储接口,保证了任务的不丢失、不重复和准时执行特性。文章展示了如何将内存队列与持久化存储结合,构建高性能、高可用的分布式延时任务系统。
2025-11-04 10:01:57
785
原创 破局延时任务(上):为什么选择Spring Boot + DelayQueue来自研分布式延时队列组件?
本文分析了分布式系统中延时任务处理的常见方案及自研组件设计。首先列举了订单超时、消息推送等典型场景,指出不同业务对执行准时性的要求差异。随后对比了三种实现方案:基于定时扫描(简单但延迟高)、消息队列延时功能(适合固定延时)和Redis过期监听(有可靠性风险)。针对现有方案的不足,提出基于Spring Boot+DelayQueue的自研组件设计,具备分布式协调、准时触发、动态延时支持等特性,采用协调服务、任务存储等核心模块实现高可用。文章最后预告将深入讲解具体实现细节。
2025-10-24 10:33:06
398
原创 JDK源码深潜(一):从源码看透DelayQueue实现
DelayQueue是一个无界阻塞队列,要求元素实现Delayed接口,只有当元素延迟到期时才能被取出。其内部通过PriorityQueue存储元素,使用ReentrantLock保证线程安全,并采用Leader-Follower模式优化线程等待。核心方法包括:offer()入队操作,当新元素成为队首时会唤醒等待线程;poll()非阻塞获取已到期元素;take()阻塞等待直到有元素到期;poll(timeout, unit)带超时的阻塞等待。通过这种设计,DelayQueue实现了高效的延时任务处理能力。
2025-10-20 10:48:58
1016
原创 ⏰ 一招鲜吃遍天!详解Java延时队列DelayQueue,从此延时任务不再难!
摘要: 本文介绍了Java中的DelayQueue延时队列,这是一个强大的无界阻塞队列,适用于延迟调度、缓存过期等场景。核心特性包括:延迟获取、无界队列、线程安全和内部排序。使用DelayQueue需实现Delayed接口,并通过getDelay()和compareTo()方法控制元素延迟时间。文章提供了基础用法和进阶示例,如异步任务调度器和自动缓存清理,展示了其灵活性和实用性。通过代码实战,帮助开发者快速掌握这一高效工具。
2025-10-15 10:27:51
291
原创 JDK 8钉子户进阶指南:十年坚守,终迎Java 21升级盛宴!
Java 21对比Java 8的10大关键升级:从JDK 8到21的演进带来了12项核心改进,包括模式匹配(instanceof、switch)、文本块、HTTP Client API等,大幅提升开发效率。虚拟线程实现颠覆性并发性能提升,Record类简化数据对象,集合操作更标准化。这些特性经过"预览机制"严格验证后转正,推荐优先使用文本块(⭐⭐⭐⭐⭐)、模式匹配(⭐⭐⭐⭐⭐)和虚拟线程(⭐⭐⭐⭐⭐)等高价值功能。升级到Java 21将显著改善代码简洁性和系统性能。
2025-10-10 11:21:38
932
原创 深入解析Flowable工作流引擎:从原理到实践
本文介绍了工作流引擎Flowable的核心概念和Spring Boot整合实践。工作流是对业务流程的抽象建模,Flowable作为主流开源框架实现了BPMN 2.0规范,提供了流程定义、执行和监控能力。文章详细解析了Flowable的核心API架构和五大服务接口,并通过一个请假流程案例展示了XML流程定义文件的编写方式。最后给出了Spring Boot集成Flowable的Maven依赖配置,为开发企业级审批系统提供了实用参考。
2025-09-03 13:44:06
1157
原创 从List与Tree相互转换工具类实现中谈谈菜鸟到老鸟的一些思考
本文探讨了Java中处理树形结构数据的多种实现方案。以菜单系统为例,介绍了常规递归写法及其可能存在的栈溢出和性能问题,提出了基于空间换时间的优化方案。随后进一步封装了通用工具类,通过泛型和函数式编程实现适配多种业务场景的树形转换功能。文章对比了不同方案的优缺点,为开发人员提供了从基础到进阶的完整解决方案,适用于菜单、组织架构、商品分类等多种树形结构业务场景。
2025-07-30 16:47:34
911
原创 批量update实现方案全面解析与最佳实践,带你掌握到底怎么批量更新最快、性能最高
本文全面对比了MyBatis批量更新方案的性能差异。针对百万级数据表测试了三种实现方式:循环单条更新耗时3846ms;foreach多SQL语句方式耗时显著降低;还介绍了其他优化方案。测试表明,批量更新性能受数据量、索引结构、内存缓存等因素影响,大表需更多I/O定位记录。建议根据实际场景选择合适方案,避免for循环内单条操作SQL这种性能瓶颈。文章提供了代码示例和SQL执行流程分析,帮助开发者优化批量更新操作。
2025-07-11 09:47:13
649
原创 谈谈TransmittableThreadLocal实现原理和在日志收集记录系统上下文实战应用
JDK的InheritableThreadLocal(ITL)在父子线程间传递值时,无法解决线程池复用线程导致的值传递问题。阿里开源的TransmittableThreadLocal(TTL)通过TtlRunnable修饰任务或TtlExecutors修饰线程池,实现了线程池场景下的值传递。其核心原理是装饰器模式,在任务提交时抓取当前线程上下文,确保每次任务执行都能获取正确的上下文值。相比ITL,TTL更适用于线程池等复用线程的场景。
2025-06-16 16:59:22
931
1
原创 一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
本文将从入门到实践,全方位带你掌握RocketMQ的核心概念、部署方式、API使用和高级特性。
2025-06-06 17:57:18
703
原创 深入剖析Spring Boot参数校验:实现原理、自定义注解组件与国际化多语言实践
本文总结了Spring Boot项目中参数校验的重要性及其实现机制。Spring Boot基于JSR-380规范,提供了强大的参数校验功能,支持声明式校验、嵌套校验、分组校验、自定义校验逻辑以及国际化错误消息处理。文章详细解析了Spring Boot参数校验的原理,指出参数校验逻辑主要在RequestResponseBodyMethodProcessor中处理,并通过validateIfApplicable方法执行校验。最终,参数校验的具体逻辑由ConstraintValidator的isValid方法实现
2025-05-16 11:15:22
1079
原创 后端接口没做参数检验导致服务雪崩,被批评代码健壮性太差......
至此,Spring Boot如何优雅实现后端接口参数检验实践教程已经讲述完了,Spring Boot提供了强大而灵活的参数校验机制,从简单的字段校验到复杂的自定义校验都能很好支持。合理使用参数校验可以:提高代码的健壮性减少大量的样板代码统一校验逻辑和错误处理提高API文档的准确性在实际项目中,建议将校验逻辑集中在参数传输DTO层,保持业务逻辑的纯净性,同时结合全局异常处理提供友好的错误信息。
2025-05-08 09:44:22
802
原创 Kafka生产环境实战经验深度总结,让你少走弯路
在实际项目中接入 Kafka 已经成为高并发系统的标配。然而,从简单的“能跑”到“稳定高效地跑”,中间有太多坑值得记录和总结。本文结合本人在多个生产项目中使用 Kafka 的经验,围绕以下几个方面展开:**消息丢失防范、重复消费控制、性能瓶颈优化、集群运维策略,以及 Topic、分区、副本机制的设计要点**
2025-04-29 14:12:06
1104
原创 从零搭建高可用Kafka集群与EFAK监控平台:全流程实战总结
在大批量数据处理与实时计算领域,已成为消息队列的事实标准。本文将完整记录从零开始搭建高可用Kafka集群,并配置EFAK监控平台的详细过程,涵盖规划、部署、优化到监控的全生命周期管理。通过本文,你将了解并掌握一套生产级别可用的Kafka集群部署和监控方案。从开始,可以不再依赖zookeeper,尽管Kafka在新版本中减少了或移除了对ZooKeeper的依赖,但在完全移除之前,许多现有的部署仍然依赖于ZooKeeper,所以kafka不依赖于zookeeper。
2025-04-11 09:57:52
935
原创 详解SQL查询语句关键字执行顺序
SQL 语句的执行顺序与书写顺序不同,理解执行顺序有助于优化查询性能。在实际开发中,应尽量避免在WHERE和HAVING中使用复杂的计算,以减少查询的开销。通过掌握 SQL 语句的执行顺序,我们可以更好地编写高效、可维护的查询语句,并深入理解 SQL 查询的底层逻辑。
2025-04-01 09:58:51
447
原创 MySQL之主从延迟、主从切换、读写分离
这个分发日志要严格保证对同一行数据更新的两个事务的执行顺序和主库的执行顺序一样的,所以这个分发事务执行不是简单的随机或者轮训啥的,要按照一定规则来保证,当然了,同一个事务的更新语句是不能分开执行了,一个事务更新了表 t1 和表 t2 中的各一行,如果这两条更新语句被分到不同 worker 的话,虽然最终的结果是主从一致的,但如果表 t1 执行完成的瞬间,从库上有一个查询,就会看到这个事务“更新了一半的结果”,破坏了事务逻辑的隔离性。得到,原来从库 C 是 A 的从库,本地记录的也是 A 的位点。
2025-03-06 10:18:54
1094
原创 RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
MySQL 主从复制是提升数据库性能和可用性的有效手段,通过合理的配置和优化,可以有效实现读写分离、数据备份和故障恢复。本文从主从复制的原理入手,详细讲解了配置步骤和常见问题解决方案,希望能帮助你搭建稳定可靠的 MySQL 高可用架构。
2025-02-17 10:14:29
979
原创 详解如何优雅实现先分组再组内排序取数据解决方案
分组后组内排序取第一条记录的操作,是 SQL 查询中的高频需求。推荐优先使用窗口函数,其次是子查询方法,并根据实际业务场景选择合适的实现方式。同时,结合索引和字段优化,可以显著提升查询性能。当然这是针对大批量查询的情况下,如果你这是查询一两个姓名的最小年纪这种,你完全可以查询出所有数据,在Java代码逻辑中利用内存分组之后再排序,取相应数据即可。
2025-02-06 09:55:40
1104
原创 谈谈定时任务实战问题及解决方案、实现原理
我们应该都知道,定时任务一大常见使用场景就是在每天晚上凌晨跑定时任务做数据处理,这样可以在系统流量少、负载低的时候去做一些复杂的逻辑处理,但是一旦定时任务执行失败,如果没做好任务执行过程的日志链路,查找问题起来也是相当困难的,之前就碰到过这么一个问题,客户反馈数据不对,然后测试介入排查发现对应的定时任务执行了(看到了任务的info输出日志),但是没看到有error日志,这就很怪了,造成了一种这个代码执行了,但是数据不对的现状,然后开发又去翻看代码一行一行去解读一下,发现没问题呀。
2025-01-13 09:58:50
959
原创 详解Spring Boot定时任务的几种实现方案
在 Spring Boot 中,定时任务的实现方案多种多样,本文主要基于单机模式环境下讲述,所谓单机就是一个Java应用服务,至于集群分布式定时任务之前有总结过,感兴趣的可去公众号自行查看。Java原生提供的和TimerSpring Task提供的@Scheduled注解实现定时任务尽量避免使用Timer,因为它的单线程实现和异常处理问题容易引发严重后果,在现代 Java 开发中,尽量使用替代Timer,但是要注意配置合理的线程池大小,避免任务积压或线程资源浪费,使用try-catch。
2024-12-17 10:32:29
1059
原创 闹笑话了,差点以为Java三目运算符有BUG!!!
在 Java 中使用三目运算符时,要特别注意返回类型的推断是否会导致拆箱操作。若条件结果可能为null,而又涉及自动拆箱操作,则会引发空指针异常。因此,确保条件表达式返回值类型一致或明确避免null拆箱操作,是解决此问题的关键。
2024-11-18 10:36:07
1021
原创 一文带你掌握elasticsearch复合字段类型:Arrays、Flattened、Nested在业务系统中最佳实践
在当下互联网系统中使用非常广泛,是一个非常热门的组件框架。那到底是什么呢?是一个分布式、实时的搜索和分析引擎,通常用于处理和查询大规模的结构化与非结构化数据。它基于 Apache Lucene 构建,具有高效的全文搜索、数据存储、数据分析和数据可视化功能。主要应用于日志分析、监控、数据检索、实时分析等场景。这里关于基础入门使用篇elasticsearch入门使用教程详解,看这篇就够了高级进阶原理篇elasticsearch高级篇:核心概念和实现原理官方文档地址字段类型适用场景优点缺点Array。
2024-11-13 09:46:08
1539
原创 详解Spring Boot 启动时执行特定代码逻辑实现方案
书接上回,我们总结了,大致分为环境配置、IOC容器bean加载、事件通知等,具体详细总结可自行调转查看。今天我们来看看一个平时在业务开发中常见的逻辑场景。在开发 Spring Boot 应用时,我们经常需要在项目启动时执行一些初始化逻辑,比如加载缓存、连接外部系统、初始化配置信息等。Spring Boot 提供了多种实现方式,允许我们在应用启动的不同阶段插入代码逻辑。本文将结合启动过程详细介绍这些方式,并说明适用的场景及实现示例。
2024-11-01 10:06:33
1043
原创 深入解析 Spring Boot 启动过程都做了些什么?
Spring Boot 提供了简化的配置和自动化功能,使开发者能够快速构建应用。但在 Spring Boot 的背后,启动过程涉及一系列复杂的流程,包括 Bean 的加载、环境配置、自动配置的注册等。这篇博文将详细总结 Spring Boot 的启动过程,并结合源码解析每一步具体做了什么。Spring Boot 的启动过程虽然看似简单,但背后涉及大量的逻辑处理,包括环境配置、IOC 容器初始化、事件广播、Bean 生命周期管理等。
2024-10-24 10:00:26
1300
1
原创 一文带你掌握ApplicationRunner和CommandLineRunner如何使用及实现原理
和是 Spring Boot 提供的两个接口,允许在 Spring 应用程序启动完成后执行特定的代码。它们的主要作用是在应用启动后执行一段初始化或任务逻辑,常见于一些启动任务,例如加载数据、验证配置、执行调度等。接下来我们就来详细看看它们在项目开发中的实际应用和 ApplicationRunner常用于应用启动后的初始化任务或一次性任务执行。它们允许你在 Spring 应用启动完成后立即执行一些逻辑。更适合需要处理命令行参数的场景,而 CommandLineRunner更简单直接。通过@Order。
2024-10-10 11:02:03
1795
原创 你知道怎么合理设置线程池参数吗?
提交一个任务,线程池会判断当前线程数是否小于核心线程数,如果是则会立即创建一个工作线程执行任务,即使当前线程池中有空闲线程(ps:之前提交任务所创建的线程执行完任务之后就空闲下来了)可以用来执行当前提交的任务,也会创建一个新的线程去执行,概括来说就是如果没有达到核心线程数,不管当前线程池中有没有空闲线程,都会立即新建一个工作线程去执行当前任务。,即有非核心线程(线程池中核心线程以外的线程)时,这些非核心线程空闲后不会立即销毁,而是会等待,直到等待的时间超过了。如果非要回收空闲的核心线程,可以将线程池的。
2024-09-25 10:30:33
2018
原创 工作五年了,总是要尝试着用回调机制Callback和函数式编程写一些优雅的代码了!!!
回调(Callback)是一种编程模式,其中一个函数(或方法)在执行完成后通过调用另一个函数(或方法)来传递执行结果,或在特定事件发生时调用。这种模式常用于异步操作、事件驱动编程中,可以提升代码的可扩展性、灵活性和模块化。回调机制指的是将一个方法或函数作为参数传递给另一个方法,待特定事件或操作完成时调用这个方法,处理结果或执行后续操作。可以理解为一种“通知”机制,当一个任务完成时,调用回调函数来传递结果或执行后续逻辑回调可以分为同步回调和异步回调:异步回调。
2024-09-13 11:18:53
1262
原创 你知道有哪些Spring MVC扩展点可以解析接口参数和处理返回值吗?
Spring MVC是一个灵活且强大的框架,它允许开发者在框架的基础上进行深度定制,以满足各种复杂的业务需求。和是Spring MVC提供的两个重要扩展点,分别用于处理控制器方法的参数解析和返回值处理。本文将详细探讨这两个接口的作用、使用场景以及如何自定义实现。关于Spring MVC谈谈@ControllerAdvice的使用及其实现原理:用于定义全局的异常处理、数据绑定、数据预处理等功能。
2024-08-22 10:16:36
972
原创 Spring Cache在业务系统中最佳实践教程详解及实现原理
接着之前总结的如何保证MySQL与Redis数据同步一致性一文中提到在业务代码中一般采用旁路缓存策略方式实现同步,就是基于该策略方式提供的一种缓存抽象,可以帮助开发者简化缓存的使用过程。它支持多种缓存实现,并通过注解的方式提供简洁的缓存操作。核心思想是通过缓存抽象层解耦具体的缓存实现,从而可以灵活地替换和配置不同的缓存方案,在包中定义了和两个顶层接口来统一不同的缓存技术。这种抽象思想是非常值得学习的,比如平时我们在业务系统代码中通过 Kafka 来发送异步消息。
2024-08-08 09:59:24
961
原创 Spring Boot项目如何优雅丝滑地从Date过渡到LocalDateTime
书接上回,我们总结了使用Date处理日期时间的存在问题以及讲述了Java 8全新日期时间等强大功能。可谓是使用LocalDateTime替代Date操作处理日期时间之后:任凭风浪起,稳坐钓鱼台。但我们都知道大部分开发人员是守旧的,我Date用的好好的,也用了这么多年了,现在要换成Java 8提供的全新,你说换就换啊???兼容吗?出问题了谁负责?😄 所以在项目中大家从Date过渡到使用类型字段作为接口出入参数,能正常映射转换前端传入的参数吗?返回参数前端是否能收到一个正常的日期时间字段值?使用。
2024-07-19 16:57:10
1175
原创 一文带你掌握SpringMVC扩展点RequestBodyAdvice和ResponseBodyAdvice如何使用及实现原理
`RequestBodyAdvice`和`ResponseBodyAdvice` 是 `Spring MVC` 提供的一种扩展点钩子机制。`RequestBodyAdvice`允许开发者在处理 HTTP 请求体之前或之后插入自定义逻辑。它通过与 `HttpMessageConverter` 紧密集成,在请求体读取和转换的过程中提供了扩展点。了解其工作原理有助于在复杂的请求处理场景中实现更强大的功能,如**日志记录、数据预处理加解密和签名验证**等。`ResponseBodyAdvice` 是一个强大的工
2024-07-12 10:00:52
2657
原创 使用LocalDateTime替代Date操作处理日期时间之后:任凭风浪起,稳坐钓鱼台
在日常开发系统过程中,日期和时间的操作处理是一个常见的应用功能场景,Java提供了多种工具和库来处理日期和时间操作,其中主要分为:Java 8之前的提供。Java 8引入了全新的日期时间API,提供了更好用且更强大的日期时间处理功能,主要的类包括LocalDateLocalTime和。在这篇博文中,我们将总结讲解一些常用的日期处理操作,证明Java 8使用全新的等类来替代以前老的Date必要性。平时我们在使用Date处理日期时间或多或少都有感觉到繁琐不方便,甚至出现逻辑不对、线程安全等问题。
2024-07-05 10:09:15
1028
原创 @ControllerAdvice:你可以没用过,但是不能不了解
最近在梳理Spring MVC相关扩展点时发现了@ControllerAdvice这个注解,用于定义全局的异常处理、数据绑定、数据预处理等功能。通过使用,可以将一些与控制器相关的通用逻辑提取到单独的类中进行集中管理,从而减少代码重复,提升代码的可维护性。定义如下/*** ........*/@ComponentClass
2024-06-24 10:08:28
830
原创 kafka入门实战教程看这篇就够了
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。**发布/订阅**:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息 分为不同的类别,订阅者只接收感兴趣的消息。
2024-05-21 10:34:18
836
原创 技术大佬灵魂质问:你们对外提供的API接口竟然没加黑白名单限制!!!
IP 黑白名单是一种常见的网络安全机制,用于控制对特定资源或服务的访问。黑名单列出了被拒绝访问的 IP 地址,而白名单列出了被允许访问的 IP 地址。通过这种方式,可以有效地防止未经授权的访问,提高系统的安全性。对于对外提供的API接口,通过设置IP黑白名单,确保只有经过认证或信任的系统和客户端才能调用接口。可以阻止已知的恶意IP地址或曾经尝试攻击系统的IP地址,防止这些来源对服务器进行未经授权的访问、扫描、攻击等行为。在项目系统服务代码中实现IP黑白名单和在Nginx中设置IP黑白名单都是可行的方式。
2024-05-17 10:29:21
1217
原创 从使用教程、实现原理、差异对比全方面带你玩转业务系统中高频使用的过滤器与拦截器
在Java Web开发中,**过滤器(Filter)和拦截器(Interceptor)**是两种常见的组件,用于在请求到达目标资源之前或之后执行一些操作,如日志记录、权限控制、字符编码处理等。虽然它们的作用有些类似,但在实际应用中又有不同之处。本文将深入探讨过滤器与拦截器的实现原理、区别差异以及在实际应用中的使用场景和示例。过滤器(Filter)过滤器是一种基于规范的组件,用于在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行预处理和后处理。
2024-05-13 15:16:09
708
2
原创 一文带你彻底玩转EasyExcel:导入导出excel数据起飞
EasyExcel 是一个功能强大、易于使用的 Excel 操作工具,它大大简化了 Excel 数据的读取和写入操作,提高了开发效率。通过本文的介绍,相信读者对 EasyExcel 库有了更深入的了解,希望能够在实际开发中更多地利用 EasyExcel 提升工作效率
2024-04-16 10:42:06
26732
11
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅