自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Java架构师之路的博客

一个专注于Java架构的前进者

  • 博客(615)
  • 收藏
  • 关注

原创 Java注解校验实战

java/** * 校验组定义 */ public interface ValidationGroups { // 新增操作 interface Create {} // 更新操作 interface Update {} // 删除操作 interface Delete {} // 默认组(不指定group时使用) interface Default {} }手机号校验身份证号校验:@IdCard枚举值校验字段互斥密码强度:理解两者的区别和适用场景校验组:使用分组管理不同场景的校验规则自定义注解。

2026-01-14 21:56:48 219

原创 猿辅导二面:线上出现的OOM是如何排查的?

java.lang.OutOfMemoryError: Direct buffer memory(NIO/Netty/ByteBuffer) 原生内存耗尽(JNA、压缩、TLS、线程栈等):NMT(VM.native_memory summary)、应用指标(Netty PooledArena)、-XX:MaxDirectMemorySize。:应用日志、K8s 事件 (kubectl describe pod)、系统日志 (dmesg)、JVM 日志(GC/错误日志)。:Pod 被杀,JVM没栈。

2026-01-14 21:52:50 461

原创 三步搞定短信验证码!SpringBoot集成阿里云短信实战

阿里云短信服务提供高并发、安全的全球短信发送能力,支持验证码、通知、营销等场景。其主要特点如下:特性维度具体说明核心能力提供三网合一通道,秒级可达,支持国内及全球200多个国家/地区。安全与管控基于阿里云账户与RAM权限管理,支持设置日发送量上限、单用户频次阈值,并具备验证码防盗刷监控。计费模式采用短信套餐包优先抵扣,超出后按量计费的模式。国内验证码/通知短信低至0.045元/条起。使用限制仅支持企业认证账号;发送前需完成资质、签名、模板的申请与审核;

2026-01-13 21:51:38 523

原创 ZooKeeper入门实战:从零开始掌握分布式协调服务

ZooKeeper是一个开源的分布式协调服务,由Apache基金会维护。它最初是雅虎公司为了解决分布式系统中的协调问题而开发的,现在已经成为Hadoop、HBase、Kafka等众多分布式系统的基础设施。ZooKeeper作为分布式协调服务,在微服务、大数据、分布式系统中扮演着重要角色。核心概念:数据模型、节点类型、Watcher机制基本操作:增删改查、权限控制实战应用:服务发现、配置中心、分布式锁、Leader选举。

2026-01-13 21:48:31 568

原创 为了防雪崩加了限流,结果入口先挂了

限流实现成本过高限流位置选择错误忽略了入口层的吞吐特性系统没被流量打垮,却被“保护机制”先拖垮限流不是越统一越好,入口不是越重越安全。任何保护机制,如果本身不可控,都会成为新的风险点。

2026-01-12 21:57:03 431

原创 Kafka:从零开始掌握消息队列

Kafka作为一款强大的分布式消息系统,在现代微服务架构中扮演着重要角色。Kafka的核心概念和架构设计生产者和消费者的配置和使用三种消息传递语义的实现方式完整的Java代码示例最佳实践。

2026-01-12 21:54:52 588

原创 Java异常体系结构

Error:系统级灾难,无法恢复,应优雅退出Exception:程序级异常,可处理,必须显式应对:编译器强制检查,代表可预测的外部风险:运行时异常,代表程序逻辑缺陷异常处理的核心原则快速失败、清晰记录、业务转换、绝不隐瞒。良好的异常处理不是隐藏错误,而是让错误信息更透明、更易于理解和修复。

2026-01-11 21:55:56 883

原创 代码跑得慢?让Spring的StopWatch告诉你真相!

备一个StopWatch在工具箱里:就像电工随身带万用表怀疑哪里慢,就给哪里计时:用数据代替直觉重点监控外部依赖:数据库、Redis、第三方API——这些通常是性能瓶颈记住,在代码性能的世界里,StopWatch不会说谎。它可能不会直接让你的代码变快,但它能告诉你哪里慢,而知道“哪里慢”,就解决了优化的一半问题。

2026-01-11 21:53:13 433

原创 深入解析MySQL事务与锁:构建高并发数据系统的基石

MySQL的事务和锁机制是一个精心设计的平衡系统,在数据一致性、隔离性和并发性能之间寻找最佳平衡点。MVCC实现非阻塞读:通过Undo Log链和Read View实现锁保证写有序:通过行锁、间隙锁、临键锁协同工作隔离级别的权衡:根据业务需求在一致性和性能间选择死锁的预防与处理:通过超时、检测和应用层设计避免从默认的RR级别开始,遇到性能瓶颈再考虑调整为所有查询条件添加合适索引监控长事务和锁等待,及时发现瓶颈在应用层考虑并发控制,不完全依赖数据库。

2026-01-09 21:56:51 530

原创 MyBatis隐形炸弹:selectByExampleWithBLOBs使用不当性能下降80%

selectByExampleWithBLOBs是MyBatis Generator(MBG)自动生成代码时针对包含BLOB(Binary Large Object)字段的表的查询方法。它允许通过Example条件对象进行查询,同时包含对BLOB字段的检索。selectByExample:查询时不包含BLOB字段selectByExampleWithBLOBs:查询时包含BLOB字段。

2026-01-09 21:55:36 662

原创 终于解决了!Spring Boot 启动慢的 5 个优化点

禁用不必要的自动配置(收益最高,改动小,立竿见影);缩小包扫描范围(控制扫描粒度,防止历史垃圾代码拖累启动);延迟初始化非核心 Bean(让启动阶段更“瘦身”,核心功能先跑起来);JVM 参数优化(中长期收益可观,需结合环境调优);移除冗余依赖与插件(治理项目“技术债”,顺带给后续升级打基础)。配合这 5 个优化点,实践中老项目启动时间从30 秒+ 压缩到 10~15 秒是完全可以做到的。

2026-01-07 21:53:55 571

原创 揭秘 Spring Boot 事务:动态增强的底层实现与核心组件

Spring Boot 启动,加载TransactionAutoConfiguration,通过@EnableTransactionManagement导入ProxyTransactionManagementConfiguration和AutoProxyRegistrar;

2026-01-07 21:48:50 563

原创 SpringBoot实现隐式参数注入

less通过 Spring MVC 的 HandlerMethodArgumentResolver我们实现了一个可以"跨 Filter 与 Controller 传参"的技术实现方案。将底层 Servlet API 的 request.getAttribute() 操作抽象为编译时类型安全的方法参数注入,实现了框架层面的参数解析适配,既保持了架构的纯净性,又提供了强大的扩展能力。

2026-01-06 21:55:18 633

原创 日志输出优化实战:从“能用”到“好用”的全攻略

scala// 手机号脱敏序列化器 public class MobileDesensitizer extends JsonSerializer<String> { @Override public void serialize(String mobile, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (mobile!

2026-01-06 21:53:46 825

原创 掌握这 4 个关键点!!保证RabbitMQ 消息不丢失和不重复消费!

1. 生产者确认(Confirm)开启 publisher-confirm,确保消息成功发到 RabbitMQ。2. 消息持久化队列和消息都设置成持久化,防止 RabbitMQ 重启后数据丢失。3. 消费者手动确认(ACK)关闭自动 ACK,业务处理成功后,再手动确认消息。4. 消费幂等性每条消息带唯一 ID,消费者先检查是否处理过,避免重复消费。简单来说:防丢失:Confirm + 持久化 + 手动 ACK防重复:消息唯一 ID + 幂等检查。

2026-01-05 21:57:49 523

原创 Redis常见问题排查手册

Redis问题排查思路:问题类型排查命令关键指标连接问题内存问题主从问题性能问题慢查询命令持久化rdb/aof状态集群问题bash。

2026-01-05 15:57:50 616

原创 SpringBoot 集成 Redis 缓存实践

** * 用户实体类(实现Serializable兜底,实际使用JSON序列化) */ @Data public class User implements Serializable { private static final long serialVersionUID = 6643397313702951631L;// 用户ID private String name;// 姓名 private Integer age;// 年龄 private String email;

2026-01-04 21:42:39 540

原创 一文搞懂!Hologres高性能写入

批处理:客户端攒批极大地减少了网络RPC和事务开销。Shard并行:数据分片实现了真正的并行写入,无共享资源竞争。高效的二进制协议:紧凑的序列化节省了网络和解析成本。:顺序写WAL保证持久性,内存写MemTable保证低延迟可见。读写分离的存储格式:行存优化写,列存优化读,后台转换互不干扰。

2026-01-04 21:32:58 733

原创 这样做的幂等也太全了吧!

防护层级防什么实现方式Redis/MQ应用接口层重复点击幂等TokenRedis存储并原子删除业务层并发重复请求分布式锁/唯一键校验数据层一切重复写入唯一索引+捕获异常最终兜底MQ层消息重复消费消息去重表Redis记录已消费msgId状态机状态重复变更WHERE原状态+乐观锁无需Redis最佳实践数据库唯一索引是最终底线,其他层是优化体验与性能。在已有Redis+MQ架构下,优先实现数据层+MQ层幂等,再根据前端体验补充Token机制。

2025-12-31 21:57:13 702

原创 MyBatis隐形炸弹:selectByExampleWithBLOBs使用不当性能下降80%

selectByExampleWithBLOBs是MyBatis Generator(MBG)自动生成代码时针对包含BLOB(Binary Large Object)字段的表的查询方法。它允许通过Example条件对象进行查询,同时包含对BLOB字段的检索。selectByExample:查询时不包含BLOB字段selectByExampleWithBLOBs:查询时包含BLOB字段。

2025-12-31 21:56:11 627

原创 微服务技术选型:从生态架构视角看go-kratos的不可替代性

技术选型的本质,是选择一套 “能支撑业务长期发展的架构体系”,而非单一工具。go-kratos 的核心价值,在于它通过 “核心框架定义标准、扩展层补全能力、应用层落地业务” 的生态架构,让微服务开发从 “零散组件拼凑” 升级为 “标准化体系构建”—— 既解决当下开发效率问题(工具链 / CRUD 模板),又规避未来扩展风险(组件可替换 / 架构一致性),同时通过安全扩展与可观测性保障生产稳定性。

2025-12-30 21:58:41 844

原创 深入解析MySQL事务与锁:构建高并发数据系统的基石

MySQL的事务和锁机制是一个精心设计的平衡系统,在数据一致性、隔离性和并发性能之间寻找最佳平衡点。MVCC实现非阻塞读:通过Undo Log链和Read View实现锁保证写有序:通过行锁、间隙锁、临键锁协同工作隔离级别的权衡:根据业务需求在一致性和性能间选择死锁的预防与处理:通过超时、检测和应用层设计避免从默认的RR级别开始,遇到性能瓶颈再考虑调整为所有查询条件添加合适索引监控长事务和锁等待,及时发现瓶颈在应用层考虑并发控制,不完全依赖数据库。

2025-12-30 21:56:52 603

原创 掌握这 4 个关键点!!保证RabbitMQ 消息不丢失和不重复消费

1. 生产者确认(Confirm)开启 publisher-confirm,确保消息成功发到 RabbitMQ。2. 消息持久化队列和消息都设置成持久化,防止 RabbitMQ 重启后数据丢失。3. 消费者手动确认(ACK)关闭自动 ACK,业务处理成功后,再手动确认消息。4. 消费幂等性每条消息带唯一 ID,消费者先检查是否处理过,避免重复消费。简单来说:防丢失:Confirm + 持久化 + 手动 ACK防重复:消息唯一 ID + 幂等检查。

2025-12-29 21:52:58 879

原创 SpringBoot ThreadLocal 父子线程传值的几种实现方式

Spring提供了TaskDecorator接口,允许我们对Runnable任务进行装饰// 设置自定义装饰器 executor.setTaskDecorator(new ContextCopyingDecorator());

2025-12-29 21:50:35 527

原创 有了开源的 MySQL,为什么还要选择 PostgreSQL?

PostgreSQL 与 MySQL 并非简单的谁更好,而是谁更适合。对于追求长期演进、复杂数据模型和强一致性的系统,PostgreSQL 是更坚实的基础;而对于快速上线、读多写少的 Web 应用,MySQL 依然是高效之选。而国产数据库的崛起,正是站在 PostgreSQL 的肩膀上,走出了一条自主创新之路。

2025-12-26 21:57:27 592

原创 如何在 Spring Boot 中接入 Amazon ElastiCache!

缓存这玩意,说白了就是“用空间换时间”的艺术。Spring Boot 给了你抽象层,ElastiCache 给了你基础设施,剩下的就看你会不会用。别等到线上服务卡得像 PPT 才想起缓存。早点加,早点轻松。以上就是本文的全部内容啦。最后提醒一下各位工友,如果后续不再使用相关服务,别忘了在控制台关闭,避免超出免费额度产生费用~

2025-12-26 21:54:05 688

原创 完整理解乐观锁!!(以预定系统为例)

触发条件: 多个用户同时修改同一数据记录检测机制: 通过版本号验证数据是否被修改处理方式: 失败后重试或提示用户业务价值: 保证数据一致性,避免脏写这种机制确保了在高并发场景下数据的完整性,同时避免了传统锁机制可能带来的性能问题。

2025-12-25 21:55:13 399

原创 Java反射:解锁框架开发的终极密码,让代码拥有“动态灵魂“!!

反射让Java从"静态语言"拥有了"动态特性",它的核心价值在于解耦和通用化——用一套代码适配无数场景。虽然它会破坏封装、带来少量性能损耗,但在框架和工具开发中,这些代价完全值得。

2025-12-25 21:52:53 642

原创 如何避免MySQL死锁?资深DBA的9条黄金法则

1.事务要短:别拖着不提交。2.顺序要一致:所有人按相同顺序改表。3.索引要到位:避免锁太多无关数据。4.出错要重试:应用层兜底处理死锁。5.大批量要分批:别一次锁太多行。死锁没法完全杜绝,但只要做好这些,基本就不会再被它困扰了!

2025-12-24 21:53:27 378

原创 深入理解 FactoryBean:定制化 Bean 的秘密武器

FactoryBean 是 Spring 容器中一个特殊的接口。普通 Bean:Spring 容器直接利用反射调用构造器创建出的对象。:它也是一个 Bean,但它是一个**“生产 Bean 的 Bean”**。把它注入容器后,当你向容器索要这个 Bean 时,Spring 不会给你 FactoryBean 本身,而是会调用它的 getObject() 方法,把你真正想要的对象给你。

2025-12-24 21:52:54 739

原创 Java 开发必看:什么时候用 for,什么时候用 Stream?

两者不是对立关系,而是互补工具。高手会根据场景灵活切换,写出既高效又优雅的代码!for 循环和 Stream 不是替代关系,而是两种不同用途的工具。用 for:比如遍历打印、中途退出、操作索引、维护多个状态、或者逻辑复杂到需要一步步控制,这时候 for 更直接、更灵活、也更容易调试。用 Stream:比如过滤、转换、分组、统计、去重、排序……这些操作用 Stream 写出来就像一条清晰的流水线,代码简洁、意图明确,还天然支持并行。好的代码,是用最合适的工具,解决手头的问题。

2025-12-23 21:57:18 480

原创 这样做的幂等也太全了吧

防护层级防什么实现方式Redis/MQ应用接口层重复点击幂等TokenRedis存储并原子删除业务层并发重复请求分布式锁/唯一键校验数据层一切重复写入唯一索引+捕获异常最终兜底MQ层消息重复消费消息去重表Redis记录已消费msgId状态机状态重复变更WHERE原状态+乐观锁无需Redis最佳实践数据库唯一索引是最终底线,其他层是优化体验与性能。在已有Redis+MQ架构下,优先实现数据层+MQ层幂等,再根据前端体验补充Token机制。

2025-12-23 21:52:05 513

原创 Spring Kafka 动态消费实现案例

以上的实现在实际项目开发和生产环境,可以和分布式配置管理框架或注册中心(Spring Cloud Config、Nacos、ZooKeeper、Apollo、Consul等)结合,通过事件如SpringEvent等进行动态调整。在分布式系统或容器中,需要确保每台机器的消费状态都得到了调整。除了动态调整消费状态之外,还可以 Spring Kafka 源码的基础之上,实现其他能力的动态调整,如增加自定义过滤器,可以实现消息的过滤消费,或者在消息中增加灰度标识等。

2025-12-22 21:53:45 788

原创 深入剖析进程、线程与虚拟内存

在并发编程的世界里,一个常见的误区是认为"多线程总是更快"。然而,实际情况要复杂得多。

2025-12-22 21:51:25 772

原创 深入解析MySQL事务与锁:构建高并发数据系统的基石

MySQL的事务和锁机制是一个精心设计的平衡系统,在数据一致性、隔离性和并发性能之间寻找最佳平衡点。MVCC实现非阻塞读:通过Undo Log链和Read View实现锁保证写有序:通过行锁、间隙锁、临键锁协同工作隔离级别的权衡:根据业务需求在一致性和性能间选择死锁的预防与处理:通过超时、检测和应用层设计避免从默认的RR级别开始,遇到性能瓶颈再考虑调整为所有查询条件添加合适索引监控长事务和锁等待,及时发现瓶颈在应用层考虑并发控制,不完全依赖数据库。

2025-12-21 21:58:08 989

原创 深入探索 Spring Boot3 中 Profiles 多环境配置

在当今复杂的软件开发领域,一个应用往往需要在开发、测试、生产等多个环境中运行,每个环境的配置需求大相径庭。想象一下,在开发环境中,你可能需要频繁调试,所以希望日志更加详细,数据库连接到本地易于修改的测试库;而在生产环境中,对性能和稳定性要求极高,日志级别需要调整,数据库要连接到高可用的正式数据库。Spring Boot 3 的 Profiles 特性就如同一位贴心的助手,为我们解决了不同环境配置管理的难题,提供了灵活且强大的多环境配置解决方案。

2025-12-21 21:54:57 726

原创 SpringBoot ThreadLocal 父子线程传值的几种实现方式

Spring提供了TaskDecorator接口,允许我们对Runnable任务进行装饰// 设置自定义装饰器 executor.setTaskDecorator(new ContextCopyingDecorator());

2025-12-19 21:55:49 701

原创 微服务技术选型:从生态架构视角看go-kratos的不可替代性

技术选型的本质,是选择一套 “能支撑业务长期发展的架构体系”,而非单一工具。go-kratos 的核心价值,在于它通过 “核心框架定义标准、扩展层补全能力、应用层落地业务” 的生态架构,让微服务开发从 “零散组件拼凑” 升级为 “标准化体系构建”—— 既解决当下开发效率问题(工具链 / CRUD 模板),又规避未来扩展风险(组件可替换 / 架构一致性),同时通过安全扩展与可观测性保障生产稳定性。

2025-12-19 21:47:57 808

原创 深入理解 FactoryBean:定制化 Bean 的秘密武器

FactoryBean 是 Spring 容器中一个特殊的接口。普通 Bean:Spring 容器直接利用反射调用构造器创建出的对象。:它也是一个 Bean,但它是一个**“生产 Bean 的 Bean”**。把它注入容器后,当你向容器索要这个 Bean 时,Spring 不会给你 FactoryBean 本身,而是会调用它的 getObject() 方法,把你真正想要的对象给你。

2025-12-18 21:57:27 439

原创 RabbitMQ 如何保证消息不丢失和不重复消费?掌握这 4 个关键点

1. 生产者确认(Confirm)开启 publisher-confirm,确保消息成功发到 RabbitMQ。2. 消息持久化队列和消息都设置成持久化,防止 RabbitMQ 重启后数据丢失。3. 消费者手动确认(ACK)关闭自动 ACK,业务处理成功后,再手动确认消息。4. 消费幂等性每条消息带唯一 ID,消费者先检查是否处理过,避免重复消费。简单来说:防丢失:Confirm + 持久化 + 手动 ACK防重复:消息唯一 ID + 幂等检查。

2025-12-18 21:55:47 804

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除