踩坑实录:接口正常Feign调用字段值为空
Feign字段取不到值问题解析Postman直接调用接口时数据正常,但通过Feign调用时字段值却为null。起初怀疑是Feign配置问题,经过排查后才发现问题出在字段命名上——mName这类单字母驼峰命名被Jackson按规范推断为MName,导致大小写不匹配。 这种约定冲突比技术难点更难防范,耗费了半小时才搞清楚原因。 问题现象接口返回的客户信息如下: 1234{ "mName": "51石雷", "cAddr": "张东路1387号"} 对应的实体类定义为: 12345@Datapublic class CustomerInfo { private String mName; private String cAddr;} 从表面上看,字段名与JSON中的键值一一对应,似乎没有问题。然而,实际测试发现mName和cAddr的值始终为null,而其他字段则正常。 问题排除首先排除了接口本身的问题。通过Postman直接调用接口,数据...
踩坑实录:读写分离导致批量删除逻辑问题
最近在帮同事review代码时,发现一段逻辑看似正常但执行结果却不符合预期的代码,特此记录问题排查过程。 原始代码实现12345678910111213141516171819202122@Overridepublic void clearExpireOrder(LocalDate expireDate) { log.info("开始清理过期订单, 过期日期: {}", expireDate); int batchSize = 200; long totalDeletedCount = 0; while (true) { List<ExposureOrder> expireOrders = this.list(Wrappers.<ExposureOrder>lambdaQuery() .select(ExposureOrder::getId).le(ExposureOrder::getAdEndDate, expireDate.a...
Java应用启动慢、接口超时、频繁Full GC?别再把锅甩给JVM了!
💡TIP一次线上扩容实验,揭开隐藏在@RefreshScope背后的性能杀手 问题现场:扩容反而引发告警风暴最近,我们的服务在业务高峰进行一次常规扩容,新增了两个POD。本以为能平滑分担流量,结果启动后不久,P1级别接口超时告警和频繁Full GC告警接连爆发。 从监控图可以清晰看到: 新启动的POD在刚接收流量的前几分钟,接口平均耗时飙升到秒级; JVM的Full GC次数陡增,Old区几乎被打满; 运行几分钟后,一切又逐渐恢复正常。 这种现象并非第一次出现,我们注意到应用启动时也会出现类似的现象。扩容或者重启变成“陪葬”,到底是谁在作祟? 结论先行:@RefreshScope的滥用团队没有止步于表象,而是深入Spring Cloud源码,并结合Demo进行复现,最终锁定了“真凶”——**@RefreshScopel滥用**。 @RefreshScope的初始化“陷阱”在我们的应用中,大量Controller、Service类上都标注了@RefreshScope,初衷是为了实现Nacos配置的热更新。然而,这个注解的初始化行为却暗藏玄机: 普通Bean:...
零代码经验,我用Claude Code搓出的生产力工具
SmartScribe:一个让AI自动帮你整理笔记的Obsidian插件。支持6大AI平台,一键生成标题、标签、分类、摘要,还能智能优化写作。 这个项目的特殊之处不在于功能——在于它的代码100%由Claude Code生成。作者是一个后端程序员,一行前端代码都没写。 为什么要做这个项目痛点:笔记整理是道坎我用Obsidian写了3年笔记,积累了很多篇文章。但整理成了最大的负担: 标签混乱:今天用 #工作,明天用 #work,后天用 #项目,搜索时永远不全 分类困难:一篇笔记该放哪个文件夹?纠结5分钟,最后扔根目录 标题随意:随手记的笔记,标题经常是”临时记录”、”想法”,过两周自己都不记得是什么 摘要缺失:长篇笔记没有摘要,笔记发布博客时总结摘要很烦 试过手动整理,坚持不了一周。也试过其他插件,要么功能太死,要么功能不能完全支持我的需求。 契机:AI能读懂我的笔记了我开始尝试让AI帮我整理单篇笔记——把内容贴过去,让它生成标题、标签、分类、摘要。 效果出奇地好。AI不仅能理解内容,还能根据已有笔记的命名习惯给出建议。 但流程太麻烦:复制 → 打开浏览器 → 粘贴到对话框 →...
容器化后内存告警不断?日志“写爆”了Page Cache!
💡Tip服务在虚拟机上跑得好好的,容器化上 K8s 后却频繁触发内存超限告警,甚至 OOM Kill?堆内存才用了不到 10%,Pod 内存却飙到 80% 以上,到底是什么情况?本文将层层拆解,揭开容器内存暴涨的真相。 诡异的现象:JVM 很健康,Pod 却要“撑爆”了Java 服务容器化部署到 Kubernetes 后,Pod 内存使用率持续缓慢上升,频繁超过 80%,甚至触发 OOM 导致 Pod 重启。 资源配置如下: 123456789resources: requests: memory: 2200Mi cpu: 1000m limits: memory: 3000Mi cpu: 3000m JAVA_OPTS='-Xmx2000m' 按理说,JVM 堆内存只占 2000Mi,Pod limit 给了 3000Mi,还有近 1G 的空间给堆外、Metaspace 等,应该足够富裕。可为什么内存会超限呢? 排查过程:堆内存正常,堆外也正常,那内存去哪了?首先排查 JVM 堆内存进入容器,用 jhsd...
Harness Engineering 究竟是什么
💡TIPHarness Engineering 究竟是什么?不是又一个AI营销概念,而是AI从能说会道迈向能干成事的关键分水岭!本期深度拆解AI工程演进的三层核心:Prompt Engineering(让模型听懂你)、Context Engineering(让模型看到该看的信息)、Harness Engineering(让模型按目标完成任务)。为什么调用同样的模型,不同的AI Agent表现却天差地别?答案不在模型参数中,而在包裹模型的那套工程框架,这就是Harness Engineering ,它不是锦上添花的优化,而是决定AI能否落地生产的基础设施。 AI系统落地过程中,一个日益凸显的核心问题是:Agent的稳定性不仅取决于模型本身。真正决定AI Agent能否稳定工作的因素,往往不是模型,而是包裹模型的工程系统。 大语言模型的本质是什么?——高维概率预测说白了,大语言模型就是一个巨大的参数文件,平时它静静的躺在硬盘中,只有你将它加载到显存里,套上一层API再加一个聊天界面,它才会变成ChatGPT、Claude或者某种AI编程助手,无论它被包装成什么产品,...
Claude Code 通关手册(七):推荐 5 个 Hooks,代码质量提升 3 倍
💡TIP这是Claude Code通关手册的第八篇,推荐5个实用的Hook,代码质量提升 3 倍 上周三下午,我让 Claude Code 帮我重构一个老模块。 它干得挺快,噼里啪啦一顿输出。我切出去喝了口水,回来一看——它正准备把我一个还没有提交git的源文件直接覆盖掉。 手抖着点了“拒绝”,后背全是冷汗。 那一刻我突然意识到:不是 Claude 坏,是我太信任它了。 每次它问“我可以执行这个命令吗?”我都点“允许”,点多了就麻了。它要 rm -rf 我也点,它要改 .env 我也点——我把 AI 当成了不会犯错的神,但它只是个能力很强的实习生。 我翻了一遍 Claude Code 的文档,又刷了创始人 Boris 的 X。他分享了自己在用的几个 hooks,我全抄下来,砍掉一半,最后剩下 5 个。装上之后,Claude 还是那个 Claude,但我再也没怕过它。 Hook 到底是什么?3 秒钟理解你每次让 Claude 跑命令、改文件,它都会弹窗问你“行不行?”——这就是最后一道防线。 Hook 就是在弹窗之前或之后,自动跑一段你写好的脚本。 你想让它自动...
Claude Code通关手册(六):MCP协议完全指南
💡TIP这是Claude Code通关手册的第六篇,上一篇我们为Claude Code配置了专家团队,这一篇我们为他装上外部设备,让他从本地助手转变成互联网平台。 一个很形象的比喻:没有配置MCP的Claude Code就像是一个被关在房间里的天才。 它聪明、高效——能处理你扔给它的所有文件,却够不着外面世界的任何东西。你没法让它“去 GitHub 捞一下那个 Issue 的详情”,没法让它“看一眼最新的 API 文档长什么样”,更别提“进数据库里查一条记录”。它只能靠几个月前训练好的知识来猜,而软件世界每天都在变。 一旦接上 MCP,这道墙就消失了。 它开始具备“触角”——能直接读取 GitHub 上的讨论,能实时翻阅官方文档的最新版本,能连上你的数据库执行查询,甚至能跟你的项目管理工具、监控平台对话。 这不只是加几个功能,而是从离线助手到在线协作平台的本质跃迁。 MCP 是什么?——30 秒用“USB 接口”讲明白MCP 全称 Model Context Protocol(模型上下文协议),是 Anthropic 在 2024 年底推出的开源标准。 这个名字...
Claude Code通关手册(五):组建你的AI专家团队,子代理系统
💡Tip这是Claude Code通关手册的第五篇,这一篇将把“万能助手”变成一支专业队伍,各司其职、并行作战,这才是 Claude Code 的正确打开方式 先来看一个熟悉的场景你面对一个复杂的任务,突然萌生了这样的想法: “要是能有个专门负责探索代码库的助手,再有个专门审查代码的专家,还有个专注写测试的工程师,大家各司其职、同时开工,那该多爽?” ——这不是天方夜谭,这正是 Claude Code 子代理(Subagent)的核心价值。 什么是子代理?简单说,子代理就是给 AI 指定一个专门的角色。不再说“帮我搞定所有事”,而是明确告诉它:“你现在是测试员”、“你负责安全审查”、“你是重构专家”。 在技术层面上,每个子代理都是一个拥有独立上下文窗口的专用 AI 实例。当你在 Claude Code 主对话中下达任务时,Claude 可以判断该任务是否适合委派给某个子代理,由子代理独立完成后将结果摘要返回主对话。 为什么需要子代理?Claude Code功能确认很强大,但是在实际使用的过程中就会发现当我们让Cladue Code执行一些复杂的任务时并没有得到很...
Claude Code通关手册(四):自定义命令,告别手敲重复指令
💡Tip这是Claude Code通关手册的第四篇,这一篇我们要解锁一个让你效率再翻倍的功能——自定义命令。把那些每天都在敲的重复指令、复杂流程,变成一条简单的斜杠命令,从此告别手打。 你有没有这样的经历: 帮我检查一下代码风格,用 Google Java Format 帮我生成一下测试用例,用 JUnit 5,Mockito ,覆盖分支,测试类命名要 xxxTest 帮我review一下修改的代码,生成报告 …… 一两次倒还好,每天重复的输入实在是太累了,如果这些操作能变成一个斜杠命令,比如 /test 就自动生成单元测试,或者 /build 就运行编译 + 测试,那该多爽? Claude Code 的自定义命令(Commands)就是干这个的。 自定义命令是什么?简单说,就是 把一段你经常用到的提示词、指令甚至脚本,打包成一个以 / 开头的快捷命令。 比如你创建一个 /test 命令,里面写: 12345请为当前打开的 Java 类生成单元测试覆盖主要分支使用 Mockito mock 依赖测试类放到 `src/test/java` 下类名加上 `Tes...
Claude Code通关手册(三):CLAUDE.md深度实战
💡TIP这是Claude Code通关手册的第三篇,在上一篇中,我们搞定了权限设置,让Claude Code安全可控地访问你的文件。今天,我们将更进一步——用CLAUDE.md赋予它长期记忆,彻底告别每次对话都要重复交代技术栈的烦恼。 我来描述一个场景,你看有没有中过招—— 周一早上,你打开终端,启动 Claude Code,想赶紧收尾上周遗留的功能,你输入:为 OrderService 增加一个批量查询订单的方法,根据订单 ID 列表批量返回订单详情。 Claude 很快给出了一段代码。你扫了一眼,眉头就皱起来了——它用了 ArrayList 的 for 循环 + 单条 SQL,一条一条查。而你们项目里明明已经封装好了 batchQuery()。 你打字纠正:用 batchQuery(),不要手写循环查数据库。 Claude 回复:好的,我改用 batchQuery()。 然后重新生成代码——这次又忘了你们约定的异常处理规范:不要吞掉异常,也不要直接 e.printStackTrace(),而是要用 log.error 并抛出业务异常。 你补充:异常用 B...
Claude Code通关手册(二):搞清权限,效率翻倍
💡TIP这是Claude Code通关手册的第二篇,上一篇我们初步了解了Claude Code,这一篇要解决新手最头疼的问题——权限系统,搞清Claude Code的权限分配,让Claude Code真正能为我们提效 使用Claude Code的开发者,想必都经历过这样的崩溃场景: “我要读取pom.xml文件,可以吗?”——同意“我要将依赖写入pom.xml文件,可以吗?”——同意 当第10次弹出权限请求时,大多数人早已忍无可忍,只想大喊:”我全都同意了,你自己去运行吧!” 然而,当我们真正去查找解决方案时,才发现Claude Code有一个--dangerously-skip-permissions参数可以跳过权限确认。从名称就能看出,这是一个”危险”的选项。 我们并不需要采取如此极端的方式。权限系统实际上是我们的安全屏障,无需给予Claude Code全部权限。合理分配权限,能够在效率与安全之间取得完美平衡。 本文将教你如何善用权限系统,将那些烦人的权限提示转化为得心应手的工具,让它们从拦路虎变成遥控器。 五种权限模式:从保姆级守护到全自动飙车Claude...







