自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(227)
  • 资源 (3)
  • 收藏
  • 关注

原创 简单聊聊 Spring 框架源码

AOP 是什么:AOP(Aspect-Oriented Programming ,面向切面编程):把横切在各个方法里的公共逻辑(事务,日志,权限,缓存)从业务代码中抽取出来,集中定义,运行时动态织入;AOP能力的基石头: 事务,AOP 都靠代理,代理的前提是对象由容器创建,如果是业务代码new的, Spring 没机会包装,IOC 让对象的出生经过容器之手,容器才能在出生时做增强。一级缓存放的是成品,不能放半成品, 三级缓存存的是ObjectFactory,是 如何制造早期引用的配方,而不是引用本身;

2026-09-09 09:58:05 77

原创 【leetcode658】有序数组找出k个最接近x的数

返回的结果必须要是按升序排好的。,从数组中找到最靠近。

2026-08-31 14:44:50 178

原创 简单聊聊 Seata 源码

一阶段:本地事务(业务 SQL + undo log 同生共死)→ 数据真实落库全局锁:lock_table 行级锁 → 写隔离,防互相污染二阶段:undo log 反向补偿 → 回滚能力,脏写校验兜底TM 用 ThreadLocal 的 xid 串起三端,TC 用 GlobalSession 管全局,RM 用三层代理拦 SQL——代理、快照、undo、锁、补偿,五个关键词把"为什么一阶段就提交"讲透,面试官就知道你看过的不只是文档。

2026-08-26 14:25:56 211

原创 简单聊聊 Discovery 源码

/ ① 监听 WebServer 启动完成事件 —— 端口在这时才知道@Override// ② 拿到实际端口,塞进注册信息start();if (!register();// ③ 执行注册// 管理端口单独注册(actuator 独立端口时)// ④ 交给 ServiceRegistry为什么等 WebServerInitializedEvent?注册信息里必须有端口,而端口是 Tomcat 启动后才知道的(可能是随机端口)——事件驱动拿到真实端口再注册,这是它继承的原因;

2026-08-22 16:15:27 330

原创 简单聊聊 OpenFeign 框架源码

骨架:JDK 动态代理 + 方法元数据 + handler 分发,和 MyBatis 同一套路;主线:调用 → 填 RequestTemplate → 拦截器 → 负载均衡选实例 → Client 执行 → Decoder 解码,异常走 ErrorDecoder/Retryer/fallback;Spring 整合三件事扫描注册 FactoryBean、懒构建代理、给每个客户端独立配置;面试主线。

2026-08-22 14:49:29 445

原创 简单聊聊 Sentinel 源码

主线一条SphU.entry→ 找 Slot 链 →依次过 8 个 Slot,BlockException 是唯一的"预期失败"信号;设计三件套:资源模型(字符串标识 + Entry)、责任链(规则检查可插拔,SPI 扩展)、滑动窗口(LeapArray + LongAdder,无锁高并发统计);算法分两路:流控三种效果(快速失败/预热/排队,对应三种 Controller),熔断三态状态机(CLOSED/OPEN/HALF_OPEN,CAS 探测);面试主线。

2026-08-21 16:33:44 367

原创 简单聊聊 MyBatis 源码

缓存作用域开启方式失效点一级缓存SqlSession默认开启update 自动清空;SqlSession 关闭即销毁二级缓存总开关 +<cache/>该 namespace 的增删改清空它;跨 namespace 更新不会清一级缓存脏读场景:两个 SqlSession,A 查完改库,B 用旧缓存读到脏数据;UserMapper缓存了联查 Order 的结果,更新后 User 的缓存不知道;

2026-08-19 17:22:41 395

原创 简单聊聊 SpringCloud 微服务调用链路源码

底座:Spring Cloud Context/Commons 定义抽象(bootstrap 上下文、DiscoveryClient、LoadBalancerClient、RefreshScope);接入:统一靠 Spring Boot 的@Import+ 自动装配(每个组件都是@EnableXxx → Registrar → FactoryBean/装饰器调用:Feign 把接口变代理、LoadBalancer 把服务名变地址、DiscoveryClient 把注册表变实例列表——

2026-08-17 23:44:44 231

原创 简单聊聊 SpringBoot 框架执行源码

一条主线构造收集 SPI → 准备环境(加载配置) → 创建空容器 → 填充上下文 → refresh(解析配置类 + 条件装配 + 启动 Tomcat + 实例化单例) → 发布就绪事件 → 执行 Runner。三个扩展点(refresh 前改容器)、(监听启动全生命周期事件)、(就绪后执行一次性逻辑)。面试时先画事件时间线 + refresh 12 步,再把"自动装配在哪步、Tomcat 在哪步"钉到具体步骤上,基本就聊透了。

2026-08-17 22:28:32 489

原创 简单聊聊 ThreadLocal 源码

ThreadLocal 整个类加在一起,没有一把锁。值不存 ThreadLocal 里而是存在"线程自己的 ThreadLocalMap"里key 用弱引用防 ThreadLocal 对象泄漏value 用强引用,用完必须 remove配上魔数 0x61c88647 的均匀哈希、开放寻址的线性探测、2/3 阈值的扩容,和"尽力而为"的过期清理,就是全部。背结论容易,把这五块(存哪、弱引用、魔数、探测、泄漏)讲清楚,才是真懂 ThreadLocal。

2026-08-14 21:44:02 379

原创 简单聊聊 ConcurrentHashMap 源码

JDK 1.7 的 HashMap/CHM 扩容用头插,并发下会形成环形链表死循环;1.8 全部改尾插,新节点挂在链尾,链表顺序稳定,死循环问题从根上消失。ConcurrentHashMap 1.8 的put,本质是一条"尽可能无锁、不得已才加锁"的降级路线空桶 → CAS 一把梭(无锁)非空桶 → synchronized 只锁桶头(细粒度)扩容中 → 帮忙搬(协作,JDK)spread 扰动降低碰撞、尾插根除死循环、分散计数。

2026-08-13 23:01:13 346

原创 简单聊聊线程池源码

ctl用位运算把状态和线程数压进一个 int,换来原子性和可比较性;execute用三步提交实现"先线程、再队列、最后扩容"的渐进策略;用 while 循环实现线程复用;getTask用 take/poll 区分核心与非核心线程的生命周期。把这四个点吃透,线程池的源码面试基本就过关了。完整代码见 MyThreadPool.java,也可以对照 JDK 的逐行读,体会 Doug Lea 的位运算功力。

2026-08-12 23:14:17 332

原创 MySQL 知识体系

redo log 的工作原理是基于页的LSN做增量重放,磁盘上的页本身要是完整的, 校验合法的,而半页写的页页头LSN 可能也顺坏,没法跟redo 的LSN比较, chencSum 校验失败没法确认这个页的状态,redo log 没法保证页的完整性,所以需要从双写区县拿副本还原。4.并发控制:MVCC机制,RC 和RR 隔离级别下,普通读走一致性快照读,读的是历史版本 ,不加锁,不阻赛,不被写阻塞;中点插入:新读入的页不插入链表头部,而是插入old区头部,Young 区值放 被确认是热的页。

2026-08-10 19:22:58 254

原创 并发编程知识体系

本文摘要: 锁机制对比:共享锁/排他锁关注兼容性,乐观锁/悲观锁是并发处理策略,各有适用场景。 线程池配置:基于CPU核心数和任务类型(I/O或计算密集型),通过公式初算后结合监控调优。 单核CPU并发问题:仍存在可见性(寄存器缓存)、原子性(线程切换)和有序性(指令重排)问题。 缓存机制:缓存一致性协议(MESI)保证数据一致性,缓存锁基于协议实现原子操作,两者目标不同但协同工作。 synchronized锁升级:根据竞争强度自适应升级(无锁→偏向锁→轻量级锁→重量级锁)

2026-08-09 13:19:39 218

原创 JVM知识体系

JVM知识体系摘要 对象创建 类加载:分加载、连接(验证/准备/解析)、初始化三阶段,解析阶段将符号引用(编译时的字符串描述)转为直接引用(运行时内存地址)。 并发安全:通过TLAB(线程私有分配缓冲区)减少竞争,空间换时间,高频分配无锁,低频分配同步。 对齐填充:确保对象8字节对齐,提升CPU访问效率、支持指针压缩及GC优化。 对象使用 动态链接:运行时解析符号引用为直接引用,支持多态和动态类加载,延迟解析节省内存。 对象销毁 GC Root:包括栈帧变量、静态变量、常量等,代表程序运行时的必需对象,不可

2026-08-09 12:57:33 185

原创 【netty】TCP 粘包和拆包及解决方案

TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的由于TCP无消息保护边界, 需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题, 如下图。

2023-07-10 23:41:50 713

原创 【netty】Netty模型

当向一个 Selector 中注册 Channel 后,Selector 内部的机制就可以自动不断地查询(Select) 这些注册的 Channel 是否有已就绪的 I/O 事件(例如可读,可写,网络连接完成等),这样程序就可以很简单地使用一个线程高效地管理多个 Channel。入站事件和出站事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰。

2023-07-10 23:36:56 468

原创 【netty】Reactor线程模型

目前存在的线程模型有:传统阻塞 I/O 服务模型 Reactor 模式根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现单 Reactor 单线程;单 Reactor 多线程;主从 Reactor 多线程Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor)

2023-07-04 23:50:09 379

原创 【netty】I/O模型

Java BIO 就是传统的java io 编程,其相关的类和接口在 java.ioBIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序简单易理解。

2023-07-04 00:08:58 252

原创 【netty】什么是netty

netty

2022-10-31 22:22:09 301

原创 线程相关概念

一.线程运行的原理每个线程启动后,虚拟机就会为其分配一块栈内存。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。线程上下文切换(Thread Context Switch)因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码线程的 cpu 时间片用完垃圾回收有更高优先级的线程需要运行线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方

2022-05-28 21:13:51 180

原创 【设计模式】【行为型】备忘录模式

一.概述1.1 概述又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态1.2 结构发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能

2022-05-23 23:41:03 216

原创 【设计模式】【行为型】访问者模式

一.概述1.1 概述1.2 结构二.场景三.类图及实现

2022-05-23 23:15:35 155

原创 【设计模式】【行为型】迭代器模式

一.概述1.1 概述提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。1.2 结构抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返回一个具体迭代器的实例。抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成

2022-05-23 20:51:36 212

原创 【设计模式】【行为型】中介者模式

一.概述1.1 概述又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。1.2 结构抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽

2022-05-23 20:17:20 179

原创 【设计模式】【行为型】观察者模式

一.概述1.1 概述又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。1.2 结构Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,

2022-05-23 19:29:21 185

原创 【设计模式】【行为型】命令模式

一.概述1.1 概述将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。1.2 结构命令模式包含以下主要角色:抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。实现者/接收者(Receiver)角色: 接收者,真正执行命令的对象。任何类都可能成

2022-05-22 22:42:59 256

原创 【设计模式】【结构型】享元模式

一.概述1.1 概述运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。1.2 结构享元(Flyweight )模式中存在以下两种状态:内部状态,即不会随着环境的改变而改变的可共享部分。外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现享元模式的主要有以下角色:抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提

2022-05-22 21:16:12 139

原创 【设计模式】【结构型】组合模式

一.概述1.1 概述又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。1.2 结构组合模式主要包含三种角色:抽象根节点( ):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性。树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最

2022-05-22 20:47:40 167

原创 【设计模式】【结构型】外观模式

一.概念1.1概念又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。1.2结构外观(Facade)模式包含以下主要角色:外观(Facade)角色:为多个子系统对外提供一个共同的接口。子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。二.场景物联网时代,可以将打开灯、打开电视、打开空调;睡觉

2022-05-22 18:15:36 165

原创 【设计模式】【结构型】桥接模式

一.概念1.1概念将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和现这两个可变维度的耦合度。1.2 结构桥接(Bridge)模式包含以下主要角色:抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。

2022-05-22 18:03:09 165

原创 【设计模式】【结构型】装饰者模式

一.概述1.1 概念指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。1.2 结构装饰(Decorator)模式中的角色:抽象构件(Component)角色 :定义一个抽象接口以规范准备接收附加责任的对象。具体构件(Concrete Component)角色 :实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰(Decorator)角色 : 继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。具体装饰(ConcreteDecora

2022-05-22 17:11:24 146

原创 【设计模式】【结构型】适配器模式

一.概念将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。适配器模式(Adapter)包含以下主要角色:目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。适配器(Adapter)类:它是一个转换器,通过继承或引用适

2022-05-22 16:28:10 195

原创 【设计模式】【创建型】建造者模式

一.概述将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型

2022-05-21 22:00:28 184

原创 【设计模式】【创建型】原型模式

一.概述1.1用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。1.2结构原型模式包含如下角色:抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。访问类:使用具体原型类中的 clone() 方法来复制新的对象。二.场景2.1 类图2.2 代码public class Realizetype implements Cloneable { public Real

2022-05-21 21:35:00 231

原创 【设计模式】概述

一.概述1.1 概念软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。1.2 分类创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF(四人组)书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5

2022-05-21 17:07:01 149

原创 I/O模型

一.Java BIO1.1同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器 端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销1.2解决处理多个客户的请求:开启线程或线程池处理客户端连接请求;1.3缺点:每个Socket接收到,都会创建一个线程,线程的竞争、切换上下文影响性能;每个线程都会占用栈空间和CPU资源;并不是每个socket都进行lO操作,无意义的线程处理;客户端的并发访问增加时。服务端将呈现1:1的线程开销,访问量越

2022-05-11 10:48:21 174

原创 Sharding-jdbc执行流程分析

一.流程分析(1)解析sql,获取片键值,在本例中是order_id(2)Sharding-JDBC通过规则配置数据库和表路由规则 t_order_$->{order_id % 2 + 1},知道了当order_id为偶数时,应该往 t_order_1表插数据,为奇数时,往t_order_2插数据。(3)于是Sharding-JDBC根据order_id的值改写sql语句,改写后的SQL语句是真实所要执行的SQL语句。(4)执行改写后的真实sql语句(5)将所有真正执行sql绑定表 :指

2022-05-10 14:35:51 831

原创 Spring 事务失效的几种场景

1.抛出检查异常导致事务不能正确回滚spring 默认只会回滚非检查异常,需要配置rollbackFor属性指定回滚2.业务方法内自己try-cache异常导致事务不能正确回滚事务通知只有捕获到目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉解决:cache中原样抛出异常或者cache代码块中执行 TransactionInterceptor.currentTransactionStatus().setRollbackOnly();3.日志Aop切面 中捕获了s

2022-05-09 00:16:34 396

原创 Sharding-JDBC快速入门demo

一.需求描述使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用 方法;通过Sharding-Jdbc向订单表插入数据, 按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_2,通过Sharding-Jdbc 查询数据,根据 SQL语句的内容从t_order_1或t_order_2查询数据。二.环境搭建1.sqlCREATE DATABASE `order_db` CHARACTER SET 'u

2022-05-07 21:35:00 804

mq-starter.zip

RocketMQ消息中间件,微服务集成此jar即可快速发送消息,无需关心发送细节

2021-07-03

ratelimiter-starter.zip

限流框架源码 源码解析:https://blog.youkuaiyun.com/weixin_47626220/article/details/117364111

2021-05-28

读写分离源码及其测试代码

读写分离插件的源码,其中db-router-test项目是测试项目代码,先 mvn install datasource-router-starter项目后可运行测试;源码解析:https://blog.youkuaiyun.com/weixin_47626220/article/details/117090788

2021-05-24

空空如也

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

TA关注的人

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