自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Debug日记的博客

老码农一枚,摸爬滚打 12 年。这里有代码调试技巧、踩坑经验和技术趋势解读,帮你少走弯路,高效成长。

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

原创 Spring Boot WebClient性能比RestTemplate高?看完秒懂!

本文详细对比了Java中WebClient与RestTemplate的性能差异。核心结论是:在需要并发调用多个无依赖三方接口的场景下,WebClient凭借异步I/O模型、线程高效复用和背压支持三大优势,能显著提升服务整体性能。其异步特性使接口调用时间从串行累加变为并行叠加,线程复用机制大幅降低资源消耗,背压功能则保障了系统稳定性。而RestTemplate的同步阻塞模型导致其在这些场景下效率较低。文章特别指出,WebClient的优势发挥需要满足特定条件,并建议新项目优先选用WebClient或Sprin

2026-03-11 18:00:57 153

原创 Java 告别繁琐数据统计代码!MySQL 8 窗口函数真香

MySQL8窗口函数大幅简化复杂统计查询,通过对比Java代码与SQL实现相同需求,展示其优势。窗口函数支持在不合并数据行的前提下进行分组统计,适用于排名、聚合、前后行关联等场景。典型示例包括RANK()、DENSE_RANK()等排名函数,以及SUM()、AVG()等聚合函数,语法简洁高效。相比传统Java硬编码方式,窗口函数能显著减少代码量,提高查询性能,是处理分组统计需求的理想选择。

2026-03-09 13:46:37 338

原创 别再写嵌套子查询了!MySQL CTE 才是真正的 “SQL 清爽神器”

本文介绍了MySQL 8.0引入的CTE(通用表表达式)技术,重点讲解了其简化复杂查询和递归处理的核心功能。第一部分通过对比传统嵌套子查询和CTE写法,展示了CTE"逻辑扁平化"的优势;第二部分详细说明了普通CTE和递归CTE的应用场景,包括简化多层级子查询、处理树形数据(如组织架构)以及生成日期序列等实用案例。文章通过具体SQL示例和结果展示,帮助读者理解CTE如何使SQL代码更易读、易维护,特别适合处理复杂业务逻辑和层级数据查询需求。

2026-03-06 17:32:28 341

原创 MySQL 查询优化 30 条封神技巧:用好索引,少耗资源,查询快到飞起

MySQL查询优化的核心在于高效利用索引和减少资源消耗,通过以下技巧提升性能: 基础查询优化: 避免SELECT *,只查必要字段 善用覆盖索引减少回表 禁止对索引列运算/函数操作 LIKE查询避免前缀模糊匹配 优化OR/IN查询,避免索引失效 使用延迟关联或ID定位优化深分页 关联查询优化: 小表驱动大表减少循环次数 JOIN字段必须建立索引 合理使用ON和WHERE条件 用JOIN替代子查询 限制关联表数量(≤5个) 排序分组优化: GROUP BY配合ORDER BY NULL 建立索引覆盖排序字段

2026-03-05 14:50:17 369

原创 Spring Boot 集成 RabbitMQ 实战:8 个最佳实践,杜绝消息丢失与队列阻塞

本文总结了Spring Boot集成RabbitMQ的4个核心最佳实践:1) 配置发布确认和返回机制确保消息可靠投递;2) 使用手动确认模式避免消息丢失;3) 合理设置预取数量平衡吞吐量与稳定性;4) 利用死信队列处理异常消息。这些实践通过生产者确认、消费者手动ACK、流量控制和异常处理等机制,有效保障了消息系统的可靠性、稳定性和可维护性。

2026-03-04 14:49:06 390

原创 spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战

本文介绍了将传统SASS服务转型为MCP服务并实现负载均衡的项目方案。项目基于Spring生态,使用Nacos 3.1.1作为服务注册中心,通过Spring AI Alibaba框架集成千问大模型,构建了包含服务调用端(sass-to-mcp-agent)和服务提供端(sass-to-mcp-mcp)的模块化架构。重点阐述了调用端的实现细节,包括依赖配置、YAML文件设置以及核心代码逻辑,展示了如何通过命令行交互调用MCP服务并实现负载均衡。项目实现了服务快速转型和高效调用,为类似场景提供了可参考的技术方案

2026-03-03 14:05:52 705

原创 别被 txCommit 骗了!为什么 RabbitMQ 做不了分布式事务,而 RocketMQ 可以?

RabbitMQ的事务机制与RocketMQ存在本质差异:前者仅保证消息的批量操作(本地事务),后者通过半消息和回查机制实现跨系统一致性(分布式事务)。RabbitMQ无法感知数据库状态,若消息发送失败会导致数据不一致;而RocketMQ能确保业务数据与消息状态的最终一致性。若要在RabbitMQ中实现分布式事务,需额外开发本地消息表方案,通过轮询和幂等处理来模拟类似功能,但开发成本和复杂度远高于RocketMQ原生支持。

2026-03-02 17:24:23 479

原创 Spring Boot 项目中日期处理的最佳实践

摘要:本文分享了作者因SimpleDateFormat线程安全问题导致服务崩溃的踩坑经历,并提出Java 8日期时间API的最佳实践。核心建议包括:数据库存储使用BIGINT时间戳,Java代码优先使用Instant处理机器时间,业务场景转为LocalDateTime,并用线程安全的DateTimeFormatter替代SimpleDateFormat。文章详细阐述了这种方案在性能、时区处理和代码可读性方面的优势,并提供了具体场景的转换示例,帮助开发者规避生产环境中的常见日期处理陷阱。(149字)

2026-02-27 15:58:32 359

原创 Java字符串搜索匹配终极指南:五种方案对比与选型

Java字符串搜索匹配方案选型指南 摘要:本文深入分析了五种Java字符串搜索匹配方案的应用场景与性能特点:1) String.replace()在Java 9+版本中性能最佳;2) StringUtils.replace()在Java 8及以下版本表现优异;3) String.replaceAll()适用于简单正则替换但需注意性能损耗;4) 预编译Pattern适合高频正则匹配场景;5) Aho-Corasick算法实现则专为海量关键词匹配优化。通过决策流程图和性能对比,帮助开发者根据不同JDK版本、关键

2026-02-26 16:54:26 650

原创 Java字符串拆分巅峰对决:三大高手过招

摘要: 字符串拆分的三大方案各有优劣:StringTokenizer性能最优(吞吐量8,200 ops/ms),但功能简陋;String.split支持正则但性能垫底(仅冠军1/3);StringUtils.splitByWholeSeparatorPreserveAllTokens在功能与性能间平衡(7,800 ops/ms),支持多字符分隔符和保留空标记。实际选择需权衡场景:高频简单拆分用StringTokenizer,需正则用String.split,常规需求优先推荐StringUtils。注意Str

2026-02-25 08:28:03 579

原创 告别冗余!Spring Boot Web 入参转换 6 种玩法,@InitBinder 可以退休了

摘要:Spring Boot提供@DateTimeFormat和@NumberFormat注解简化请求参数类型转换,替代繁琐的@InitBinder方式。@DateTimeFormat支持日期格式转换,@NumberFormat处理数字格式转换,可直接用于方法参数或实体类属性。对于复杂需求,可通过自定义注解配合AnnotationFormatterFactory实现灵活转换。这些方案覆盖了表单请求参数转换的主要场景,显著提升开发效率。(149字)

2026-02-24 11:28:40 581

原创 Java文件操作编年史:从基础到完善的进化之路

Java文件操作演进简史 Java文件操作经历了从基础IO到NIO再到NIO.2的三阶段演进。JDK 1.0的基础IO实现了文件读写功能,但存在四大痛点:路径处理复杂易错、资源泄漏风险高、编码混乱导致乱码、阻塞式IO效率低下。这些问题在大文件和并发场景下尤为突出,促使后续版本不断改进。通过路径标准化、自动资源管理、统一编码处理和非阻塞IO等优化,Java逐步解决了这些痛点,使文件操作更安全高效。理解这一演进过程,有助于开发者规避常见问题,选择最适合当前场景的文件操作方法。

2026-02-11 11:09:53 398

原创 Java IO三大模型(BIO/NIO/AIO)超详细总结

本文通过生活化的「烧水做饭」场景,生动讲解了Java IO模型的核心概念。首先区分了同步/异步(执行顺序)和阻塞/非阻塞(自身状态)两组关键概念,并分析了四种组合方式。然后回归技术主题,详细解析了Java三大IO模型:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)的实现原理、特点及适用场景。NIO通过通道、缓冲区和选择器实现高效的多路复用,是当前高并发网络编程的主流方案。全文用通俗易懂的类比帮助开发者深入理解IO模型本质,掌握不同场景下的技术选型。

2026-02-09 16:36:33 708

原创 踩坑实录!MySQL JOIN+特定条件,竟让生产环境数据“凭空消失”?

今天遇上了一件郁闷的事:生产环境有个导出接口,反馈说查出来的数据总是少一部分,明明后台列表能正常看到所有数据,数据库里也确认有对应数据,可导出文件就是“漏数”。更奇怪的是,测试环境用相同的SQL、相同的测试数据,查询结果完全正常,没有任何数据丢失。

2026-02-06 16:04:51 585

原创 传统Restful API快速集成AI Agent:3种方案+选型指南

摘要: 本文针对企业如何将传统Restful API快速接入AI Agent的问题,提出三种实用方案: 直接使用AI Function Call:简单快捷,适合小型项目,但扩展性差; 创建MCP中间层服务:适配微服务架构,分工清晰,但需额外开发成本; Higress+Nacos自动转换:零代码配置,高效低成本,但需环境支持。 选型建议:小型项目选方案1,中大型微服务选方案2,已用Nacos的项目优先方案3。核心逻辑是平衡效率与维护性,根据项目规模灵活选择,让AI Agent真正“落地可用”。

2026-02-05 14:48:36 636

原创 Spring Boot 使用 PageHelper 分页异常:排序引发的“隐形坑”全解析

做Spring Boot项目开发的小伙伴,大概率都用过PageHelper做分页查询——毕竟它简洁高效,一行代码就能实现分页,之前项目里一直用得顺风顺水,从没出过错。可就在昨天,分页突然“罢工”了,排查了大半天才找到根源,今天就把这个踩坑经历分享出来,帮大家避开这个隐形陷阱!

2026-02-04 15:12:51 537

原创 Java ThreadLocal取不到值的三种原因

ThreadLocal 取值为 null 的三大原因解析 线程隔离问题:ThreadLocal 变量是线程绑定的,不同线程操作同一 ThreadLocal 会导致取值失败。例如线程A set 的值,线程B get 会返回 null,这是最常见的误用场景。 类加载器隔离问题:当同一个类被不同类加载器加载时,会生成不同的 ThreadLocal 实例,导致 set/get 操作的不是同一个对象。典型场景如 Spring Boot DevTools 热部署时。 父子线程隔离问题:默认情况下,子线程无法继承父线程的

2026-02-02 16:12:57 598

原创 spring-boot 升级版本引发的灾难

摘要:Spring Boot版本升级中,从1.x直接升级到2.x引发生产事故,主要问题包括JSON时间戳序列化默认值变更和依赖冲突(如easyExcel与poi版本不匹配)。正确升级需区分版本类型:修订版(Patch)建议及时升级,次版本(Minor)优先兼容处理,主版本(Major)需谨慎权衡收益与风险。升级核心在于"稳进"而非"追新",应充分测试验证,规避风险。掌握版本迭代规律和升级策略,才能发挥版本优化的价值。

2026-01-30 16:39:58 669

原创 还在手写 DTO 转换?Spring Boot + MapStruct 让对象映射效率翻倍

本文介绍了Spring Boot开发中对象映射的高频场景及传统方式的痛点,重点推荐使用MapStruct作为编译期对象映射工具。通过对比手动set/get方法和反射工具的不足,阐述了MapStruct基于编译期生成代码的优势,包括高性能、类型自动转换、编译期校验等特性。文章详细展示了MapStruct的配置方法,包括Maven依赖和IDE插件安装,并提供了实际应用示例,说明如何通过注解驱动实现DTO与实体类之间的高效转换。MapStruct能显著提升开发效率,是Spring Boot项目中对象映射的理想解决

2026-01-28 10:30:09 334

原创 MyBatis 多数据库适配 “坑”:databaseId 导致启动正常、运行报错?

摘要:MyBatis 3.5.16版本前存在databaseId使用隐患,多数据库适配时若启动阶段连接异常会导致静默失败,后续执行SQL抛出绑定异常。问题根源在于VendorDatabaseIdProvider在连接异常时返回null且未校验,导致无法匹配专属SQL。该问题排查困难,可能引发生产事故。解决方案建议升级至MyBatis 3.5.16+,该版本已修复此问题,在连接异常时会直接抛出异常阻断启动。

2026-01-26 17:24:56 782

原创 MyBatis SQL执行流程详解

本文详细解析了MyBatis执行SQL查询的核心流程,重点分析了select list操作的完整执行链路。通过编程式调用示例展示了从环境配置到结果获取的全过程,并深入剖析了关键组件(如SqlSession、Executor、StatementHandler等)的协作机制。文章还通过流程图和代码解析,系统阐述了Mapper代理对象创建、SQL分发执行、参数处理及结果映射等关键环节。最后介绍了Configuration作为核心工厂类的实现原理,揭示了MyBatis通过拦截器链实现扩展能力的底层机制。全文以150

2026-01-22 17:06:49 885

原创 Spring Boot 为何不推荐使用@Autowired

Spring不推荐使用@Autowired注解,因其存在三大问题:1)隐式注入降低代码可读性;2)可能导致初始化阶段使用不完整对象;3)多Bean匹配时存在歧义风险。@Autowired按"先类型后优先级"规则查找Bean,包括@Primary注解、名称匹配和泛型筛选。Spring Boot推荐使用显式注入方式:构造函数注入(首选,解决前两个问题,支持不可变对象)和setter注入(适用于可选依赖)。此外,@Resource注解提供名称优先的替代方案。企业开发应优先采用构造函数注入,确保

2026-01-21 17:33:56 1101 2

原创 Java 流(Stream)核心知识详解

摘要:Java中的流(Stream)是处理I/O操作的抽象概念,分为操作目标分类(设备流和包装流)和数据类型分类(字节流和字符流)。设备流直接与底层存储交互,如ByteArrayInputStream和FileInputStream;包装流如BufferedInputStream则增强基础流功能。字节流处理8位数据,字符流处理16位文本并自动编码转换。常见流类包括文件I/O流、缓冲流、数据转换流等,各自适用于不同场景如高效I/O、线程通信或数据压缩。理解流分类及特性对优化Java程序I/O处理至关重要。(1

2026-01-20 08:37:31 759

原创 Spring Boot启动秒退无日志,竟藏双重致命陷阱

Spring Boot项目启动时突发静默闪退,控制台无任何异常输出。经排查发现两个关键原因:一是日志系统初始化晚于异常触发,导致无法记录错误;二是Spring Boot覆盖了JVM原生异常处理机制,而自定义处理又依赖未就绪的日志系统。最终定位到logback依赖冲突引发的NoSuchMethodError。建议注意启动时序、理解异常处理层级,并善用依赖分析工具排查冲突。该案例揭示了框架底层机制对问题排查的重要性。

2026-01-19 08:58:33 802

原创 Java常见集合详解

本文系统介绍了Java中常见集合类的分类、实现原理和特性。主要分为List、Set、Map、Queue/Deque四大类,详细分析了各集合类的底层数据结构(数组/链表/红黑树/跳表等)、线程安全机制(synchronized/CAS/ReentrantLock等)和适用场景。重点阐述了ArrayList的动态数组扩容、HashMap的哈希冲突解决、ConcurrentHashMap的分段锁优化等核心实现机制,并对比了各集合类在有序性、并发性、边界限制等方面的差异。文章为开发者根据不同业务场景(如高并发、有序

2026-01-15 09:49:58 640

原创 Shiro登录验证与鉴权核心流程详解

本文系统解析了Shiro框架在Web安全架构中的登录验证与权限控制机制。Shiro通过过滤器链实现URL级别的粗粒度校验,结合拦截器完成方法级细粒度权限控制,形成双层安全防护体系。文章详细剖析了核心组件(如Subject、SecurityManager、Realm等)的协同工作原理,梳理了登录验证流程的关键方法调用链路,并重点分析了过滤器与拦截器的实现逻辑。通过七个维度的深度拆解,为开发者提供了构建安全防护体系的实践指导,帮助实现从请求入口到业务逻辑的全链路安全管控。

2026-01-12 08:39:26 567

原创 Spring7 HttpHeaders 变更,RestTemplate使用时需警惕

Spring 7中HttpHeaders不再继承MultiValueMap接口,改为专注处理HTTP头规范。这一变更解决了因大小写混用导致同一HTTP头被重复处理的问题,避免了违反HTTP规范的潜在风险。开发者只需将原有entrySet()方法替换为新的headerSet()方法即可完成迁移。该优化使HttpHeaders职责更明确,处理更规范,提升了代码稳定性和维护性。虽然属于破坏性变更,但迁移成本低,且能从根本上解决HTTP头处理的兼容性问题,是值得升级的改进。

2026-01-08 07:30:10 743

原创 堆OutOfMemoryError后进程没有立即结束?

摘要: Java程序抛出OutOfMemoryError: Java heap space异常后不会立即终止,因为堆OOM是线程级异常,但最终仍会崩溃,因共享堆内存耗尽。OOM线程终止后仅释放少量内存(私有内存及未被其他线程引用的对象),程序难以恢复。捕获OOM仅适合紧急清理(如保存数据、关闭资源),无法修复内存问题。生产环境建议添加-XX:+ExitOnOutOfMemoryError参数并配套监控与自动重启机制。不同OOM类型(如方法区、线程资源耗尽)影响各异,需针对性处理。根本解决仍需排查内存泄漏或调

2026-01-07 07:32:22 805

原创 编程趣事:“结构化并发”名字的由来

本文探讨了"结构化并发"概念的起源及其与结构化编程的关系。文章从结构化编程的历史讲起,指出1968年Dijkstra提出的"顺序、选择、循环"三大结构解决了goto语句导致的"面条代码"问题。随后将这一思想延伸到并发编程领域,指出传统并发编程存在"野线程"和资源泄漏问题,而结构化并发通过引入任务作用域(如Java的StructuredTaskScope),使父任务能够管控子任务的生命周期,确保所有子任务完成或异常处理后父任务才结

2026-01-06 07:31:50 558

原创 线程池深度解析:核心原理、属性与应用

线程池核心机制与应用解析 线程池通过规范化线程管理解决多线程编程中的资源消耗、内存溢出和CPU过载问题,实现线程复用、资源控制和性能优化。其核心属性包括线程数配置、任务队列和超时策略,通过动态调节线程数量匹配任务需求。线程池具有RUNNING、SHUTDOWN、STOP和TERMINATED四种状态,通过shutdown()和shutdownNow()方法触发状态转换。任务提交流程遵循"核心线程优先-队列缓冲-非核心线程扩容-拒绝策略"的层级逻辑。Java提供的CachedThreadP

2026-01-05 08:55:54 488

原创 Java 9 ~至今 常用新语法/特性总结

以下是对 Java 9之后核心新特性的总结,帮助开发者快速掌握新版本特性的应用方式与设计初衷。

2025-12-31 07:29:22 844

原创 Spring 7小细节太贴心!基本类型数组检查,用==替代instanceof更轻快

摘要:Spring 7针对基本类型数组类型检查进行了优化,用==替代instanceof。这一改动利用基本类型数组无继承关系的特性,通过直接比较Class对象地址来提升性能,实测可快15%-20%。同时使代码意图更明确,明确表示仅需精确匹配类型。但需注意该优化仅适用于int[]等基本类型数组,对象数组仍需使用instanceof以保证继承关系的正确判断。这体现了Spring在细节处的优化思路:根据语言特性选择最合适的实现方式。

2025-12-30 08:40:43 682

原创 Spring Boot OAuth2 授权码模式开发实战

本文介绍了OAuth2核心组件与Spring Boot集成方案。首先解析了OAuth2的三大核心组件:授权服务(负责颁发令牌)、资源服务(验证令牌访问资源)和客户端(请求访问资源)。接着详细说明了Spring Boot默认开放的端点,包括OAuth2授权端点(/oauth2/authorize等)、OIDC端点(/userinfo等)以及表单登录端点(/login等)。最后提供了环境准备方案,采用授权服务与资源服务合并部署架构,并列出服务端和客户端所需的基础依赖,包括Spring Boot Web、Secu

2025-12-26 10:09:48 1060

原创 OAuth 2.0 超详细总结

摘要:OAuth 2.0是一种开放授权协议,允许第三方应用在不获取用户密码的情况下安全访问用户资源。协议定义了四个核心角色:资源所有者(用户)、客户端(第三方应用)、授权服务器和资源服务器。OAuth 2.0提供五种授权模式:授权码模式(最安全,适用于有后端的应用)、简化模式(适用于纯前端应用)、密码模式(仅限高度信任场景)、客户端凭证模式(用于客户端访问自身资源)和刷新令牌模式(用于续签过期令牌)。每种模式通过不同流程确保安全性,其中授权码模式通过授权码间接获取令牌,是最常用的实现方式。

2025-12-26 09:39:37 681

原创 Java 并发进化史:从踩坑到躺赢

本文以「遇问题 - 解问题」主线,梳理 Java 并发从手动控线程的蛮荒时代,到 JUC 工具革新、CompletableFuture 简化异步,再到虚拟线程突破并发瓶颈、结构化并发管控任务的完整进化史,拆解核心痛点与技术突破,清晰呈现其轻量化、极简化的演进脉络。

2025-12-25 08:38:54 959

原创 救命!Java并行流越用越卡?

摘要:本文通过开发人员小王优化数据统计接口的案例,揭示了Java开发中常见的并行流使用误区。当处理1万条用户数据时,小王使用并行流反而导致性能下降,原因是ForkJoinPool在小数据量场景下拆分合并开销过大。文章指出:1)分治任务适用性取决于数据量大小而非单纯可分治性;2)提出了判断数据量大小的基准测试方法;3)给出了不同场景下的线程池选型建议(大数据量用ForkJoinPool,小数据量用ThreadPoolExecutor);4)通过正反例对比展示了性能差异。核心结论是线程池选型需匹配任务特征,避免

2025-12-24 08:38:23 1042

原创 三次惊魂生产事故!Java日期处理的“渡劫”之路

摘要:本文通过某电商平台的三次生产事故,揭示了Java日期处理API的演进历程。从Java 1.0的Date类(月份从0计数、年份需减1900、可变性)引发订单统计错误,到Calendar类(线程不安全、API繁琐)导致促销时间混乱,最终在Java 8的java.time包中实现完美解决方案(不可变设计、清晰API、时区支持)。文章强调良好的API设计源于解决实际问题,正确选择工具是系统稳定性的关键。

2025-12-23 08:50:30 451

原创 SLF4J 整合 Log4j2 的初始化流程深度解析

本文详细解析了SLF4J与Log4j2的绑定机制及初始化流程。SLF4J作为日志门面框架,通过绑定机制解耦日志接口与实现,支持动态绑定(运行时配置)和静态绑定(编译期约定)两种模式。静态绑定是SLF4J的核心方式,依赖StaticLoggerBinder类实现与Log4j2的桥接。文章深入剖析了LoggerFactory的初始化流程,包括双重检查锁、状态管理和工厂获取等关键环节,并对比了两种绑定模式的特性差异。通过超市付款的类比,形象说明了动态绑定的灵活性与静态绑定的高效性。

2025-12-22 08:47:33 952

原创 放弃Shiro的N个理由: Spring Security 让安全开发 “零门槛”

Spring Boot开发中,Spring Security相比Shiro具有显著优势:表单登录实现上,Security零配置自动生成登录页和处理逻辑,而Shiro需要手动配置过滤器链和路径;密码加密方面,Security内置多种强哈希算法自动处理,Shiro则需开发者自行实现加密逻辑。这些开箱即用的特性使Security成为Spring生态下的首选安全框架,能大幅减少重复代码编写,让开发者更聚焦业务逻辑。

2025-12-19 08:32:08 889

原创 Apache Tomcat 体系结构深度解析

本文深度解析 Apache Tomcat 体系结构,梳理核心组件协作逻辑,拆解请求处理三阶段流程,结合关键源码,呈现从协议解析到 Servlet 调用的完整链路。

2025-12-18 09:08:34 782

spring ai alibaba + nacos +mcp mcp服务负载均衡调用实战

# 一、项目实现目标 项目目标是完成传统SASS服务向MCP服务的转型,并实现MCP服务的负载均衡调用,具体目标如下: - **服务转型**:将现有的传统SASS服务快速、高效地封装并转换为MCP(服务,复用原有业务逻辑,降低转型成本。 - **负载均衡**:实现MCP服务的多实例部署与负载均衡调用,通过Nacos服务注册与发现机制,分发请求流量,避免单实例压力过大,提升服务可用性。 # 二、项目运行环境 项目基于Spring生态搭建,依赖以下核心组件,各组件版本及作用明确如下,确保组件间兼容性与功能正常发挥: - **NACOS 3.1.1**:作为服务注册中心与配置中心,支持MCP服务的注册、发现与配置管理,为MCP服务的负载均衡提供基础支撑,确保服务实例可被正常识别与调用。 - **Spring AI Alibaba**:提供ReactAgent组件,该组件是对Spring AI ChatClient的更高层次封装,集成了Agent开发常用的工具调用、拦截器、内存存储等能力,简化Agent端的开发流程。 - **千问大模型(qwen-flash)**:与Spring AI Alibaba深度集成,无需额外复杂配置即可快速调用,为Agent端提供自然语言交互与逻辑处理能力,支撑控制台的对话式服务调用。

2026-03-03

Spring Boot OAuth2 授权码模式开发实战源码

1.Spring Boot OAuth2 授权码模式项目 2.包含客户端和服务端(授权服务,oidc,资源服务) 3.集成了两个三方登录示例,slef:自己实现,gitee:gitee实现 4.基于spring-boot3实现

2025-12-25

Spring Boot JWT登录授权使用指南(无感刷新)源码

## 功能特性 - 基于JWT的认证授权 - 支持刷新token - 自动无感刷新即将过期的token - 基于MySQL的用户存储 - 基于Redis的refresh token存储 - 基于Redis的用户信息缓存 - 过滤器优先从缓存获取用户信息以提高性能 ## 技术栈 - Spring Boot 2.7.14 - Spring Security - JWT (jjwt) - MySQL - MyBatis Plus - Redis - JUnit 5 - OkHttp ## 核心实现 ### 1. JWT工具类 `JwtUtils` 类负责生成和验证JWT token,包括access token和refresh token,支持自定义过期时间和密钥。 ### 2. 认证过滤器 `JwtAuthenticationFilter` 类负责从请求头中提取token,并验证token的有效性,然后将用户信息存入SecurityContext,实现了无状态认证。 ### 3. 刷新过滤器 `JwtRefreshFilter` 类负责检查access token是否即将过期,如果即将过期则自动生成新的access token,并添加到响应头中,实现无感刷新。 ### 4. 认证服务 `AuthServiceImpl` 类负责处理登录和刷新token的业务逻辑,包括用户认证、token生成和存储: - 使用Redis存储refresh token以支持安全的令牌刷新机制 - 设置与token过期时间一致的缓存过期时间 - 在refresh token验证时,检查Redis中存储的token是否与请求中的一致

2025-12-11

spring-boot swagger3 使用示例项目

这是一个Spring Boot Swagger3示例项目,展示了Swagger3的各种配置项和特性,包括API文档生成、接口测试、参数验证等。 ## 技术栈 - Spring Boot 3.3.5 - Swagger3 (springdoc-openapi) - Knife4j UI (增强版Swagger UI) - Java 21 - OKHttp (用于单元测试) ## 开发环境 - JDK 21 - Maven 3.6+ - IDE (IntelliJ IDEA 或 Eclipse) ## 访问接口文档 项目启动后,通过以下地址访问Knife4j UI(增强版Swagger UI): ``` http://localhost:8080/doc.html ``` 同时,仍然支持默认的Swagger UI: ``` http://localhost:8080/swagger-ui/index.html ``` ## Swagger3特性展示 本项目展示了Swagger3和Knife4j的以下特性: - API分组和标签(用户管理、订单管理、产品管理) - 接口描述和参数说明 - 请求体和响应体示例 - 状态码和响应描述 - 认证配置(JWT Bearer) - 外部文档链接 - 分页和排序参数 - 文件上传支持 - 批量操作支持 - 各种数据类型和格式 - 美观的Knife4j UI界面 - 支持文档导出 - 在线调试功能 - 全局参数配置

2025-12-10

工业总线协议深度对比:帧结构、速率与实时性解析

工业总线协议深度对比:帧结构、速率与实时性解析

2025-11-11

java-jdbc-数据库连接小工具

简单的数据库连接小工具

2025-11-11

java-日期工具了-基于apache日期工具的二次封装

基于apache日期工具的二次封装,常用方法封装

2025-11-11

java-模拟浏览器历史记录功能

模拟浏览器历史记录功能 需要maven 测试类:BrowseStack.main(String[])

2025-11-07

java-springmvc-比较对象属性值是否改变

根据指定主键(默认id),比较对象是否改变(属性值),并返回改变的属性。常用于spring-mvc 修改时判断属性书否改变 测试类:BeanChangeUtil.main(String[])

2025-11-07

java-asm,反射-实现spring调用controller方法小工具

jdk8 java_asm,反射_实现spring调用controller方法小工具 通过a.b.c的方式绑定属性 测试方法:AttrBind.main(String[])

2025-11-07

java+访问者模式+遍历bean属性小工具

java+访问者模式+遍历bean属性小工具

2025-11-07

空空如也

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

TA关注的人

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