- 博客(67)
- 收藏
- 关注
原创 钱扣了,订单却没成功:分布式事务到底怎么兜底?
你买了一件 199 元的商品。支付完成,银行卡发来了扣款提醒,页面却提示“下单失败,请重试”。后台可能已经创建订单、分配库存、确认收款,只是订单服务没能完成最后的状态更新。用户关心有没有买成功,库存服务关心商品还能不能卖,支付服务则已经记录了一笔资金变化。每个服务单独看都可能没有做错,整笔交易却没有完成。案例、金额和状态名称均用于教学,不绑定具体框架。
2026-10-03 19:43:35
169
原创 消息队列,远不止“排个队”:从异步解耦到可靠交付
设想这样一幕:用户付款成功,订单页面已经显示“已支付”,积分却迟迟没到账。排查后发现,积分服务昨晚重启过,重启前正在处理的消息又被投递了一遍。为了避免重复加积分,开发者加了一个判断;流量一大,两个线程同时通过判断,积分又多发了一次。消息队列的工程问题,经常就藏在这些看起来已经解决的细节里。你可能已经听过“异步、解耦、削峰填谷”。这几个词解释了为什么引入 MQ,却没有回答另一些问题:消息发送超时算失败吗?消费成功的标准是什么?数据库已经提交,消息还没发出去怎么办?我们用一笔电商订单,把这些问题串起来。
2026-10-03 18:02:16
382
原创 Go Web 工程化:日志、配置与错误处理中间件,让服务「能上线」
var (ParamInvalid = &Err{Code: 40001, Msg: "参数错误"}NotFound = &Err{Code: 40404, Msg: "资源不存在"}Internal = &Err{Code: 50000, Msg: "服务器内部错误"}Code intMsg string我们从「能跑」走到了「能上线」。配置(viper):配置与代码分离,一份代码多环境部署,支持热加载、环境变量覆盖。日志(zap)
2026-09-01 15:30:00
408
原创 Go Web 实战:从 go mod 到单元测试,手把手搭一个完整服务
我们从「一个空目录」出发,走到了「一个能跑、分层清晰、带测试的 Web 服务」。go modgo.mod声明依赖、go.sum校验、整理——三招走天下。项目结构分层,每层职责单一。单元测试Test前缀 + 表驱动 + testify 断言 + httptest 测接口 + 接口假实现隔离数据库。完整服务:Gin 路由 → GORM 连库 → 三层架构 →main依赖注入组装。Go 的工程哲学,和它的语言一样——「简单、直接、约定优于配置」。没有 XML 配置文件,一个go.mod搞定依赖;
2026-09-01 09:30:00
241
原创 Go 内存管理全景:栈与堆、GC 三色标记与内存分配器,一次讲透
我们从「一个变量放哪」出发,一路挖到了 Go 内存管理的底层。回顾这条主线,其实就是三根支柱fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;Go 内存管理三根支柱① 栈与堆(变量放哪)逃逸分析决定栈=用完即弃 / 堆=GC托管② GC(内存怎么收)三色标记 + 写屏障并发、低延迟回收③ 内存分配器(内存怎么发)多级缓存、就近分配。
2026-08-31 22:30:00
308
原创 Go 并发编程全景:Goroutine、Channel 与 GMP 调度
很多语言把「并发」当成一个进阶话题、一块难啃的骨头;但 Go 不一样——。你只需要敲一个go关键字,就能随手拉起一个轻量级协程;再敲一个chan,就能让它们安全地通信。这套「
2026-08-31 17:48:53
454
原创 Agent 设计模式:五种经典模式全景,一次讲透
如果你写过代码,一定听过设计模式(Design Pattern)——单例、工厂、观察者、策略……它们不是「新技术」,而是**「前人踩了无数坑之后,总结出来的可复用的结构套路」**。比如「工厂模式」,解决的是「我不想在每个地方都new,想让创建对象的逻辑集中管理」这个问题。它没有新语法,只是一种组织代码的结构。Agent 设计模式,是同一套思想,搬到了「大模型应用」的领域。Agent 设计模式,就是「针对某一类任务,被反复验证有效的、组织大模型调用的结构方案」。它的核心不是「模型更强」,而是「
2026-08-29 16:00:00
459
原创 Agent 沙箱:给 AI 的「手」套上缰绳
沙箱,就是一个「受限的执行环境」——让 Agent 的操作,只能碰到「你允许它碰」的东西,碰不到「不允许碰」的东西。它不改变 Agent 的「能力」,而是改变 Agent 能力的「作用范围。
2026-08-29 09:15:00
151
原创 后端转全栈:前端思维转变(Vue 视角)
我们从后端老手那句「前端又乱又绕」出发,把前端最核心的思维转变过了一遍。最根本的转变:从「请求驱动」到「状态驱动」——视图是状态的函数,改状态视图自动变;变量流转:变量是「响应式状态」,常驻页面、改了自动更新,数据流是单向的;给后端传数据:后端怎么收、前端就怎么发,但请求是异步的,要await;处理后端数据:拿 JSON → 塞状态 → 视图更新,还要管 loading/空/错误三件套;数据隔离:组件是隔离单元,props往下、emit往上,共享数据靠状态提升或 Pinia;生命周期。
2026-08-28 16:13:20
686
原创 后端开发初学TypeScript
email?: string;// 可选属性(可以没有)// 只读(赋值后不能改)name: "小明",age: 18,// email 可以不写,因为是可选的特性定义内容方法签名属性 + 方法实现方式implements显式结构匹配(自动)可选属性无?标记只读final字段readonly用interface// todo.ts// 任务状态:用字面量联合类型,限定只能是这三个值// 任务数据模型id: number;
2026-08-28 14:43:12
195
原创 Go 并发进阶
多个 goroutine 同时读写同一个变量,且没有任何同步机制保护count := 0for i := 0;i < 1000;i++ {wg.Add(1)count++ // ❌ 1000 个 goroutine 同时改 count,数据竞争!}()wg.Wait()fmt.Println(count) // 每次跑出来的数都可能不一样,而且不是 1000fill:#333;important;important;fill:none;color:#333;color:#333;
2026-08-27 22:00:00
192
原创 Go 语言特性
/ 基本函数:func 函数名(参数) 返回类型// 参数类型相同可以合并写Go 函数最鲜明的特色是多返回值return 0, errors.New("除数不能为 0")// 调用if err!= nil {fmt.Println("出错了:", err)我们从「Go 到底是什么」出发,一路把它的语法和特性系统过了一遍。认识 Go:一门「简单、并发好、编译快」的语言,云原生的基础设施语言;入门func main起步,go rungo build一跑一编译;基础语法var:=
2026-08-27 17:41:09
328
原创 力扣 Hot100 · 哈希篇:三道题吃透「哈希表」
题目哈希的角色套路两数之和存「值 → 下标」边遍历、边存、边查字母异位词分组存「key → 分组」算特征 key,同 key 归组最长连续序列存「是否存在」集合判存在 + 剪枝fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;哈希表① 映射两数之和:值→下标② 分组异位词:key→列表③ 判存在连续序列:集合查存在一句话。
2026-08-25 11:22:53
306
原创 AI 黑话扫盲:Prompt、RAG、Fine-tuning……这些词到底在说啥?
我们从「听群友聊天像听天书」出发,把这堆 AI 黑话分门别类地扫了一遍盲。四大类:模型是什么、怎么说话、怎么变强、怎么干活;模型相关:LLM、Token、上下文窗口、参数、Temperature;提示词相关三种变强方式(核心):Prompt 是「换个说法」,RAG 是「开卷考试」,Fine-tuning 是「补课深造」;RAG 深入:检索 + 增强 + 生成,靠 Embedding 和向量数据库;Fine-tuning 深入:LoRA 省钱、RLHF 打分,能 RAG 就别微调;应用相关。
2026-08-25 09:30:00
1922
原创 Agent 的四大核心能力:感知、规划、记忆、执行
我们从「为什么有的 AI 只能聊、有的却能办事」出发,把 Agent 的四大核心能力完整拆了一遍。四大能力:感知、规划、记忆、执行,首尾相连成一个闭环;感知= 感官,把外部信息变成模型能理解的;规划= 大脑,把大目标拆成可执行的步骤;记忆= 记性,让信息跨越时间留存;执行= 手脚,把计划变成真实动作;协同:一个真实任务,是四能力反复接力的结果;短板:四块各有翻车点,可靠靠的是「兜底」,不是「完美」;上限:模型决定智商,四大能力决定本事,最短的板决定整体。
2026-08-24 16:38:26
464
原创 Java 快速转 Go
我们从 Java 老手的那句「这语言啥也没有」出发,把 Go 用 Java 的视角完整过了一遍。思维转换:从「面向对象」到「面向组合」;基础语法:类型后置、for一统循环、函数多返回值;类 → 结构体:struct + 接收者方法,值类型和指针要分清;继承 → 组合:嵌入(embedding)代替 extends,「组合优于继承」;接口:从显式 implements 到隐式「鸭子类型」;异常 → error:错误当返回值 +defer清理,显式且明确;并发。
2026-08-24 10:01:27
220
原创 Java 匿名内部类:藏在 `new` 后面的「无名英雄」
接口不是不能 new 吗?为什么这里能编译?你 new 的不是接口本身,而是「一个偷偷实现了这个接口、但没有名字的类」。
2026-08-22 15:00:00
192
原创 Lambda 与方法引用 :把代码写成「一句话」
在传统 Java 里,方法的参数都是「数据」——传个 int、传个 String、传个对象。但很多时候,我们想传的不是「一个值」,而是「一段逻辑 / 一个行为比如「排序」,你想传的是「怎么比大小」这个行为,而不是某个具体的数字。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;不够用传统:传数据sort(list, 某个值)需求:传行为。
2026-08-22 09:30:00
379
原创 Java Stream 流:让集合操作「优雅」起来,从入门到原理一篇通
Stream 不是集合,也不存数据。它更像一条流水线——数据从一头进来,经过一道道工序的加工,从另一头流出结果。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;stream()终止操作数据源(List / 数组)Stream 流水线工序① filter工序② map工序③ sorted结果(List / 数字 / 对象)
2026-08-21 15:50:12
633
原创 MySQL 事务:一文把 ACID、隔离级别、MVCC、锁全串起来
事务,就是「一组操作,要么全部成功,要么全部失败」的保证。回到转账的例子,这两步必须被绑在一起:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;是否开始事务① 你的账户 -100② 朋友的账户 +100都成功了?提交(Commit)两个改动都生效回滚(Rollback)两个改动都撤销如果没有事务,第一步成功、第二步失败,钱就丢了。
2026-08-21 14:50:36
433
原创 一个 HTTP 请求进来后,到底经历了什么?Spring MVC 完整链路拆解
我们从一个「回车」出发,追完了一个 HTTP 请求的一生。全景:Tomcat 接客 → Spring MVC 调度 → 业务代码干活 → 原路返回;是「总调度」,自己不干活、专管分发;问路,按 URL 找到 Handler 和拦截器链;当翻译官,把请求参数(尤其 JSON)变成方法入参;消息转换器进出两趟都在干活:JSON→对象、对象→JSON;拦截器在处理器前后盯梢,异常处理器在出事时兜底;AOP/事务是代理对象在方法外包的一层,就是这么来的;想拦截请求。
2026-08-20 09:00:00
1074
原创 Spring 启动全过程:从 main 方法到「万事俱备」,一文拆穿
就是 A 依赖 B,B 又依赖 A,形成了一个环:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;依赖依赖Bean ABean B问题来了:创建 A 需要先有 B,创建 B 又需要先有 A——先造谁都不行,死锁了。我们从一句出发,一路拆到了 Bean 的「生老病死」。启动分两大阶段:准备(环境 + 容器)→ 核心(refresh);
2026-08-19 09:30:44
217
原创 一篇文章讲清agent memory管理
因为模型处理每个字的成本是固定的,窗口越大,计算量越大、越慢、越贵。所以窗口总有上限(虽然这几年从几千 token 一路涨到了百万级,但「有限」这个本质没变)。这个「抽取要点」,学名叫状态压缩(State Compression)或记忆摘要(Memory Summarization)。当上下文快满了,就调用一次模型,把前面的一大段历史,总结成一小段摘要。fill:#333;important;important;fill:none;color:#333;color:#333;important;
2026-08-19 09:30:00
374
原创 Agent 工具编排:从「会聊天」到「能干活」,这一篇讲透
模型是概率机器,它「说」出来的参数可能五花八门。参数定义(通常是约束模型:告诉模型「order_id 必须是字符串、必须填」,减少它乱传;让宿主校验:宿主拿到参数后,先对照 Schema 检查一遍,不合法就拒绝,防止一个错的参数真去执行出事故。参数定义的两种典型形态:① 宽松(给模型自由发挥):② 严格(约束死,防出错):参数定义越严格,模型越不容易「跑偏」,但也会更死板;越宽松,模型越灵活,但出错的概率也越大。这是工具设计里第一个需要权衡的地方,后面还会反复遇到。
2026-08-18 15:01:41
803
原创 从零实现一个 MCP 服务:从协议到底层,手把手带你落地
先看一个痛点。假设你公司有一套内部系统,数据都在 MySQL、订单接口、日志平台里。你想让 AI 助手帮你查个订单、看个监控,怎么办?MCP 出现之前,每个 AI 应用要对接一个数据源,就得自己写一套接入层——数据库一个、API 一个、文件一个,全是"烟囱式"的私搭接口,改一个换一个:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;私有协议1。
2026-08-05 16:56:01
401
原创 一篇文章讲透 Elasticsearch:从倒排索引到实战落地
先跑起来:装个 ES + Kibana,把官方文档的"入门教程"走一遍;再懂原理:搞清楚倒排索引、分片副本、写读流程这三个核心;然后做项目:用真实数据去设计 mapping、写查询、做聚合,遇到性能问题再回头看原理;最后上规模:学集群运维、监控、调优。搜索不是"把数据翻一遍",而是"提前把数据准备好,查询时直达"。理解了这句话,你就理解了 ES 的一切。
2026-08-05 16:13:30
364
原创 科普 Harness 工程——AI Agent 时代的测试基础设施
Harness(测试脚手架)= 一套评估 / 测试 AI Agent 的基础设施:给 Agent 一个任务、给它一个运行环境、让它执行、记录结果、给出评分。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;important;important;color:#fff!important;important;important;color:#fff!
2026-07-17 14:32:38
262
原创 企业级实战级 RAG 系统遇到的各个问题以及评估指标——6 大问题 + 6 大指标精讲
RAG(Retrieval-Augmented Generation)= 检索增强生成,先从知识库检索相关内容,再让 LLM 基于检索结果生成答案。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;important;important;color:#fff!important;important;important;color:#fff!
2026-07-16 14:10:04
753
原创 Claude Code 如何在无索引机制下实现高效实时代码检索——6 大机制精讲
Claude Code = Anthropic 出品的 AI 编码助手,通过工具调用 + LLM 推理,在终端里直接读、写、执行代码,不预建代码索引就能毫秒级定位代码。ripgrep = 比 grep 快 10 倍的递归文本搜索工具,Claude Code 用它做"基于关键词"的代码定位。文件树遍历 = 按 glob 模式找文件(如**/*.java),配合 .gitignore 自动过滤。Embedding = 把代码片段转成向量,用"语义相似度"搜索,而不是"字符串匹配"。
2026-07-16 11:00:27
405
原创 从 0 学习 Java HashMap 源码解析——6 大核心精讲
HashMap = 数组 + 链表 + 红黑树的复合结构,根据 key 的 hash 值定位存储位置,平均 O(1)时间复杂度完成增删改查。fill:#333;important;important;fill:none;HashMap数组bucket下标 = hash % length链表哈希冲突时拉链红黑树链表长度 > 8 时转换HashMap 底层是一个 Node<K,V>[] 数组,每个数组元素是一个链表头(或红黑树根)。
2026-07-15 16:23:16
350
原创 从 0 学习 MySQL 索引——7 大核心精讲
索引 = 数据库的"目录",帮你从 100w 行里快速找到 1 行,不用全表扫描。类比:书的目录帮你快速找到某一章,不用翻整本书。聚簇索引:数据的物理存储顺序和索引顺序一致非聚簇索引:索引和数据分开存储覆盖索引 = 索引包含查询所需的全部字段,不需要回表。联合索引 (a, b, c) = 3 个索引:(a) + (a, b) + (a, b, c),但不是 (b, c)。索引下推(ICP)= MySQL 5.6+ 优化器把 WHERE 条件下推到存储引擎层,减少回表。
2026-07-15 16:11:33
276
原创 如何把长事务拆成小事务——一个 Java 后端实习生的 6 种拆分手段实战
长事务 = 事务范围过大、执行时间过长的事务(通常 > 1 秒就算"长")。业务拆分 = 按业务领域把"大事务"拆成"小事务",让每个事务只关心一件事。= 每个子方法用新事务独立提交,一个失败不回滚其他。状态机 = 用"状态字段 + 状态枚举"约束每个操作的前置条件,保证流程合法性。本地消息表 = 业务表 + 消息表在同一事务里写,由定时 job 投递到 MQ。MQ 异步解耦 = 不直接发 MQ,而是 Feign → msgcenter 中台,业务只关心业务。
2026-07-14 17:52:57
222
原创 EasyExcel SAX 流式读取 + 有界线程池 + CallerRunsPolicy——一个 Java 后端实习生的“导入三件套“实战
SAX(Simple API for XML)= 逐行扫描 Excel XML 流,不一次性加载到内存。有界线程池 = 任务队列容量有限的线程池,避免任务堆积导致 OOM。CallerRunsPolicy = 队列满时,由提交任务的线程自己执行任务。⭐📌——下次写 Excel 导入翻出来看看➕关注我——后续会更新异步回调 / 模板校验 / 重试机制系列💬评论区留言——告诉我你想看什么主题,我安排!我是程序员小八777。
2026-07-14 10:17:05
256
原创 从 0 学习 Docker——一个 Java 后端实习生的 7 大核心精讲(含项目实战)
Docker = 把应用 + 依赖 + 环境打包成一个"标准集装箱",在任何机器上一键运行。镜像 = 一个"只读模板",用来创建容器。可以理解成"装应用的 ISO 镜像"——是个模板,本身不运行。容器 = 镜像的运行实例。镜像是个"模板",容器是跑起来的进程。Dockerfile = “镜像的源代码”,用 DSL 描述怎么构建镜像。docker-compose = “多容器编排器”,用 YAML 文件一次性启动多个容器。数据卷 = “容器外挂硬盘”,把容器内的数据持久化到宿主机。
2026-07-13 14:12:17
433
原创 给 AI 编程代理一份仓库记忆:sverklo 让 Claude Code 改代码前先“看清全图“
sverklo 是一款本地优先的 MCP(Model Context Protocol)服务器,专门给 Claude Code、Cursor、Windsurf、Zed 这类 AI 编程代理用。它在代理动手改代码之前,先把你的仓库解析成真正的符号图 + 调用关系图 + PageRank 加权依赖图,再以37 个 MCP 工具的形式暴露给代理。代理不再是凭训练数据"猜函数名",而是直接调用lookup把名字解析到具体的file:line,调用refs列出所有真实调用点,调用verify。
2026-07-10 18:10:46
601
原创 N+1 查询问题
N+1 查询 = 查 1 次拿到 N 条主数据,每条主数据再触发 1 次子表查询,总共执行 N+1 次 SQL。MyBatis 不会自动 N+1,但 association / collection 写得不对就触发。JPA 默认懒加载,是 N+1 重灾区。用 @EntityGraph 或 JOIN FETCH 一次性查出来。MyBatis-Plus 不直接解决 N+1,但提供链式 + 自动填充让人少写错。// ✅ XML 写 JOIN(最干净)""")@Results({})
2026-07-10 10:45:22
225
原创 从 0 培养代码审美
很多新手以为"好代码 = 用设计模式 = 写得很抽象"。错!维度丑代码美代码命名注释// 加 1这种废话解释为什么而不是做什么函数80 行一坨,什么都做5–10 行,只做一件事格式缩进混乱、空行随机一致、可读设计改一处动全身低耦合、好扩展架构一锅粥分层清晰、职责明确fill:#333;important;important;fill:none;代码审美6 大维度微观 4命名注释函数格式中观 1设计宏观 1架构好的命名 = 不需要注释就能看懂。
2026-07-09 17:50:20
334
原创 从 0 学习 Java 异步编程
Future = “我给你一张提货单,货到了你来取”。提交任务时立刻返回Future,任务在后台跑,调用方通过get()拿结果。CompletableFuture = Future 的"完全体"。JDK8 引入,支持链式调用、异步组合、异常处理。Java 异步编程的"银弹"。@Async = “Spring 帮你调线程池执行”。在方法上加@Async,调用方立刻返回,方法在 Spring 线程池里跑。响应式编程 = “数据来一点就处理一点,不等你攒齐”。基于规范,Java 主流实现是Reactor。
2026-07-09 15:47:57
613
原创 从 0 学习 Java 设计模式——一个实习生的总纲 + 5 个最常用模式精讲
维基百科:在软件设计过程中,针对反复出现的问题,所总结出的可复用的解决方案大白话代码组织套路——遇到这种场景,就这么写类比:就像"菜谱"——遇到"客人都爱吃辣"就上"川菜套路"保证一个类只有一个实例,并提供全局访问点。把"创建对象"这件事封装起来,让调用方不直接new。定义一族算法,把它们一个个封装起来,让它们可以互相替换。给目标对象提供一个代理对象,由代理对象控制对目标对象的访问。动态地给对象添加额外的职责,比继承更灵活。
2026-07-07 16:55:38
203
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅