自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis 与微服务,什么场景下无可替代

六周学习揭示:技术不可替代的真谛在于“不用则物理失败”。Redis 之不可替代,在于其内存速度、特殊数据结构与原子操作,支撑热点读、共享状态与高并发原子操作,而数据库无法替代;微服务的真正价值,在于组织规模、负载分化与故障隔离三大信号驱动下的必然拆分,否则单体更优。二者本质都是用网络开销换取性能与弹性,代价是复杂度上升。最终沉淀的不是命令,而是三个核心问题:状态归位、耦合评估、复杂度权衡——这才是技术选型的永恒标尺。

2026-10-25 15:36:33 345

原创 RabbitMQ(下):可靠性保障与高级特性

消息可靠性需三环闭环:生产者通过确认(confirm)与返回(return)确保消息抵达交换机;Broker 通过队列、交换机、消息三级持久化防止存盘丢失;消费者采用手动 ACK 并结合死信队列与重试机制,避免处理失败导致消息丢失。同时,重复消费不可避免,须通过唯一 ID + 去重表或业务幂等设计保障幂等性。延迟队列可通过 TTL+死信队列实现,形成完整可靠的消息链路。

2026-10-17 09:28:05 506

原创 RabbitMQ(上):消息模型与核心概念

下单后等待短信发送导致体验差,根源在于同步调用阻塞主流程。引入消息队列(MQ)通过异步、解耦、削峰三大能力,将非核心操作(如发短信、加积分)分离,显著提升响应速度与系统稳定性。RabbitMQ 以交换机为核心,支持 Direct、Topic、Fanout 等路由模式,灵活实现精准投递、通配订阅与广播通知。Spring AMQP 简化开发,但需注意序列化方式与消息可靠性问题。异步带来最终一致性、调试复杂度上升等代价,使用前须权衡业务场景,确保具备补偿机制与可观测能力。

2026-10-17 09:20:47 352

原创 Seata :分布式事务,从问题到 AT 模式

本文详解分布式事务挑战与Seata解决方案:单体时代本地事务即可保障一致性,微服务拆分后跨库操作需应对“部分成功”风险。Seata通过AT模式实现无侵入的分布式事务,基于两阶段提交与undo_log补偿机制,在保证最终一致的前提下,提供接近本地事务的使用体验。其核心依赖TC、TM、RM三角色协同,结合数据源代理与XID透传,确保跨服务事务一致性。文章强调,分布式事务带来性能、复杂度与运维成本,应优先通过架构优化避免使用——仅在订单、库存、余额等强一致性场景下才需引入。

2026-10-17 09:08:16 373

原创 Session(下):分布式会话的解法——Redis 还是 JWT

本文对比了两种分布式会话解决方案:Redis 存 Session 与 JWT 无状态令牌。前者将状态集中存于 Redis,支持主动失效、权限实时更新,适合需精细控制的场景;后者由客户端携带身份信息,服务端无状态、易扩展,但无法主动撤销令牌。最终选择取决于是否需要“即时踢人”等控制能力——两者并非互斥,常结合使用,以平衡性能与可控性。

2026-10-16 13:48:15 880

原创 Session(上):会话管理,从单体到微服务的第一个裂缝

本文剖析了微服务架构下Session机制失效的根源:单体应用中依赖进程内内存存储登录状态,而微服务拆分后,请求分散于多实例,导致状态无法共享。核心矛盾在于“状态存于单机”与“请求跨多机”的冲突,引发跨服务认证失败、扩容状态丢失、重启登出等问题。文章指出,根本解法是将状态外置(如Redis),实现服务无状态化,提升弹性扩展能力,但需权衡外部依赖与安全风险。

2026-10-16 13:42:13 353

原创 Gateway(下):过滤器与统一鉴权

网关统一鉴权通过GlobalFilter实现,避免各服务重复代码与密钥管理难题。利用getOrder()确保鉴权优先执行,结合排除列表(如登录、查询接口)灵活配置。解析JWT后将userId通过请求头透传至下游,解决WebFlux无ThreadLocal问题。排查时需区分401(鉴权失败)、404(路由错误)、500(下游异常),并验证“入口写、中间传、出口读”三环节,确保链路畅通。

2026-10-15 20:58:19 370

原创 Gateway (上):路由与转发,微服务的统一入口

本文系统阐述了微服务架构中网关的核心作用:解决外部访问端口分散、地址暴露、跨域与横切逻辑重复等问题。通过Spring Cloud Gateway实现统一入口,利用路由规则(id、uri、predicates)和过滤器(如StripPrefix)完成请求匹配与转发,避免404错误。网关复用Nacos服务发现机制,承担鉴权、限流等公共逻辑,提升系统安全性与可维护性。其高可用部署保障稳定性,责任链设计确保处理流程清晰可控,是微服务对外交互的关键守门人。

2026-10-15 20:07:45 338

原创 OpenFeign 学习笔记(下):公共模块与上下文透传,从能跑到用好

本文探讨了微服务间调用中因重复定义Feign接口导致的维护难题,提出通过抽取公共API模块(hm-api)集中管理接口与DTO,实现契约统一。文章详解了模块化实践中的关键问题:依赖引入、本地安装、扫描路径配置及日志开启方法,并强调“依赖→安装→扫描”排查三步法。同时指出默认客户端性能瓶颈,建议在链路畅通后按需切换为OkHttp连接池。最后揭示请求头丢失根源——拦截器与ThreadLocal在远程调用中失效,需显式传递上下文。

2026-10-14 09:21:02 424

原创 OpenFeign 学习笔记(上):声明式调用与动态代理,一个空接口如何干活的

本文剖析了微服务调用中因重复编写远程调用逻辑带来的痛点,引出OpenFeign作为声明式HTTP客户端的解决方案。通过接口注解实现“调用即契约”,将服务发现、负载均衡、HTTP请求等细节封装,使远程调用如本地方法般简洁。文章详解Feign基于JDK动态代理与HTTP客户端的运行机制,并以迁移案例警示:技术升级需彻底清理旧依赖,避免残留引用导致启动失败。核心在于用声明式编程替代命令式操作,提升可维护性与开发效率。

2026-10-14 08:28:19 287

原创 Nacos 学习笔记(下):配置中心与动态刷新,告别重启改配置

微服务拆分后,配置分散导致修改繁琐且易出错。通过引入Nacos配置中心,将配置与代码解耦,实现统一管理。利用Data ID、Group、Namespace三维度定位配置,结合spring.config.import或bootstrap配置实现动态加载。关键在于:加@RefreshScope标记可刷新Bean,依赖长轮询机制实时感知变更,通过发布RefreshEvent重建Bean实现动态生效。共享配置(如数据库、Redis)与服务专属配置分离,支持多环境隔离。需注意配置优先级(命令行 > 环境变量 > 文件

2026-10-12 21:45:26 316

原创 Nacos 学习笔记(上):服务注册与发现

Nacos 注册中心解决了"服务怎么找到对方"

2026-10-12 15:29:57 336

原创 Docker 学习总结(下):数据卷、Compose 与部署实战

本文系统梳理了从单容器到多容器部署的进阶实践,重点解决数据持久化与多服务协同问题。通过引入数据卷实现容器间数据共享与持久存储,掌握命名卷与绑定挂载的应用场景;借助Docker Compose以YAML文件统一管理多容器,实现服务依赖、健康检查、自动重启等关键配置。结合hm-service实战部署,揭示JDK 17模块化引发的反射异常,并通过--add-opens参数修复,凸显容器环境对代码兼容性的严格检验。全文贯穿“分层与隔离”核心思想,强调理解设计逻辑远胜于记忆命令,为微服务容器化部署奠定坚实基础。

2026-10-09 21:14:51 295

原创 Docker 学习总结(上):镜像、容器、Dockerfile 与网络

本文分享了作者从项目部署困境中领悟Docker价值的历程。通过对比传统部署的繁琐与Docker“一次打包,到处运行”的优势,深入理解镜像与容器的本质区别——镜像是只读模板,容器是其运行实例。结合Dockerfile实践,掌握分层构建、多阶段优化等核心概念,并解决JDK版本不匹配、COPY路径错误等常见问题。同时揭示容器网络真相:localhost仅指容器自身,需通过host.docker.internal或自定义网络实现宿主机服务访问,真正实现环境一致性与高效运维。

2026-10-09 20:09:33 231

原创 Redis 数据结构:从黑马点评的 11 个功能说起

用 String 存的话,每次改一个字段(比如改了收货地址),要把整个对象取出来、反序列化、修改、再序列化、再存回去。String 做缓存和计数,Hash 存对象属性,Set 做去重和集合运算,List 做有序列表和简单消息队列,ZSet 做排行榜和延迟队列。高级结构里,BitMap 做签到,GEO 做地理位置,HyperLogLog 做基数统计,Stream 做可靠消息队列。这个场景是典型的"读多写少",用 String 缓存序列化后的 JSON 字符串,取出来反序列化就完事了。

2026-09-22 12:40:39 423

原创 Redis秒杀实战:从单机并发到分布式高并发演进

这一篇最大的转变,是从“单机思维”到“分布式思维”。以前遇到并发问题,我的第一反应是加。这个服务部署几个实例?锁的作用范围是什么?方案一致性性能适用场景同步 + 数据库锁强低低并发、强一致Lua 脚本强中中并发、需要原子操作Redis Stream 异步最终一致高高并发、可接受短暂延迟没有最好的方案,只有最适合当前场景的方案。理解了这一点,面试的时候就不会背“标准答案”,而是能根据场景给出合理的判断。写秒杀之前,我觉得“分布式”是个很远的词,是那种只有大厂才用得上的东西。

2026-09-22 11:16:06 293

原创 黑马点评缓存复盘:从背方案到问对问题

这几天学下来,最大的收获不是 Redis 本身,而是学会了怎么学。看视频的时候觉得“我会了”,自己动手时发现,key 会写错,TTL 会忘设,锁会忘释放。只有亲手踩过这些坑,才算真正掌握。项目跑起来、接口能返回数据,这只是第一步。能讲清楚“为什么用 Redis”“不用会怎样”“有什么坑”,才是真的理解了。现在再看到 Redis 报错,我不会第一时间慌了。我会先去 Redis 里看一眼 key 长什么样,再去日志里找 SQL,然后问自己:是查不到,还是没写进去,还是写进去了但读错了格式?

2026-09-12 20:22:42 239

原创 成为创作者的128天

今天打开后台,收到一条消息:成为创作者第128天。128天前,我写下了第一篇技术博客《从多态到泛型:Java类型安全的一次升级》。那时候刚学完 Java SE,对着多态和泛型这两个概念来回琢磨,终于想通了,就顺手记了下来。没想到这一记,就是四个月。128天,从一个只会跟着教程敲代码的新手,到能独立完成项目、排查问题、输出总结。这个变化,自己感受最深。下一个128天,继续深耕技术,静候花开。

2026-09-12 19:29:45 74

原创 用 MyBatis-Plus 改造苍穹外卖:从手写 SQL 到一行调用

做完苍穹外卖后,我对原生 MyBatis 的用法已经比较熟悉了:Mapper 接口 + XML + 注解,单表 CRUD 手写到麻木。后来听说 MyBatis-Plus 能让单表操作“一行代码搞定”,就动了改造的心思。我没打算全项目推翻重来,只选了员工管理模块作为试验田。因为它最典型:纯单表、有分页、有动态条件、有增删改,正好覆盖 MP 的核心用法。这篇博客记录改造过程中做的事、踩的坑,以及改造前后写法的对比。适合人群:学过 MyBatis,想了解 MyBatis-Plus 能省多少事的人。

2026-09-02 16:40:40 363

原创 通关手记・成长篇:写给和我一样的后来者

三篇技术文章写完,系统的技术内容已经讲清楚了。但整个系列总觉得还缺一块 —— 缺少 “人” 的部分。技术是冰冷的,学习路线图是死的,但学技术的人是鲜活的。我这一路是怎么走过来的,哪些选择做对了,哪些地方白白浪费时间,内心又经历过哪些挣扎,如果这些不记录下来,整套复盘就是不完整的。这篇不讲代码,只聊成长。如果你和两个月前的我一样:大一刚学完 Java 基础,会写简单 CRUD,但讲不清底层原理,想上手做项目又内心胆怯,这篇就是写给你的。

2026-08-18 17:00:21 158

原创 通关手记·原理篇:框架不是魔法

上篇看全景,中篇踩坑,这篇把坑掀开,看下面是什么。中篇结尾我说过:很多坑,理解原理之后就不再踩。这篇文章就是来兑现这句话的。中篇那 13 个错误,没有一个是 “代码写错了” 那么单纯 —— 大部分是违反了一个约定。框架不是魔法,是“约定 + 自动化”。你按约定写,它自动帮你干活;你违反约定,它就用报错提醒你,或者更狠 —— 不报错,只是行为不对。本文不讲源码细节,只讲 “框架在背后做了什么”。目的只有一个:让你以后再看到注解、报错,脑子里有画面。六节讲完,回到开头那句话:框架不是魔法,是。

2026-08-18 10:13:11 429

原创 通关手记・实战篇:十几次报错教我的事

上篇讲的是系统的全景,这篇该落到地面了。写这篇比写上篇更难。全景是静态的,架构图一摆,读者就能看懂;开发却是动态、混乱的。大部分时间不是在写新功能,而是在排查修复错误。一个接口的业务代码十分钟就能写完,但真正调通它可能要耗上一整晚。我记得很清楚的一个夜晚:小程序端加购操作提示成功,日志打印的数据一切正常,数据库里却没有新增任何记录,当时已经十一点多。这篇从几十次报错中筛选出最典型的 13 个案例,不做流水账,按照问题根源归为六类。每一类背后都对应一个共性问题,踩过一次,同类问题就可以尽量规避。

2026-08-17 19:25:12 520

原创 通关手记·全景篇:从零到一,搭建完整外卖业务系统

项目跑通的那天晚上,我盯着小程序里那个"订单已完成"的绿色状态,发了好一会儿呆。两个月前,我还在纠结@Autowired和new到底有什么区别,现在这个背后十几张表、二十多个接口的系统,居然真的能下单、能接单、能统计报表了。回头看,苍穹外卖确实是从零开始,一行一行代码,在我手里变成了一个能跑起来的完整系统。这篇文章不写具体代码,只做一件事:把这个系统完整地摊开给你看。它长什么样、用了什么技术、模块怎么划分、数据怎么流转。

2026-08-17 10:38:13 197

原创 当 Redis 遇见 Spring Cache:一场从笨拙到轻盈的缓存修行 | 苍穹外卖 DAY5、DAY7

从 Day5 手敲 RedisTemplate,到 Day7 用一个注解搞定,这其实是后端开发里很典型的 “从原生 API 到框架封装” 的体验。Redis 快就快在内存、数据结构、单线程 IO 多路复用;我们项目里主要就是 String 和 Hash 两种类型,用好基本能满足多数缓存需求;必须配 JSON 序列化,不然乱码还不好调试;Spring Cache 基于 AOP 帮我们把样板代码省了,但内部调用失效、过期时间要全局配这些坑得记住;

2026-08-07 11:50:42 230

原创 三个CRUD模块教我的后端设计哲学 |苍穹外卖DAY3、DAY4

本文总结了作者在独立开发SpringBoot项目过程中形成的CRUD通用开发模式。

2026-08-04 22:20:39 352

原创 通俗拆解Spring IoC/DI+三层调用全流程|苍穹外卖DAY2

学习苍穹外卖第 2 天。IoC(控制反转)和DI(依赖注入)。然后用一个真实的接口,把 Controller → Service → Mapper 的完整调用链走一遍。控制反转(IoC):交出对象创建与管理的控制权依赖注入(DI):需要的依赖,框架自动送过来。

2026-08-01 22:40:28 277

原创 为什么文件夹名称不能有中文或空格?苍穹外卖 day1 踩坑经历

今天系统学习搭建苍穹外卖 Day1 的全套开发环境,原本以为跟着教程按部就班,就能顺利把环境跑通。文件路径包含中文目录与带空格的文件夹名称。这个问题接连导致 Maven、Nginx、MySQL、Git 四款开发工具出现各类诡异报错,排查过程绕了大量弯路,耗费很久才定位根源。顺带想起之前配置 MySQL 时遇到另一个路径陷阱:路径里\bianchen的反斜杠被程序识别为转义符号,同样引发解析异常,最后依靠修改编码与路径写法才解决。

2026-07-30 22:31:21 347

原创 观赛小发现:LPL 直播 BUG @Value0@ 成因深度浅析

闲暇观看 LPL 实时直播时,发现了一个长期存在的常驻问题:只要选手完成一次排眼操作,直播画面上就会稳定弹出字符串@Value0@100% 可以复现。直播间弹幕里大量观众对此充满疑惑,大多数人下意识认为这是英雄联盟客户端本身出现了 BUG。结合现阶段后端课程的学习经验,我判断问题并不出自游戏本体,而是赛事转播的可视化渲染层出现异常。出于个人兴趣,我对该现象进行了简单的溯源分析。这是一个非常典型的线上工程设计缺陷,也可以作为后端初学者的一个参考案例。

2026-07-24 23:00:53 1117 1

原创 语法糖?双亲委派?盘点那些你在学习 Java SE 时可能遇到的“黑话”

大家好!我这终于学期跟着课程学完了 Java SE,期间自认为面向对象、集合、IO 流这些东西都掌握了。结果学着学着,总能在各种地方碰到一些让我当场愣住的名词。比如有一次在 B 站看一个讲集合的视频,弹幕里飘过一句:“这不就是个语法糖吗。”我当时就懵了。语法……糖?代码里还有糖?后来自己写代码,Integer比较的时候踩了坑,百思不得其解,去搜博客,又蹦出来一个词——装箱。再往后学方法参数传递,跟舍友争论 Java 到底是值传递还是引用传递,俩人谁也说服不了谁。

2026-06-20 21:25:19 395

原创 从多态到泛型:Java类型安全的一次升级

本文从Java多态的局限性出发,系统介绍了泛型的核心价值。

2026-05-01 07:41:39 832 1

空空如也

空空如也

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

TA关注的人

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