自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(324)
  • 收藏
  • 关注

原创 工作过程中常用的linux命令

该文章主要用于个人使用,纯粹是个人经验之谈ls //查看当前目录文件ll //查看当前目录文件详细信息,常用于查看权限cd //进入文件夹cat //查看文件vim 创建/查看/修改文件pwd //查看当前目录rm -rf //强制性删除文件及一下文件mkdir 创建目录/文件夹cp a b 把a文件复制到bcp -r a b 把a目录所有文件复制到bmv a b 把a改成b/移动到blsof -i:8080 查看8080端口占用情况kill -9 pid 删掉线程

2020-11-13 15:45:24 730

原创 Apollo 配置中心入门:一所“小学校“读懂 Portal、Meta Server、Config Service

不是必然,而是定位决定的。Portal 是 Apollo 的管理控制台(Web UI),面向人做配置的增删改、发布、权限与审计,所以天然做成浏览器可访问的图形界面。图形化只是 Portal 的前端表现,底层仍是 HTTP 接口;发布服务走的就是 Portal 的 Open API(),并不依赖页面。反过来,Meta Server 和 Config Service 是纯服务端只读角色,只提供 HTTP 接口(/configs),没有也不需要图形界面。

2026-10-23 17:05:04 349

原创 【零基础入门 LLM 开发 · Day 15】:LangChain 注册工具——告别手写 JSON Schema

Day 8-9 用原生 SDK 手写工具说明书:一个就写了二十来行 JSON Schema。工具一多,手写说明书又臭又长,还容易写错字段名。。

2026-10-15 15:12:38 293

原创 【零基础入门 LLM 开发 · Day 14】:让 AI 输出结构化 JSON

前面的 AI 输出都是"给人看的"。但真实业务里,AI 的输出经常要给程序用:程序读不了"张三今年28岁……"这种自由文本,只认 JSON。模型本身没有开关一键输出 JSON(OpenAI 协议有 参数,但兼容性看服务商),最通用的做法是:在提示词里把格式写死。本系列最大的语法坑:花括号要写两遍!盯住 system 那一行:——JSON 的花括号全部写成了双花括号。为什么?Day 10 说过, 里单花括号 是变量占位符。JSON 里一堆 ,框架会试图把它们当变量解析,直接报"找不到变量"或者渲染错乱

2026-10-14 09:45:51 50

原创 【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版

还是那个"历史列表 + 全量发送"的套路。区别只是——框架没变魔术,只是给了你更体面的写法。

2026-10-13 09:54:08 137

原创 【零基础入门 LLM 开发 · Day 12】:LangChain 流式输出——一行 for 循环的事

原生 SDK 的流式输出要:判delta是否为 None、判是否为 None、处理只在第一个 chunk 出现的role、自己拼full_reply……LangChain 把这些脏活都封装了。

2026-10-12 11:38:33 154

原创 【零基础入门 LLM 开发 · Day 11】:ChatOpenAI vs init_chat_model——一行换供应商

直接实例化,直观明了。——ChatOpenAI只会说"OpenAI 协议"这一种话。哪天想试 Claude、Gemini 或本地模型,每个文件都要改 import 和构造代码。。这篇讲清两者区别,顺便把常见供应商的接入写法一次备齐。

2026-10-09 09:40:57 490

原创 Spring Bean 生命周期 × Apollo 动态日志级别热更新(附完整代码)

项目里有一个 70 行的小工具类。

2026-10-08 17:49:13 389

原创 【零基础入门 LLM 开发 · Day 10】:LangChain 入门——一条管道符串起 prompt 和模型

用原生 SDK 九天下来,你可能已经发现:每次都要手写 client 初始化、手拼 messages 列表、手取……这些都是重复劳动。:prompt 是积木、模型是积木,你用管道符把它们串成流水线。

2026-10-08 10:34:43 204

原创 【零基础入门 LLM 开发 · Day 9】:工具描述的艺术——AI 靠“读说明书“做决策

Day 8 你可能没注意到:两个练习文件里的工具描述不一样。差别在哪?Day 9 的描述里多了:“如果用户没有指定具体城市,请询问用户。效果:当用户问"今天天气怎么样?"(没说城市)——

2026-10-07 09:58:25 167

原创 【零基础入门 LLM 开发 · Day 8】:Function Calling——让 AI 会“用“工具

AI 自己去执行函数。AI 是个活在服务器里的大脑,它碰不到你的电脑。,然后——由替它执行,再把结果喂回给它。

2026-10-06 09:48:10 187

原创 【零基础入门 LLM 开发 · Day 7】:Embeddings——把文字变成向量

前面 6 天都在"聊天"。但 AI 应用的另一半江山是答案都靠:把一段文字变成一串数字(比如 1024 个浮点数),。打个比方:把每句话放到一张巨大的地图上,"苹果"和"香蕉"住得近,"苹果"和"量子力学"住得很远。

2026-09-21 10:22:28 188

原创 【零基础入门 LLM 开发 · Day 6】:多轮对话记忆——一个列表撑起的“记忆“

很多初学者以为"AI 记得我们聊过什么"是模型自带的功能。Day 3 说过:模型是无状态的。所谓记忆,实现方式简单到离谱——模型每次都拿到完整剧本,自然演得像"记得一切"。

2026-09-19 17:04:25 54

原创 【零基础入门 LLM 开发 · Day 5】流式输出——打字机效果

前几天的写法有个体验问题:AI 生成 500 字,你就得,屏幕一片空白。ChatGPT 那种"字一个一个蹦出来"的效果,就是:服务边生成边推送,你边收边显示。总耗时没变,但,体验完全不同。

2026-09-18 10:02:42 147

原创 【零基础入门 LLM 开发 · Day 4】Temperature——让 AI 严谨或放飞

控制这种"稳重 vs 放飞"的旋钮,就叫。

2026-09-17 09:56:08 53

原创 【零基础入门 LLM 开发 · Day 3】读懂响应对象与 Token 用量

到今天为止,我们调用模型都是"发出去 → 拿回一句话",很粗放。

2026-09-14 10:59:24 160

原创 从一个应用开发者的角度,搞懂大数据查询的完整链路

作为一个应用开发者,最近在做数据查询相关的需求时,接触到了 Hue、Hive 表、Spark SQL、HDFS、MapReduce、YARN 队列这些概念。一开始真的是一头雾水——它们之间到底是什么关系?我写的一条 SQL,到底经历了什么才拿到结果?经过一段时间的学习和摸索,终于把整条链路搞清楚了。今天从一个应用开发者的视角,把这条链路从头到尾串一遍,希望能帮到和我一样困惑的朋友。│ 【顶层】用户 / 应用入口 │。

2026-09-14 10:24:57 407

原创 IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“

说明系统属性没注入成功:多半填进了"程序实参",或者改完没有重启进程。运行中的进程不受配置修改影响,必须停止后重新运行。下拉框(在主类下方,可能要往下滚动)选成了父工程对应的模块,宏照样解析到父目录。检查配置里"模块"下拉框是不是选成了父工程模块;VS Code 同样是"工作目录 + VM 参数"两件套,写在。),并把配置名改成带项目标识的名字,避免跑错项目还以为日志丢了。是不是填进了程序实参;就是"VM 选项"。多模块父目录打开时,同样靠每条配置的。:你以为工作目录是子项目,IDEA 默认给的却是别处。

2026-09-11 19:23:04 558

原创 SLF4J MDC + MdcTaskDecorator + ThreadPoolConfig:让 traceId 在线程池里“跟人走“

一篇写给初学者的实战博客。

2026-09-11 19:20:08 307

原创 【零基础入门 LLM 开发 · Day 2】:查看可用模型列表——先问服务端“你有什么“

昨天的踩坑点里说过:模型名写错会报。与其瞎猜,不如直接问服务端:“你这儿都有哪些模型可以用?这就像去餐厅先看菜单,而不是对着空气点菜。

2026-09-11 10:24:41 92

原创 配置明明开了,为什么生产不生效?——一次 Apollo 多 Namespace 注入问题的排查实录

脱敏说明:文中应用名、Apollo namespace、topic、IP / 域名、启动参数等敏感信息均已替换为通用占位(demo-app等),排查方法与结论保持原样。

2026-09-10 14:30:30 147

原创 【零基础入门 LLM 开发 · Day 1】:第一次调用大模型——你的第一个 AI 程序

它是唯一"真正的输入"——前面所有铺垫(system)都是为了这句话能得到你想要的回答。如果你把 user 放前面、system 放后面,模型虽然大概率也能理解,但行为可能变得不可预测——密钥就是你的"钱包密码",写死在代码里一旦上传 GitHub 就等于把卡号密码贴在小区门口。Day 2:调用之前,先看看服务端到底部署了哪些模型,避免"报 404 两小时,其实是名字写错"的惨案。大白话:你把一段话寄给大模型服务商的服务器,它算完把回复寄回来。做完这三个实验,你对"角色"的理解就超过大多数初学者了。

2026-09-10 09:34:02 237

原创 Redis 计数器加 TTL 的四种写法:从一个被低估的返回值说起

写法对比之前,先把地基说清楚。INCR的原子性来自 Redis 的命令执行模型:Redis 服务端用单线程顺序执行命令(Redis 6 引入的 I/O 多线程只负责网络读写和协议解析,命令执行仍然是单线程串行的所以任何时刻只有一个命令在真正操作数据,INCR天然没有"读-改-写"竞态——这和客户端里GET回来加一SET回去(两次往返 + 中间可能被插队)是本质区别。INCR对不存在的 key 自动从 0 开始返回 1;返回值就是自增后的新值。

2026-09-09 18:06:06 421

原创 一次 2.8s 请求延迟的排查:同步日志引发的血案

要点说明根因同步 Appender + DEBUG 开启 → 49 条/请求的 debug 日志在高并发下争抢锁 → 业务线程阻塞为什么改 INFO 就好49 条 debug 不再输出,锁竞争消失为什么不只是这两行日志timestamp 在事件创建时打,2.8s 是 log.info 排队等锁的时间,不是 toJSON 的时间AsyncAppender 的作用不是让日志变快,而是让业务线程不因日志 I/O 阻塞——即使发生 rollover/gzip/磁盘抖动isDebugEnabled 守卫。

2026-09-03 18:59:41 308

原创 缓存“卡点“之谜:一次定时任务与 TTL 撞车的排查实录

角色代码位置职责定时任务每 N 秒触发一次,调用预缓存方法预缓存方法查 Redis,有就返回,没有就拉取并写入TTL(默认 60 秒)Redis 中缓存数据的过期时间TTL(60秒)= 刷新间隔(60秒),且命中时不续期,导致缓存周期性空窗。约数= 能整除。60 能整除 60,所以 60 是 60 的约数。间隔TTL能否整除空窗问题60秒60秒60÷60=1 ✅~60秒过期紧跟上次任务,下次要等一整个间隔30秒60秒60÷30=2 ✅~30秒同理,空窗=一个间隔35秒。

2026-09-03 18:51:46 326

原创 Java JSON 库选型指南:Fastjson1、Fastjson2 与 Jackson 深度对比与实战

JSON 库的选型没有绝对的“最好”,只有“最合适”。追求生态兼容、安全稳定、标准规范,无脑选Jackson。追求极致性能、内部高频通信、二进制协议,选Fastjson2。至于,请让它留在历史的尘埃中。希望这篇总结能为你的项目选型提供清晰的参考。欢迎在评论区分享你在实际项目中踩过的 JSON 序列化坑!

2026-09-03 17:50:44 166

原创 JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录

fastjson 兼容包 ≠ fastjson2。只是为存量代码平滑过渡的桥:旧包名、旧 API 都在,但默认行为也对齐了 fastjson1——包括引用检测。看到依赖树里配 2.x 版本号,要意识到它底层跑的是 fastjson2,但行为开关仍是 fastjson1 那套。要根治$ref,切原生。迁移序列化框架,行为验证比 API 验证重要。javap能确认方法存在,确认不了语义变化。fastjson2 的不再解析字符串,这种差异 IDE 和编译器完全不会报错,只有运行时实测能暴露。

2026-09-03 17:43:31 418

原创 G1 与 GC 日志入门课程(以本次离线菜单 Full GC 事故为教材)

日志片段含义严重度日常年轻代回收正常young GC + 顺手启动后台并发标记正常巨型对象格子数变化,Y<X 说明救场成功观察成串大对象反复申请失败黄灯112M->108M纹丝不动活对象钉死堆,回收无效黄灯全堆整理,全站停顿红灯课后作业:打开自己找一遍这三盏灯;再打开对比——前两盏黄灯还在(请求对象造成的),但红灯一盏都没有。这就是修复的全部意义。

2026-08-28 15:35:48 466

原创 本地复现:菜单 Blob 单体分配触发 G1 Full GC(附 GC 日志证据)

目标:在本地复现"离线菜单 zstd 解压后落地为一个大byte[],在请求并发下反复触发 G1 退化 Full GC"的完整链条,拿出 GC 日志证据,并验证流式解压修复的有效性。复现时间:2026-08-28 JDK:17.0.15(与生产同版本线) GC:G1。

2026-08-28 15:22:22 349

原创 接口文档规范指南:以品牌推荐API为例

接口文档的本质是一份契约,而不是一份说明。自包含:仅凭文档即可完成联调,无需口头沟通可验证:每个约束条件都可以被自动化测试覆盖可演进:版本策略清晰,变更可追溯可追溯requestId贯穿全链路,任何一次交互都可定位可信赖:字段命名、类型、枚举值在文档、代码、日志中完全一致本文以品牌 App 推荐接口 v2.0 为实例为实例,涵盖了从请求体四象限设计、响应体双层错误码、版本控制策略到安全签名的完整规范。明确、一致、可演进。

2026-08-27 09:09:43 372

原创 Maven GAV 与 Java 包路径:硬规范、软约定与实战指南

Java 包路径的前缀应当与 MavengroupId保持一致或具有明确的派生关系,使开发者看到任意一个就能合理推断出另一个。│ Maven 世界(物流系统) ││ ││ ││ → 决定 jar 在哪、叫什么、怎么下载 ││ → 与包路径无关 ││ 下载 jar▼│ Java 世界(内容索引) ││ ││ ││ → 决定类在 jar 里的位置 ││ → 必须与文件目录一致(硬规范) ││ → 建议以 groupId 为前缀(软约定) │。

2026-08-21 16:45:17 348

原创 Aviator 表达式执行链路深度拆解:从词法分析、ASM 字节码到 Spring Boot Bean 动态调用

维度说明编译 vs 执行compile阶段做词法/语法分析 + ASM 字节码生成,结果缓存在;后续请求直接走execute0()函数名绑定编译期将函数名字符串写死为字节码常量;运行时通过动态查找函数注册时通过扫描所有子类,以getName()为 key 注册到funcMap模板方法模式负责从env取contextconfig,调子类doXxx(),子类只关心业务逻辑表达式 = 路由表达式字符串本质是在调用funcMap中对应的call(env)方法。

2026-08-21 16:32:15 393

原创 OkHttp 和 RestTemplate 到底是什么关系?——从本项目代码聊聊 HTTP 客户端的演变

OkHttp 是引擎,RestTemplate 是方向盘——它俩搭配使用,不是二选一。RestTemplate 默认引擎是老爷车(HttpURLConnection),本项目换成了 OkHttp 这辆跑车。行业在从 RestTemplate 走向 RestClient,本项目用提前铺好了路。下次再看到,你就知道——那不过是一个"转接头",把方向盘和引擎连起来而已。

2026-08-18 10:59:21 359

原创 ThreadLocal 遇上 parallelStream:一个容易被忽视的坑

问题原因解决帮手线程日志帮手线程的是空的在forEach内部set一份帮手线程串号帮手线程被复用,上次残留的 context 没清用完主线程后续返回 null主线程自己做元素时,remove()把自己的 context 清了判断,主线程不 set 也不 remove核心就一句话区分帮手线程和主线程——帮手线程才需要 set 和 remove,主线程自己的口袋不能动。

2026-08-17 17:34:20 202

原创 java -jar 为什么能跑 fat-jar——JarLauncher 与自定义 ClassLoader

JDK 默认的jar 根目录下的.classclasspath 上的目录和 jar它不认识,也不认识里的嵌套 jar。Spring Boot 的继承自普通 ClassLoader:└─ 只认 jar 根目录的 .class└─ 类在 BOOT-INF/classes/ → 找不到 ❌├─ 认 BOOT-INF/classes/ 里的 .class ✅└─ 认 BOOT-INF/lib/ 里的嵌套 jar ✅。

2026-08-11 16:32:37 272

原创 Spring Boot fat-jar 到底做了什么——repackage 机制揭秘

普通 jarfat-jar谁打出来的类的位置com/...(jar 根目录)含第三方依赖❌ 不含✅ 全包含运行方式要拼 classpathjava -jar一条命令能被依赖✅❌的repackage把一个能被依赖的普通 jar,改写成一个能独立运行但不能被依赖的 fat-jar。这是一次有得有失的交易——得到了部署便利,失去了被依赖的能力。下一篇我们将深入探讨java -jar是如何识别 fat-jar 格式的,以及 Spring Boot 的启动器是如何工作的。

2026-08-11 16:29:16 286

原创 Maven 底层原理——从 .java 到被别人依赖的完整链路

你的项目: .java 源码 ──编译──→ .class ──打包──→ .jar│发布到仓库(只有.jar和.pom)│别的项目: 从仓库下载 .jar,把 .class 放到自己 classpath 上用Maven 依赖 = 共享编译好的.class(在 jar 里)连.class都没有,无法共享代码只传递依赖配置,不引入 jar理解了这些,就能明白为什么"把项目改成 pom 方式让别的项目引用"是行不通的——pom 连代码都没编译,拿什么给别人用?

2026-08-11 11:14:57 168

原创 为什么编程中 Business 缩写是 Biz 而不是 Bus?

Biz是编程世界的"行话",就像医生用Rx代表处方、建筑师用FFL代表完成面标高一样。它不是随意截取的字母组合,而是经过长期工程实践筛选出的无歧义、高辨识度、符合英语习惯的最优解。Bus因为与"总线"这一基础计算机概念冲突,在命名竞争中被自然淘汰。下次看到bizXxx,请放心地将其等同于——这是全球开发者跨越语言和框架的共同默契。关于 API 设计和命名规范的其他问题,欢迎在评论区讨论。

2026-08-06 18:10:59 195

原创 Gzip vs Zstd 选型指南

Zstd 的解压速度与压缩级别几乎无关。Zstd-1 和 Zstd-19 的解压耗时几乎相同(129ms vs 126ms)。级别只影响压缩耗时和压缩率。

2026-08-04 10:57:44 315

原创 大文件传输性能调优:Protobuf结合Zstd替代Gzip的落地指南

维度GzipZstd实现方式JDK 内置(纯 Java)zstd-jni(原生 C 库 + JNI 绑定)依赖零依赖解压速度基准快 1.6 倍(实测)压缩速度基准快 2.4 倍压缩率(默认级别)略好(小 3.6%)略差(大 3.6%)最高压缩率6.81 MB(level 19,比 gzip-9 小 8%)部署复杂度零需匹配平台原生库原始方案 序列化优化 结构优化 压缩优化│ │ │ │▼ ▼ ▼ ▼变体 A 变体 B / C 变体 D Zstd 对比。

2026-08-04 09:39:27 473

空空如也

空空如也

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

TA关注的人

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