自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

代码构筑系统,架构驱动未来 —— 一名深耕 Java 技术的实践者

你好,我是苏渡苇,写代码也画架构图。分享踩坑经验、性能调优秘籍和偶尔靠谱的全栈技巧——让系统稳如老狗,头发少得优雅。

  • 博客(81)
  • 收藏
  • 关注

原创 Redis 性能优化——内存、慢查询、Big Key 与 Hot Key

String 类型值 > 10 KBHash / Set / List / Sorted Set 元素个数 > 5000某个 Key 被大量请求访问,比如爆款商品信息、热门微博、秒杀库存。

2026-06-13 11:27:51 388

原创 Redis 持久化——RDB 快照 vs AOF 日志

重启就丢数据?那 Redis 和内存有啥区别。持久化就是给 Redis 上个“保险”。

2026-06-02 10:41:30 765

原创 Redis 核心数据结构(四)——Set 与 Sorted Set,去重与排名神器

集合帮你自动去重,有序集合还能帮你排个名——排行榜、共同好友、标签系统,Set / Sorted Set 一把搞定!

2026-06-01 10:07:58 534

原创 分布式事务解决方案之 Seata(二):Seata AT 模式

对应模块 15-seata-at;Seata Server 部署见 14-seata-deploy。通过上一篇文章对分布式事务解决方案的介绍,我们已经对两阶段提交TCC及基于MQ的最终一致性有所了解了。Seata提供了ATTCCSAGA和XA事务模式,他是一站式的分布式解决方案。本文将先介绍Seata的AT模式,他是基于两阶段提交的演变。Seata AT 模式是一种非侵入式的分布式事务解决方案,在 AT 模式下,我们只需关注自己的业务 SQL业务 SQL。

2026-06-01 09:53:27 533

原创 Seata 番外篇:使用 docker-compose 部署 Seata Server(TC)及 K8S 部署 Seata 高可用

本文安装的 Seata Server 是以 Nacos 为注册中心,DB 为数据存储的模式。按照本文的安装步骤安装,你大概率不会踩坑,因为坑已经被我踩过了:)

2026-05-31 17:22:38 232

原创 分布式事务解决方案之 Seata(一):分布式事务的常见解决方案及 Seata 简介

支付回调就是类似的原理,支付接口都需要一个回调地址,在支付成功后,支付接口提供方会将支付结果返回到我们的回调地址,如果没有收到支付成功的通知,支付接口提供方会重复调用我们的接口,直到通知指定次数后不再通知。比如,Jack 向 Rose 转钱,首先需要将 Jack 和 Rose 的账户锁住,即将账户资源预留出来,然后进行转账操作,对双方的账户进行加减操作,如果操作失败,则解冻账户,无事发生。)来保证自己的事务处理,但是在分布式环境下,涉及的就是多个不同的服务不同的数据库,单一的事务处理是无法满足此要求的。

2026-05-31 16:27:55 181

原创 高级版的 jvisualvm :Spring Boot Admin 监控 Spring Boot 微服务项目

类,并在。

2026-05-31 16:21:35 236

原创 Spring Cloud Sleuth 整合 Zipkin 进行服务链路追踪

业务要求整个下单的请求要在 1s 内完成,测试发现请求下单接口耗时超过 2s ,这时我们就需要去定位发现是调用链路上的哪个环节耗时异常,进而去解决问题。,如果请求量比较大,这种方式其实性能是比较低的,一般情况下我们都是通过消息中间件来发送,比如。在一个微服务系统架构中,一个完整的请求可能涉及到多个微服务的调用,这个调用形成一个链路。可以对每个微服务进行链路追踪,从而帮助我们分析服务间调用关系以及调用耗费的时间。我们可以直观的查看调用链路,并且可以方便的看出服务之间的调用关系以及调用耗时。

2026-05-31 15:46:22 353

原创 Spring Cloud Gateway 网关限流

网关 Spring Cloud Gateway - API 调用的组织者已经通过案例实现了通过网关调用服务 API,并已经了解了Gatewayroutespredicatesfilters。这几个核心概念串起来就是Gateway的执行流程:客户端发请求,通过断言predicates进行匹配,若匹配上了则请求就会被发送到网关处理程序,并执行特定的请求过滤器链fliters。提供了多种断言predicate工厂和过滤器filter工厂,也可以自定义断言工厂和过滤器工厂。使用的过滤器工厂基于Redis。

2026-05-29 10:45:36 730

原创 网关 Spring Cloud Gateway - API 调用的组织者

本文介绍了API网关在微服务架构中的核心作用,通过大禹治水的比喻形象说明网关如何统一管理服务请求流向。重点解析了Spring Cloud Gateway的核心组件:Route(路由规则)、Predicate(匹配条件)、Filter(请求过滤器),并阐述了其工作原理——通过断言匹配路由后,执行过滤器链实现请求转发。文章提供了实战案例,演示如何搭建网关服务并配置路由规则(如将/user/**请求转发至用户服务),验证了网关作为流量枢纽的能力。通过网关可有效解决微服务系统API调用的复杂度问题,实现请求的集中管

2026-05-29 10:32:23 195

原创 强强联合:OpenFeign 整合 Sentinel

微服务间的远程接口调用:OpenFeign 的使用当项目中使用了OpenFeign后,可以很方便的进行远程服务调用,现在有个问题,假如远程服务出现故障了,调不了远程的接口,这边又着急等着返回结果,怎么办呢?当然是使用服务降级,本篇就使用OpenFeign进行远程调用,并结合Sentinel对出现的异常、故障等问题进行服务降级。

2026-05-28 18:29:54 671

原创 微服务间的远程接口调用:OpenFeign 的使用

OpenFeign是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 OpenFeign ,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。其用法就是编写一个接口,在接口上添加注解。如此就能轻而易举的调用远程服务。有如此强大的东西,我们肯定不能放过使用的机会,就像有时你有特殊的要求必须拉别的女孩的手,而此时有个中间人能帮你实现这个愿望,你拉别的女孩子的手就像拉自己女朋友的手一样方便!

2026-05-28 12:01:08 353

原创 Sentinel限流降级如何优雅的返回?SentinelResource注解之blockHander和fallback

本篇文章填上次将 Sentinel 熔断限流规则持久化到 Nacos 配置中心提到的一个问题:之前我们访问接口进行限流或者降级后,直接返回500错误,或者提示flow limit之类的东西:这样显得很不优雅,透漏着不专业,那么进行限流或者降级后该如何进行优雅的返回呢?本章从 Sentinel 的热点参数限流着手,使用注解的和fallback来实现限流后优雅的返回。

2026-05-27 11:00:43 554

原创 Spring Cloud Alibaba:将 Sentinel 熔断限流规则持久化到 Nacos 配置中心

两篇关于如何使用 Sentinel 的介绍,我们已经知道如何从 Sentinel 控制台配置限流、熔断规则,但是实际操作的过程中你会发现,每次项目重启后,配置的限流规则都没有了!这是因为,在上配置的规则只存在缓存中,当项目重启,这些规则自然就消失了。实际生产环境中,我们是不允许这种情况存在的,那么如何进行 Sentinel 配置规则的持久化呢?Sentinel 提供多种不同的数据源来持久化规则配置,包括FileRedisNacosZooKeeper等。前面我已经整过Nacos数据持久化。

2026-05-27 10:42:18 414

原创 Spring Cloud Alibaba Sentinel 熔断降级策略实战

简而言之,熔断降级是保证微服务架构系统不会因为某个调用不稳定导致整个系统雪崩的一种手段。现在的微服务系统大多是分布式的,一般由很多为服务项目组成。一个微服务通常会调用其他模块,比如第三方 API ,数据库, 亦或者是另外的一个远程服务。比如,支付服务,首先需要查询商品的价格而去查询数据库,同时还需要调用支付宝、微信或银联支付提供的三方API。

2026-05-26 22:17:13 536

原创 服务容错的必要性与Spring Cloud Alibaba Sentinel 限流配置实战

举个栗子,冬天开车启动车子之前,一般先把发动机打开,先暖暖车,而不是一脚油门把车子速度提起来,这样容易坏车。在高并发的秒杀场景中,抢到秒杀货物的人需要付钱,而系统此时还运行着其他一些比如搜索商品、商品详情、定时任务、评论等等服务,这些服务也是占用着系统资源的,但是他们相对于。,只有2个请求成功,这是因为我们设置的并发线程数的阈值为2,而测试同时发出了5个线程进行请求,所以根据限流规则,其余3个线程的请求直接失败。的最大 QPS 是 3 ,单机阈值开始增长,经过 5 秒的时间请求的最大 QPS 是10。

2026-05-26 22:00:52 459

原创 万字长文 | Spring Cloud Alibaba组件之Nacos实战及Nacos客户端服务注册源码解析

注册步骤小结:读取Spring Boot装载配置文件,找到启动类;继承,它实现接口;实现ApplicationListener接口的方法,该方法调用bind(),然后调用start()方法;start()方法中调用register(),该方法调用的register方法;NacosServiceRegistry的register方法内部调用的方法;根据实例的瞬时状态选择不同的proxy执行注册,默认是gRPC协议的执行注册;完成实例注册(POST请求。

2026-05-06 21:20:47 510

原创 系统架构演进与Spring Cloud Alibaba微服务架构体系

早期的一个单体架构的模块已然不能满足不断复杂的业务逻辑和不断增长用户数量,直到如今微服务架构体系的发展才有效、丝滑的解决了这一问题。没错你猜对了,我们可以把冗余部分的代码再次拆解出来,做成统一的业务层供其他地方调用,该业务层就变成了一个单独的服务。随着互联网世界的快速发展,网站应用的规模也在不断地扩大,这种规模的扩大必然会影响这我们研发的项目的架构体系。垂直架构带来的问题是会带来功能代码的冗余,而随着业务的增加,拆分的应用越多,冗余的代码就越来越多。C和D倒下了,A和B就会不断消耗资源,最终也会宕机下线!

2026-05-06 20:36:56 244

原创 DeepSeek V4 实战:自然语言生成 SQL + 智能优化引擎

本文利用 DeepSeek V4 的推理能力,构建了一个“自然语言 → SQL → 执行计划 → 优化建议”的自动化工具。元数据驱动:让 AI “理解”你的数据库结构,减少幻觉。闭环验证:基于真实 EXPLAIN,而不是理论分析。成本可控:生成用 Pro 保证质量,优化用 Flash 降低成本。开箱即用:H5 页面 + Spring Boot,一键启动。从“写 SQL”到“描述业务”,AI 负责翻译和打磨。项目源码仓库。

2026-04-30 11:19:21 1305 3

原创 Redis 核心数据结构(三)——Hash,把一堆字段塞进一个 Key

对象无需再存 JSON 字符串了,Hash 让你直接改里面的某个字段,不用全量覆盖。

2026-04-30 09:16:58 462

原创 关于Docker镜像仓库

在Docker客户端(192.168.242.217)制作一个镜像,从官方下载的Tomcat镜像,运行容器无法正常访问Tomcat首页,原因是运行的Tomcat容器内部webapps目录下没有任何内容,而是放在了webapps.dist目录下,我就以这个容器为基础,进入到容器内部,将webapps.dist的内容拷贝到webapps目录下,然后。实际操作中,推送镜像到公共仓库是很慢的,甚至需要推送多次才能推送成功,这不利于项目的持续集成和持续部署,一般我们不会使用公共仓库。

2026-04-29 16:17:03 545 1

原创 DeepSeek V4 实战:打造一个智能 Java 项目源码分析助手

本文从零构建了一个真正能用的 DeepSeek V4 源码分析工具。启动 Spring Boot 应用;打开浏览器访问;输入本地 Java 项目的路径,点击分析。几分钟后,DeepSeek V4 就会交出一份媲美资深架构师审阅的报告。DeepSeek V4 的超长上下文能力,让“读懂整个项目”从理想变为现实。项目源码仓库。

2026-04-29 16:00:42 930

原创 Redis 核心数据结构(二)——List 与消息队列

队列、栈、阻塞读——List 能干的活很多,我们得知道它的边界在哪。

2026-04-28 08:46:21 468

原创 DeepSeek V4 + Spring Boot 3 + JDK 21 :万字实战教你打造AI智能编码助手

2026年4月24日,DeepSeek V4系列正式发布,我们先来看下他耀眼的战绩:更让Java开发者兴奋的是,V4 API采用OpenAI兼容格式,与Spring AI框架天然契合。而Spring Boot 3 + JDK 21的组合,借助虚拟线程(Virtual Threads)、Project Loom、增强的模式匹配等新特性,能够在大规模AI集成场景中发挥出远超传统线程模型的服务能力。本文将手把手带你构建一个 企业级AI智能编码助手,深度整合DeepSeek V4的代码生成、代码审查、单元测试生成和

2026-04-28 00:27:03 640

原创 Redis 核心数据结构(一)—— String 与数字

别被“数据结构”三个字吓到,String 就是你熟悉的字符串,只不过它能自动做加减法。

2026-04-27 19:05:29 408

原创 5 分钟跑起 Redis(Docker 版)

默认的 Redis 是“裸奔”的:没有密码、内存不限制、持久化也没开。如果你想改配置,可以自己写一个redis.conf。

2026-04-16 10:53:13 580

原创 Redis 版本演进、新特性与协议那些事儿

Redis 每个版本都有自己的脾气,有的适合稳扎稳打,有的适合尝鲜,有的为了适应 AI。扒一扒每个版本的核心变化、好玩的新命令、协议许可证的来龙去脉。另外,如果你是自己下载 Redis 源码编译、或者用 Docker 跑在服务器上,那后面提到的那些许可证问题——基本跟你没啥关系。协议限制主要针对的是云厂商把 Redis 打包成托管服务卖钱。你自己用,该咋用还咋用。1.x–2.x:打基础,数据结构 + Lua 脚本3.x–5.x:分布式 + 流消息6.x:多线程 I/O + ACL7.x。

2026-04-16 10:17:45 487

原创 线程池遇上 ThreadLocal:上下文传递与那些踩过的坑

把问题想成“谁在什么时候 set,谁在什么时候 remove”,再选、Security 委托、MDC 拷贝或 TTL,就不容易迷路。如果你也在做链路追踪、诊断类工具,欢迎继续关注。🔗GitHub你的 Star 是对我最大的鼓励!

2026-04-15 09:19:05 401

原创 Docker 网络完全指南

如果你已经跟着前几篇文章跑起来了 Flask 应用和 Redis 容器,可能已经用到过这样的命令。为什么容器之间可以通过容器名互相访问?默认的bridge网络和自定义网络有什么区别?容器怎么访问宿主机的服务?多个宿主机上的容器能互相通信吗?这篇指南将为你揭开 Docker 网络的神秘面纱,通过几个实战场景,逐步掌握 Docker 网络的使用。Docker 在安装时会创建三种默认网络,你可以用bridge:默认网络。每个容器启动时如果不指定网络,就会加入这个网络。

2026-04-07 11:29:22 574

原创 Docker 进阶指南-Windows版:从镜像定制到容器编排,手把手带你玩转 Docker 实战

默认情况下,Docker 会为每个容器分配一个 IP,但这个 IP 是动态的,重启后可能变化,而且,容器之间可以通过--link来通信,但这种方式已经过时。更好的做法是创建一个自定义网络,让容器通过容器名互相访问。

2026-04-03 11:29:26 789

原创 Lambda 表达式中的变量捕获与 effectively final

是指变量初始化后不再改变,即使没有final关键字。Lambda 表达式只能访问 effectively final 的局部变量,不能修改它们。这一限制源于 Java 变量捕获的值复制机制,保证了语义清晰和生命周期安全。如果需要“修改”外部变量,可以使用数组、或对象字段,但要关注线程安全。在循环中使用 Lambda 时,注意创建临时 effectively final 变量来捕获循环变量。

2026-04-02 09:34:14 453

原创 Java 日期时间 API(java.time)最佳实践

包,基于 JSR-310),彻底解决了这些问题。它设计清晰、不可变、线程安全,并且提供了丰富的操作。理解它们的关系是正确使用 API 的第一步。例如,在夏令时开始的那一天,凌晨2点变成3点,那么加一天后,时间可能不再是原来的小时。的最佳实践,从核心类的选择到常见陷阱的规避都有涉及。没有时区信息,如果用它存储跨时区的时间,会导致混乱。然而,很多开发者仍然在用旧 API,或者对。例如,一个用户在纽约创建了一个订单,时间是。并指定时区,避免驱动自动转换带来的歧义。是线程安全的,可以定义为常量复用。

2026-04-01 09:30:24 395

原创 Windows 上的 Docker 使用技巧

还在为装数据库折腾半天?还在为环境不一致而头皮发麻?Docker 一出,这些问题统统消失。第一次听说 Docker 的时候,我也觉得它是运维才玩的东西。直到有一天,我被 MySQL 卸载不干净、Redis 编译报错、Python 版本冲突搞得焦头烂额,才终于忍不住试了一下。结果——真香。这篇文章,我就从一个普通开发者的视角,聊聊 Docker 到底能帮你省下多少时间,以及怎么在 Windows 上把它用得飞起。

2026-03-31 18:17:29 1939 1

原创 枚举的高级用法——用枚举实现策略模式和状态机

枚举 + 接口:为每个常量定制行为,消除条件判断。枚举 + Lambda:更简洁的策略实现。枚举单例:最优雅、最安全的单例模式。枚举 + 状态机:清晰表达状态流转。:性能与安全的双重保障。

2026-03-31 08:42:41 866

原创 ConcurrentHashMap.computeIfAbsent():高并发下安全初始化的终极方案

是 ConcurrentHashMap 提供的高并发初始化利器,它原子性地完成了“检查-计算-插入”三步,避免了并发下的重复计算和覆盖。相比外部同步,它只在必要时加锁,粒度更细,性能更高。使用时要牢记注意事项:mappingFunction 应轻量、幂等、不返回 null,并避免递归。

2026-03-30 11:19:39 790

原创 用 Objects 工具类告别手写 equals 和 hashCode

安全自动处理 null,避免 NPE简洁一行代码生成哈希码规范:注意浮点数比较需用性能:大部分场景性能足够,不必过早优化。

2026-03-26 17:36:28 630

原创 日志打得好,Bug 跑不了!用 MDC 实现全链路追踪

没有 traceId 的日志,就像没有 GPS 的快递——你知道它出发了,但不知道它在哪。

2026-03-25 18:20:30 572

原创 一行代码让异步任务继承主线程的用户信息!InheritableThreadLocal 的正确打开方式

在 Web 应用中,我们常把 、、 存入 ,但一旦提交到线程池(如 ),子线程就拿不到这些上下文!日志丢失追踪 ID?多租户数据错乱?权限校验失败?本文我们来盘下用 安全传递上下文,并揭示其隐藏陷阱与生产级解决方案。假设我们在请求入口设置用户 ID:在 Controller 中:原因: 是线程隔离的,子线程无法访问主线程的变量。Java 提供了 ,文档说:试试看:再运行:但是这还是有陷阱,我们接着往下看。上面的成功是因为 默认使用 ForkJoinPool,而 ForkJoinPool 的工

2026-03-24 19:40:04 686

原创 回调很难受?试试CompletableFuture 的链式异步

切勿在生产环境使用默认 ForkJoinPool!// 在服务初始化时注入并在// 模拟耗时操作// ← 显式指定线程池。

2026-03-23 18:16:45 831

原创 结构化并发:用 StructuredTaskScope 编写结构化的并发代码

在web开发过程中,可在 Service 层直接使用(需 JDK 21 +—— 子任务的生命周期必须严格包含于父作用域之内。:同时查询两个价格服务,取最快返回的有效价格。:同时获取用户信息和订单列表,两者都必须成功。:全成功才返回,任一失败则整体回滚。欢迎 star & fork!:最快成功者胜出,其余被中断。如图所示,结构化并发通过。强制子任务生命周期受控。,实现高效挂起/恢复。

2026-03-21 17:27:15 697

空空如也

空空如也

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

TA关注的人

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