蔡定努
人前拼实力,人后拼努力
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
sentinel使用之限流-熔断
本文详细介绍了Spring Boot项目整合Sentinel的配置步骤。首先明确环境要求:JDK 8/11、Spring Boot 2.3.x~2.7.x、Spring Cloud Alibaba 2.2.10.RELEASE。接着指导下载并启动Sentinel控制台,包括自定义端口和账号密码设置。重点展示了完整的POM文件配置,包含Spring Boot Web、Sentinel核心依赖、Lombok等必要组件,并通过dependencyManagement统一管理版本。最后提供了项目构建和打包的相关插件原创 2025-12-11 15:48:31 · 150 阅读 · 0 评论 -
@JsonView 在 Spring Boot 中的实战指南(附完整 Demo + 多接口复用场景)
摘要:本文介绍了Spring Boot中使用@JsonView注解实现动态字段控制的实战方案。通过定义视图接口(如BaseView、PhoneView)绑定实体类字段,可在不同接口(A/B接口复用手机号字段)中灵活控制JSON返回内容,避免创建冗余DTO类。文章包含完整Demo演示,展示如何通过视图继承实现字段复用,解决多场景下同一实体类的差异化序列化需求,同时确保敏感数据安全。原创 2025-11-24 18:43:56 · 129 阅读 · 0 评论 -
不提交也不释放的事务,数据库连接还有可能被复用
本文展示了Spring事务管理下数据库连接池的使用情况。通过HikariCP配置最大连接数为2,在调用事务接口和非事务接口时,观察到连接复用现象:事务接口aa()使用未提交的连接(autoCommit=false),而非事务接口mu()复用已提交的连接(autoCommit=true)。当连接池耗尽时,mu()会复用aa()的事务连接,导致autoCommit状态不一致。测试结果证实了连接池中连接对象(ConnectionImpl)被不同代理(HikariProxyConnection)复用的机制。原创 2025-10-25 23:32:49 · 48 阅读 · 0 评论 -
微信公众号对接 Spring Boot 服务:实现验证码自动回复功能
本文介绍了如何通过Spring Boot对接微信公众号,实现用户发送“验证码”关键词后自动回复随机验证码的功能。主要内容包括:1)公众号配置(获取AppID、配置服务器回调地址);2)Spring Boot项目搭建(使用OkHttp3调用微信接口);3)核心功能开发(GET接口验证请求、POST接口处理用户消息并生成验证码);4)测试验证流程。该方案适用于用户注册、身份验证等场景,个人订阅号即可实现。原创 2025-10-25 23:25:07 · 81 阅读 · 0 评论 -
不提交也不释放的事务,数据库连接还有可能被复用
摘要 实验发现Spring事务管理下,未提交事务的数据库连接池连接仍可被复用,这与传统认知相悖。通过配置HikariCP连接池(最大2连接)并设计测试接口,观察到未提交事务的连接会被后续请求复用。这可能导致GTID错误(当MySQL开启GTID且混用事务/非事务表时)以及数据修改丢失问题。研究揭示了Spring事务管理机制与连接池交互的特殊行为,对高并发系统设计具有重要启示。原创 2025-09-28 17:18:21 · 82 阅读 · 0 评论 -
MySQL GTID一致性错误全解析:从连接池复用到完美解决方案
MySQL GTID一致性错误解析与解决方案 摘要:在微服务架构中,MySQL GTID一致性错误常表现为"一个接口修改导致另一接口报错"的连锁反应。核心问题在于:1)同一事务中混合操作事务型(InnoDB)和非事务型(MyISAM)表;2)连接池污染导致事务状态残留。根本原因是GTID强制校验机制下,非事务表操作会隐式提交"微型事务",与事务型操作冲突。解决方案包括:严格分离不同引擎表操作、确保事务完整提交/回滚、检查GTID参数配置(gtid_mode/enfor原创 2025-09-28 11:27:27 · 106 阅读 · 0 评论 -
什么是GTID,它有什么作用?
摘要:GTID(全局事务标识符)是MySQL 5.6+引入的特性,由"服务器UUID+事务序号"组成,确保事务在分布式环境中全局唯一可追溯。其核心作用包括:1)简化主从复制故障恢复和新从库搭建,自动定位复制起点;2)避免事务重复执行,保证数据一致性;3)实现事务级追踪监控,快速定位数据不一致问题。不过,GTID要求事务具备原子性,不支持混合引擎操作(如MyISAM和InnoDB混用),否则会触发严格模式报错。GTID通过强制全局一致性机制,显著提升了主从复制的可靠性和运维效率。(149字原创 2025-09-28 10:06:02 · 127 阅读 · 0 评论 -
mysql默认事务隔离级别下并发读不到最新数据解决方案
从MySQL 5.5开始,InnoDB取代MyISAM成为默认存储引擎,支持事务、行级锁等特性,更适合高并发场景。文章通过用户更新查询案例,演示了事务隔离级别下数据一致性问题:方法b在事务中读取了方法a更新前的旧值。解决方案包括:1)使用悲观锁for update锁定查询行;2)采用共享锁保证读取最新数据。代码示例展示了如何在Spring Boot中实现这两种锁机制解决并发读写问题。原创 2025-09-22 17:41:03 · 255 阅读 · 0 评论 -
轻松加载外部Jar,实现SpringBoot功能灵活扩展
本文介绍了在SpringBoot项目中动态加载外部Jar包实现功能扩展的方法。针对java -jar启动时-cp参数失效的问题,提出通过配置PropertiesLauncher和loader.path参数来解决。具体步骤包括:修改pom.xml配置ZIP打包方式、执行Maven打包、启动时指定外部Jar路径。该方法支持按环境差异化加载依赖、临时集成第三方SDK等场景,虽然会略微降低启动速度,但显著提升了项目灵活性。需要注意路径格式和类加载优先级问题,适用于功能扩展优先于启动效率的场景。原创 2025-09-22 15:54:49 · 232 阅读 · 0 评论 -
arthas整合Docker 容器化集成
本文介绍了三种使用Arthas诊断Java应用的方法:1) 通过jar包方式,下载arthas-boot.jar并连接到目标应用;2) 容器化方式,将Arthas预装到Docker镜像中,通过脚本自动连接;3) 使用arthas-tunnel控制台,直接在应用启动参数中配置Arthas连接。三种方式均可通过指定telnet/http端口实现远程诊断,其中容器化方式提供了完整的Arthas环境预装方案。原创 2025-08-25 11:37:58 · 168 阅读 · 0 评论 -
Spring Boot + Flink CDC + MongoDB:打造实时数据变化监听与策略路由系统
本文提出了一种基于Spring Boot + Flink CDC + MongoDB的实时数据管道方案,解决了传统微服务架构中数据库变更监听实时性差、代码侵入性高的问题。该方案通过Flink捕获MongoDB变更事件,并由Spring Boot进行策略路由与业务处理,实现零侵入、低延迟、高扩展的数据变更响应。文章详细介绍了整体架构、核心组件实现(包括配置中心、Flink CDC任务、反序列化与策略路由等),并列举了典型应用场景和开发中遇到的常见问题。该方案无需修改业务代码,支持毫秒级事件处理,新增表只需简单原创 2025-08-20 10:17:58 · 278 阅读 · 0 评论 -
深入理解 Spring 事务同步器:为什么嵌套的 afterCommit 不执行?
本文通过一个实际案例分析了Spring事务同步器的执行机制,解释了为什么嵌套注册的afterCommit回调不执行。关键点在于事务同步器必须在事务活跃期内注册才有效,而案例中的嵌套注册发生在外部事务已提交阶段。文章提供了修正方案,强调同步器应在事务方法内直接注册,避免在回调中嵌套注册。最佳实践包括:确保注册时机在事务活跃期、遵循单一职责原则、根据业务场景合理设计事务边界。理解这些原理可避免类似问题,编写更可靠的事务相关代码。原创 2025-08-07 23:18:21 · 246 阅读 · 0 评论 -
基于 ShardingSphere 的 Spring Boot 数据加密与模糊查询实现
本文介绍了基于ShardingSphere和Spring Boot实现数据加密与模糊查询的完整解决方案。项目采用AES加密敏感数据,通过ShardingSphere的CHAR_DIGEST_LIKE加密器支持加密字段的模糊查询功能。配置包括数据源设置、加密规则定义(AES、MD5和模糊查询专用加密器)以及特殊设计的数据库表结构(添加salary_like字段)。该方案既保障了数据安全,又解决了加密数据难以进行模糊匹配的难题,适用于需要同时满足数据保护和复杂查询需求的场景。原创 2025-08-06 14:25:48 · 346 阅读 · 0 评论 -
Spring Boot 集成 ShardingSphere 实现读写分离实践
本文介绍了Spring Boot集成ShardingSphere实现数据库读写分离的实践方案。选用Spring Boot 2.7.9、ShardingSphere 5.1.1和MySQL 8.0.32等技术栈,通过配置主库(one)和两个从库(two、three)实现读写分离。文章详细说明了Maven依赖配置、数据库准备和表结构创建,其中关键依赖包括shardingsphere-jdbc-core和mybatis-plus-boot-starter。实现方案通过在三个数据库中创建相同的menu表结构,为后续原创 2025-08-05 11:51:17 · 286 阅读 · 0 评论 -
MyBatis-Plus 实战:敏感字段自动加解密支持模糊查询
本文基于MyBatis-Plus框架提出了一种全链路敏感字段加密方案。通过自定义TypeHandler实现数据入库自动加密和查询自动解密,结合重写LambdaQueryWrapper处理查询条件加密,并适配多种查询方式。方案核心包括:1)AESUtil工具类提供加解密基础能力;2)EncryptTypeHandler实现字段类型转换;3)实体类通过注解配置加密字段。该方案在保证数据安全的同时,对业务代码侵入性小,支持姓名、手机号等敏感信息的全流程加密处理,满足系统开发的安全需求。原创 2025-08-01 12:05:13 · 418 阅读 · 0 评论 -
arthas基本使用
本文介绍了Arthas工具的基本使用方法,包括下载启动、接口耗时排查、CPU飙升问题定位、代码反编译等功能。通过具体命令示例和测试代码演示了如何跟踪接口执行时间、分析高CPU线程、查看反编译代码等常见诊断场景。文章还提到可以结合IDEA插件快速生成Arthas命令,展示了dashboard查看系统整体状态的功能。这些方法能帮助开发者快速诊断Java应用性能问题。原创 2025-07-16 15:35:09 · 130 阅读 · 0 评论 -
Ubuntu 的Multipass虚拟机安装使用
Multipass是由Canonical推出的轻量级虚拟机管理器,支持Linux、Windows和macOS系统,分别采用KVM、Hyper-V和HyperKit技术实现低开销运行。它通过命令行快速创建和管理Linux虚拟机,支持自定义CPU、内存和磁盘配置,并提供文件挂载、传输等功能。安装简单,使用方便,适合本地模拟小型云环境原创 2025-07-05 23:47:23 · 301 阅读 · 0 评论 -
Maven 打包后 ip2region.xdb 文件引发 ArrayIndexOutOfBoundsException 异常的解决之旅
摘要: 本文分享了解决Maven打包后ip2region.xdb文件引发ArrayIndexOutOfBoundsException异常的过程。本地测试正常的IP归属地查询功能在部署后失效,原因是Maven误将二进制xdb文件当作文本进行资源过滤,导致文件损坏。通过在pom.xml中配置maven-resources-plugin插件,禁止对.xdb文件进行过滤,成功解决问题。文章还深入解析了Maven资源过滤机制和插件配置技巧,强调了对构建工具原理理解的重要性。该案例为处理类似二进制文件打包问题提供了参考原创 2025-06-16 11:47:53 · 201 阅读 · 0 评论 -
使用 Prometheus 监控 Spring Boot 应用
本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB原创 2025-06-16 11:43:23 · 266 阅读 · 0 评论 -
Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性
摘要: 本文介绍了在Spring Boot中使用Jackson的@JsonAnyGetter和@JsonAnySetter注解处理动态JSON属性的方法。通过定义DynamicProperties类存储固定字段和动态属性,配合Spring Boot控制器接收和返回JSON数据,实现了灵活处理不固定数据结构的需求。特别说明该方案仅适用于@RequestBody场景,因为Jackson的反序列化机制是触发注解生效的关键。这种方法增强了系统对动态JSON属性的处理能力,适用于前端数据结构多变或需求频繁变更的业务场原创 2025-05-30 10:50:58 · 561 阅读 · 2 评论 -
Java中使用自定义序列化器:自动添加自定义字段返回前端实现与应用
本文介绍了如何在 Java 中实现一个自定义的 BigDecimal 序列化器,以在序列化过程中自动添加格式化后的视图字段。通过使用 JsonSerializer 和 DecimalFormat,我们可以在输出 JSON 数据时,既保留原始的 BigDecimal 数值,又添加一个格式化后的字符串字段,便于前端展示。文章详细展示了如何定义 BigDecimalViewSerializer 序列化器,并将其应用于实体类中的 BigDecimal 字段。此外,还提供了测试示例,展示了序列化后的 JSON 输出效原创 2025-05-13 16:46:32 · 248 阅读 · 0 评论 -
Java中使用自定义序列化器:自动添加动态字段的实现与应用
在Java开发中,处理BigDecimal类型数据时,常常需要在序列化过程中添加格式化后的视图字段,以满足前端展示需求。本文通过实现一个自定义的BigDecimalViewSerializer序列化器,展示了如何在序列化时自动添加view字段。该序列化器继承自JsonSerializer<BigDecimal>,重写serialize方法,在输出原始数值的同时,生成格式化后的视图字段。通过@JsonSerialize注解,可以将该序列化器应用于实体类中的BigDecimal字段。最终,返回的JS原创 2025-05-13 10:36:37 · 275 阅读 · 0 评论 -
Git标签删除脚本解析与实践:轻松管理本地与远程标签
本文介绍了一个用于删除本地和远程 Git 标签的脚本,并详细解析了其逻辑和使用注意事项。脚本首先检查本地标签,若不存在则从远程拉取,随后批量删除本地标签。接着,脚本检查远程标签,并通过循环逐个删除。使用该脚本时需注意权限问题、备份重要标签以及处理特殊字符。通过合理运用该脚本,开发者可以更高效地管理 Git 标签,确保版本控制的清晰和规范。原创 2025-05-09 14:40:15 · 336 阅读 · 0 评论 -
利用 SSE 实现文字吐字效果:技术与实践
Server-Sent Events 是一种允许服务器向客户端发送实时更新的 Web API。与传统的轮询(客户端定期向服务器发送请求以获取更新)或 WebSocket(全双工通信)不同,SSE 是单向的,即服务器可以主动向客户端推送数据,而客户端只能接收。这种单向通信模式非常适合那些只需要服务器向客户端发送数据的场景,如新闻更新、股票价格变化、实时日志等。简单易用:相比于 WebSocket,SSE 的实现更加简单,不需要复杂的握手过程。自动重连:如果连接中断,浏览器会自动尝试重新连接到服务器。原创 2025-04-24 22:31:57 · 203 阅读 · 0 评论 -
Spring Boot 中基于 Reactor 的服务器端事件(SSE)推送机制实践
SSE 是 HTML5 规范的一部分,它允许服务器向客户端推送实时更新。与传统的轮询(Polling)方式相比,SSE 通过建立持久的 HTTP 连接,减少了不必要的请求开销,极大地提升了实时数据传输的效率。客户端只需创建一个对象,就能轻松接收服务器推送的事件流,而服务器则负责将数据以特定格式(如)发送给客户端。方法是实现 SSE 推送的核心接口。通过注解将该方法映射到路径,并指定,表明该接口返回的数据类型为,符合 SSE 的数据格式要求。在方法内部,首先使用创建一个每秒发出一个元素的Flux流。原创 2025-04-19 20:47:20 · 452 阅读 · 0 评论 -
IDEA中.gitignore未忽略指定文件的问题排查与解决
在使用 IntelliJ IDEA 进行项目开发时,合理利用.gitignore文件来管理版本控制是非常重要的。它能帮助我们排除一些不需要纳入版本管理的文件,比如包含敏感信息的.env文件。然而,有时我们会遇到一种情况:明明已经将.env文件添加到了.gitignore文件中,但在提交代码到 Git 时,.env文件还是被提交了。这篇博客将深入探讨这个问题出现的原因,并提供相应的解决方法。原创 2025-02-28 00:05:22 · 763 阅读 · 0 评论 -
Spring Boot 依赖配置分离多种打包方式
springboot中依赖分离打包方式原创 2025-01-03 18:27:25 · 921 阅读 · 0 评论 -
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
复制之后,父子线程中的InheritableThreadLocal就没有关系了,父线程中InheritableThreadLocal的值再修改,也不会影响子线程中的值了,所以两次输出的都是张三。从结果中看,线程池执行了2次任务,2次拿到的都是张三,和主线程第一次放入的值是一样的,而第二次主线程中放入的是李四啊,但是第二次线程池中拿到的却是张三,这是什么原因?上面线程池的大小是1,也就是说这个线程池中只有一个线程,所以让线程池执行的2次任务用到的都是一个线程,从上面的日志中可以看到线程名称都是。原创 2024-12-30 10:49:45 · 273 阅读 · 0 评论 -
java 根据 pdf 模板带图片文字生成pdf文件
在现代应用开发中,自动生成包含动态内容的 PDF 文档在电子发票、合同生成、表单填充等场景中有着广泛的应用。本文将介绍如何使用 iText 库动态填充 PDF 模板字段,并在指定位置插入签名和公章图片。项目需求假设我们有一个 PDF 模板文件,包含表单字段,如用户姓名、地址、爱好等,以及需要插入的签名和公章图片。我们将使用 iText 库读取 PDF 模板,填充字段数据,并在指定位置插入签名和公章图片,生成最终的 PDF 文件。技术实现使用的主要依赖。原创 2024-11-15 18:46:33 · 592 阅读 · 0 评论 -
本地 SSL 证书生成神器,自己创建SSL
mkcert是由Filippo Valsorda开发的一款免费开源工具,专门用于生成受信任的本地SSL/TLS证书。它通过简单命令自动生成并安装本地信任的证书,让本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,满足不同开发者的需求。本文以mac为例。原创 2024-11-13 14:04:03 · 208 阅读 · 0 评论 -
本地 SSL 证书生成神器,自己创建SSL
mkcert是由Filippo Valsorda开发的一款免费开源工具,专门用于生成受信任的本地SSL/TLS证书。它通过简单命令自动生成并安装本地信任的证书,让本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,满足不同开发者的需求。本文以mac为例。原创 2024-11-13 12:03:07 · 595 阅读 · 0 评论 -
springboot中返回数据脱敏
特别是在返回用户信息的 API 中,我们通常希望敏感字段(如姓名、身份证、电话号码、地址等)经过脱敏处理后再返回。@Sensitive 注解用于标记需要脱敏的字段,并指定脱敏策略。此脱敏方案适合在 Spring Boot 中使用,特别是数据敏感性较高的场景,如用户信息管理、支付信息保护等。首先,创建 Person 实体类,并在敏感字段上使用 @Sensitive 注解指定脱敏策略。:通过 SensitiveStrategy 枚举,可以轻松扩展新的脱敏策略。@Sensitive:用于标注字段的脱敏策略。原创 2024-11-12 14:50:02 · 463 阅读 · 0 评论 -
Jar 包加密混淆工具 ClassFinal
ClassFinal 是一款 java class 文件安全加密工具,支持直接加密 jar 包或 war 包,无需修改任何项目代码,兼容 spring-framework;可避免源码泄漏或字节码被反编译。加密后,原始的 class 文件中方法体被清空,当 class 被 classloader 加载时,真正的方法体会被解密注入。为兼容 spring,swagger 等扫描注解的框架,故而保留了方法参数、注解等信息;反编译者只能看到方法名和注解;原创 2024-10-07 15:36:38 · 779 阅读 · 0 评论 -
Spring Boot 多线程事务管理:使用 CyclicBarrier 和 PlatformTransactionManager 实现全局事务控制
通过本文介绍的多线程事务处理工具类,我们可以轻松地在多线程环境下控制事务的提交与回滚。特别是在多个线程同时操作数据库时,如果其中一个线程失败,如何保证其他线程的事务操作也能一并回滚,而不是部分提交,成为了开发者必须考虑的重点。在默认情况下,Spring 的事务是线程不安全的,即每个线程都有自己独立的事务上下文。为了在多线程环境下保证事务的统一提交或回滚,我们需要一种机制,能够在所有线程完成操作后,再决定是否提交事务。如果某个线程的任务失败,整个事务应当回滚,确保所有线程的任务要么一起成功,要么一起失败。原创 2024-09-24 23:19:13 · 536 阅读 · 0 评论 -
多线程事务管理:Spring Boot 实现全局事务回滚
在本文中,我们通过 TransactionTemplate 和多线程执行器实现了多线程中的全局事务控制,确保所有线程的数据库操作要么一起提交,要么在发生错误时一起回滚。在 Spring Boot 中,我们通常会在需要事务控制的服务方法上使用 @Transactional 注解来保证事务的一致性。在这些用户的处理过程中,数据库操作必须要么全部提交,要么在发生错误时全部回滚。因此,我们需要一种方式,能够在多线程环境下将所有线程的数据库操作放在同一个事务上下文中,并由主线程统一提交或回滚事务。原创 2024-09-24 23:12:08 · 1515 阅读 · 0 评论 -
InheritableThreadLocal vs TransmittableThreadLocal 深入理解与使用场景
即使线程池复用了子线程,它仍然能获取到正确的值。TransmittableThreadLocal 的原理是:每次任务提交时,它会把父线程的 ThreadLocal 值传递给子线程(无论子线程是新建的还是复用的)。则适用于更加复杂的场景,尤其是当我们使用线程池时,希望父线程的上下文信息(例如用户信息、事务ID等)能够传递给子线程,无论子线程是新建的还是复用的。适用于一些简单的场景,比如普通的多线程编程中,父线程需要将 ThreadLocal 值传递给子线程,且子线程不需要在线程生命周期中更新值的场景。原创 2024-09-12 18:31:22 · 392 阅读 · 0 评论 -
Jenkins+docker+springboot 一键自动部署项目步骤
在 springboot 项目根目录新建一个名为 Dockerfile 的文件,注意没有后缀名,其内容如下:(大致就是使用 jdk8,把 jar 包添加到 docker 然后运行 prd 配置文件)因为我们项目和 jenkins 在同一台服务器,所以我们用 shell 脚本运行项目,原理既是通过 dockerfile 打包镜像,然后 docker 运行即可。点击正在构建的任务,或者点击任务名称,进入详情页面,查看控制台输出,看是否能成功打成 jar 包。】,输入仓库地址,添加凭证,选择好凭证即可。原创 2024-09-02 10:32:09 · 921 阅读 · 0 评论 -
IDEA插件开发中JavaProgramPatcher的使用
JavaProgramPatcher是设置jvm参数的,点击启动项目的时候会调用。本文介绍插件开发中的基本使用原创 2024-09-01 21:42:32 · 538 阅读 · 0 评论 -
springboot中自定义Agent
springboot中,-java agent 自定义逻辑原创 2024-09-01 21:41:09 · 502 阅读 · 0 评论 -
spring、springboot中优雅统计接口耗时
【代码】spring中优雅统计接口耗时。原创 2024-08-15 16:16:07 · 336 阅读 · 0 评论
分享