😎 Kafka 消息不丢失:一次把话说清楚
一句话结论先给你:Kafka 想做到“消息不丢”,不是靠玄学,而是靠 生产者、Broker、消费者三方配合。 一、Kafka 为啥会丢消息?先泼一盆冷水:Kafka 本身不保证消息 100% 不丢。 丢不丢,取决于你怎么用它 👇 你要是 acks=0,那就是“发出去就当成功”,消息随缘 你要是自动提交 Offset,那就是“吃没吃不重要,先结账” 你要是 ISR 副本只剩 Leader,那就是单点写入,翻车只差一次宕机 Kafka 给你的是工具箱,不是保险箱。 二、Kafka 的可靠性三板斧 🪓1️⃣ 生产者:别太心急(acks=all)1acks = all 含义很朴素: Leader 不点头不算数,ISR 里的人没签完字不返回成功。 acks=0:发完就跑 🚀(最快,也最容易后悔) acks=1:Leader 说行就行 ⚠️(Leader 一挂就凉) acks=all:ISR 集体通过 ✅(最稳) 👉 结论:要可靠,别犹豫,直接 acks=all。 2️⃣ Broker:设一道“安全底线”(min.insync.replicas ≥ 2)1mi...
🌏Referer 与 Origin 是什么?(接口防盗链速查版)
在做接口防盗链或来源校验时,最常用的两个请求头就是 Referer 和 Origin。它们都用来告诉服务器: 👉 这个请求,是从哪来的 但两者作用相似、语义不同、可靠性也不同。 一、Referer 是什么?Referer 表示: 当前请求是从哪个页面跳转/发起的 它通常是一个 完整 URL。 示例1Referer: https://www.example.com/page/detail?id=123 特点 包含:协议 + 域名 + 路径(甚至参数) 主要由 浏览器自动添加 历史最悠久,兼容性最好 常见使用场景 图片 / 视频 / 静态资源防盗链 简单页面级来源校验 局限性 ❌ 可能被浏览器/插件裁剪或直接不发送 ❌ HTTPS → HTTP 时可能丢失 ❌ 很容易被脚本伪造 二、Origin 是什么?Origin 表示: 发起当前请求的“站点源” 它只包含 协议 + 域名 + 端口,不包含路径。 示例1Origin: https://www.example.com 特点 不包含路径,更“干净” 主要用于 AJAX...
🍃Spring Boot 多模块项目中 Parent / BOM / Starter 的正确分工
🎯 结论先行(只记这三条)✅ Parent:继承规则(构建规范、插件、依赖管理)✅ BOM(dependencyManagement):只管版本,不引包✅ Starter(dependency):真正引入功能 🧱 1️⃣ Parent 是干什么的?📌 Parent ≠ 引入依赖 Parent 的职责只有这些: 🧩 统一依赖版本策略(通过 dependencyManagement) 🔧 统一插件配置(compiler / surefire / boot plugin) 📐 统一构建规范(Java 版本、编码、profile) 👉 Parent 是“规则继承”,不是“功能引入”。 📘 2️⃣ dependencyManagement 是不是“引入依赖”?❌ 不是 123456789<dependencyManagement> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp...
🤯 ThreadLocal 的 Entry 为何要继承 WeakReference?
一段看着别扭、却极其正确的 JDK 设计 一个所有人都会停顿的瞬间第一次读到 ThreadLocal 的源码,很多人都会在这里愣住几秒钟: 12345678static class Entry extends WeakReference<ThreadLocal<?>> { Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; }} 心里会不自觉冒出一句: “为啥不老老实实包一层?非要继承?” 🤨 代码不丑,但不顺眼。 于是问题来了: 👉 这是历史包袱?👉 这是早期 Java 的怪癖?👉 还是一次“反直觉但极其理性”的设计选择? 先把「另一种写法」摆上桌面假设我们不用继承,而是用组合: 123456789static class Entry { final WeakReference<ThreadLocal<?>&g...
一条河流过系统:从 CPU 到 Java 的并发叙事图 🌊🧠
一条河流过系统:从 CPU 到 Java 的并发叙事图 🌊🧠这不是分章节的说明书。 这是一条河。 从 CPU 发源,流经 操作系统,穿过 线程与锁,最后抵达你敲下的那一行 Java 代码。 中途不停,也不回头。 CPU 上电的那一刻,就写好了宪法 ⚖️ 有些指令,只有皇帝能用。 于是世界被分成了几层: Ring 0 👑:内核态 能碰硬件 能关中断 能调度众生 Ring 3 🧑💻:用户态 写代码 算业务 做梦想 这不是制度选择,这是硅片上的物理规则。 程序不服气:“我也想读磁盘。” 💾 CPU 冷冷一句: 你没资格。 操作系统站出来,像个公证人: “写个系统调用吧,我替你跑这一趟。” 于是: 用户线程 ✍️ 系统调用 🚪 CPU 切 Ring 0 🔁 内核执行 🧠 结果原路奉还 🎁 这条路径,是 Ring 切换的正门。 接着,真正跑在 CPU 上的生命体登场了 🧬 CPU 不认识进程,只调度线程。 用户线程: 写在 Java / C / Go 里 平时待在 Ring 3 内核线程: 属于...
🐷DDNS告别“丑陋端口号”:Cloudflare、腾讯云、阿里云ESA大比拼
核心痛点:丑陋的“猪尾巴” 😖家里宽带虽好,配置了 DDNS 也能随时访问,但众所周知,运营商封了 80/443 端口。 想从外网回家?只能忍受 http://yiqiquhuxi.cn:88 这种带着端口号的丑陋网址。不仅难记,看起来还特别 Low,毫无“优雅”可言。 🐷💻 我的目标很简单:不管是家里 NAS 还是小主机,我要通过 https://yiqiquhuxi.cn 直接访问,把背后真实的 88 端口藏得干干净净! 为了实现这个“端口隐身术”,我折腾了三种方案,给大家排排雷。👇 方案一:Cloudflare (赛博菩萨) 😇关键词:免费、Origin Rules、国际大厂 这是我最开始发现的方案。CF 不愧是赛博菩萨,直接利用它的 Origin Rules 功能就能实现端口非标转标准。 操作步骤: DDNS:让域名随时找到家里的公网 IP。 开启小黄云:Cloudflare 开启代理模式。 配置 Origin Rules:告诉 CF,“收到 yiqiquhuxi.cn 的访问请求,请帮我悄悄改写成 88 端口 再发回我家”。 优点:完全免费,...
😄 在 CentOS Stream 9 上用 Let’s Encrypt 装 HTTPS:一场和证书、浏览器、自己较劲的故事
HTTPS 这玩意儿吧,没装之前你觉得它很神秘,装完之后你会发现——它不神秘,它只是爱给你添戏。 🎭 本文不是官方文档复读机,而是一篇 “真实踩坑纪实 + 人话翻译版 HTTPS 指南”。 适合人群: 会装 Nginx 会写 proxy_pass 但一碰 HTTPS 就开始怀疑人生的人 🧱 一、开局配置(不难,但很关键)你的起点通常是这样: 系统:CentOS Stream 9 🐧 Nginx:已装好,80 能访问 域名:A 记录已指向服务器 这时你心里只有一个朴素愿望: “我就想要个小绿锁 🔒,别整幺蛾子。” ——放心,幺蛾子马上就来。 🧰 二、Certbot 登场(主角出场必有 BGM)安装: 12sudo dnf install -y epel-releasesudo dnf install -y certbot python3-certbot-nginx 然后一行命令: 1sudo certbot --nginx -d yiqiquhuxi.cn Certbot 会非常热情地帮你做四件事: 1️⃣ 验证你是不是域名主人2️⃣ 申请证书3️...
🍏JMM-八大原子操作-3D版
JMM 的 8 大原子操作 JMM 不复杂,它只是规定:线程什么时候能读、什么时候能写、什么时候必须同步。 一、为什么会有“原子操作”在 JMM 中: 主内存:共享数据的唯一权威 工作内存:线程自己的变量副本 线程不能直接操作主内存,所有读写都要被拆解成一组 标准动作。 这组动作,就是 8 大原子操作。 二、8 大原子操作(按实际使用顺序) 1️⃣ read(读取)从 主内存 读取变量的值。 只是“读出来”,还没给线程用。 2️⃣ load(载入)把 read 得到的值,放入线程的 工作内存。 read + load 必须成对出现。 3️⃣ use(使用)线程在执行过程中 真正使用变量。 if、while、计算,全发生在这一步。 4️⃣ assign(赋值)线程给变量 赋新值,但只修改 工作内存中的副本。 主内存此时还不知道。 5️⃣ store(存储)把工作内存中的新值,准备写回 主内存。 还没真正生效。 6️⃣ write(写入)把 store 准备好的值,真正写入主内存。 到这一步,其他线程才有机会看到新值。...
TLS-非对称加密极致-3D版
Q&A:三秒看懂核心Q:公钥是公开的,黑客拿到不就能解密了?A: 错。公钥只能锁门,不能开锁。没私钥(钥匙),黑客只能对着保险箱发呆。 Q:黑客给我个“假挂锁”冒充服务器怎么办?A: 证书就是身份证。浏览器会扫码核实:证书是山寨的,直接红牌罚下。 Q:为什么不全程用公钥加密?A: 太慢。公钥是押运车,只负责送钥匙;芯片(对称密钥)才是跑车,负责拉货。 Q:私钥万一被偷了,以前的数据会被破解吗?A: 现代 TLS 用的是“一次性锁”。就算以后丢了钥匙,也开不了以前的废锁。 Q:时间不对为什么打不开网页?A: 证书会过期。你电脑要是穿越回 1998 年,它会觉得 2024 年的证书是伪造的。 Q:有绿锁就代表网站不是骗子?A: 绝对不是! 绿锁只保证没人偷听,不保证对面坐的是不是大忽悠。 总结TLS 握手本质:用昂贵笨重的保险箱,护送一把极速轻便的钥匙。
Spring AOP 参数绑定:从 0 到会(一页就懂版)😄
适用人群: 知道 Spring AOP 是啥 写过 @Around / @Before 但对「注解是怎么传进 Advice 的」有点懵 这篇文章不默认你已经懂,我们从「注解怎么写」开始。 0️⃣ 先准备一个“被切的注解”(否则一切都是空谈)123456789@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Auth { String value() default ""; boolean required() default true;} 关键点(只记 2 个): @Retention(RUNTIME): 没这个,AOP 在运行时根本拿不到注解 METHOD / TYPE: 决定你后面能不能用 @annotation / @within 1️⃣ 再看一个“被切的方法”(完整上下文)12345@Auth("admi...












