自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 XXL-JOB Executor执行器端执行源码

在上一篇文章中,我们详细分析了调度中心的启动和调用算法,了解了任务是如何被发送到执行器的。今天,我们将视角切换到执行器端,看看当任务请求到达后,执行器是如何处理、排队、执行并最终回调给调度中心的。本文将继续深入源码,重点分析ExecutorBizImpl.run方法和JobThread的核心逻辑,并详细解读三种阻塞策略的实现原理。

2026-02-24 09:44:08 551

原创 XXL-JOB Admin端启动流程和调度算法源码

XXL-JOB 作为国内使用最广泛的轻量级分布式任务调度平台,其 Admin 端(调度中心) 的设计极具代表性。本文将深入到 XXL-JOB Admin 端的源码层面,完整梳理其启动流程与核心调度链路。从 XxlJobScheduler 的初始化,到 registryMonitorThread 的注册保活机制;从 慢任务探测与线程池隔离 的时间滑动窗口算法,到 十种路由策略(轮询、LRU、LFU、一致性 Hash 等)的底层实现,逐一拆解。

2026-02-13 10:58:45 651

原创 XXL-JOB执行器启动与注册源码分析

在分布式任务调度架构中,XXL-JOB 以其轻量级、易集成的特性被广泛应用于定时任务的管理与执行。本文将从源码层面深入分析其执行器(Executor)的启动机制,特别是通过 XxlJobSpringExecutor 这一 Spring Bean 的配置与初始化过程。我们将重点探讨其配置参数的实际作用、执行器的注册流程,以及底层 Netty 服务与调度中心(Admin)的通信机制,帮助开发者更好地理解其内部工作原理。

2026-02-06 14:20:25 362

原创 Spring Security 是如何注入 Tomcat Filter 链的 —— 启动与请求源码分析

在前面的文章中,我们已经从源码层面分析了 Tomcat 的启动流程、请求处理模型,以及 Spring Boot 是如何在嵌入式 Tomcat 场景下完成 Servlet 和 Filter 注册的。在此基础上,一个自然的问题是: 像 Spring Security 这样的安全框架,是如何介入 Tomcat 的 Filter 链,并在请求到达业务代码之前完成认证和鉴权的?

2026-01-22 14:15:10 773

原创 SpringBoot嵌入Tomcat注册Servlet、Filter流程

在前面的几篇文章中,我们已经从源码层面分析了 Tomcat 的启动流程和请求处理机制,包括 init / start 生命周期以及一次 HTTP 请求在容器内部的完整流转过程。但在实际项目中,越来越多的应用并不是以“独立 Tomcat + WAR 包”的形式部署,而是通过 Spring Boot 以嵌入式 Tomcat 的方式启动。这也带来了一个常见的疑问: 当没有 web.xml、没有手动部署应用时,Servlet 和 Filter 是在什么时候、又是如何被加载到 Tomcat 中的?

2026-01-17 10:20:08 655

原创 Tomcat源码分析三(Tomcat请求源码分析)

Request 是在什么时候创建的?org.apache.catalina.connector.Request 和 HttpServletRequest 之间是什么关系?请求是如何一步步交给应用层 Servlet 的?带着这些问题,本文将以 Tomcat 源码为线索,从 Connector 到 Container,梳理一次 HTTP 请求在 Tomcat 内部的完整执行路径,本文直接是从原始的请求Request开始往下分析,不会具体分析 请求是如果变成Request对象的,本文基于Tomcat9。

2026-01-14 15:12:10 946

原创 Tomcat源码分析二(Tomcat启动源码分析)

在日常使用 Tomcat 时,我们往往只关注它如何“跑起来”,却很少真正去理解 Tomcat 是如何一步一步完成启动的。本文从 Bootstrap 入口开始,到 Server、Service、Connector、Engine、Host、Context 的层层初始化,再到端口监听、请求接管,Tomcat 在启动过程中隐藏了大量精巧的设计与工程实践。

2026-01-08 15:35:18 441

原创 Tomcat源码分析一(Tomcat目录和配置文件说明)

Tomcat作为一款轻量级、开源且广泛使用的Java Web服务器和Servlet容器,其内部架构和配置机制对于Java Web开发者而言具有重要的学习价值。深入理解Tomcat的目录结构、配置文件以及类加载机制,不仅有助于我们更好地部署和管理Web应用,还能在遇到性能调优、安全配置、多环境部署等问题时提供清晰的解决思路。本文将从Tomcat的基础目录结构入手,逐步解析其核心配置文件的作用与配置细节,为后续深入分析Tomcat源码打下坚实的基础。

2026-01-03 09:09:14 800

原创 RocketMQ源码详解(Broker处理消费请求源码)

在分布式消息中间件RocketMQ中,Broker作为消息存储和转发的核心组件,其处理消费请求的机制直接影响着整个系统的性能和可靠性。理解Broker如何处理消费端的拉取请求,对于深入掌握RocketMQ的工作原理、性能调优以及问题排查都至关重要。本文将以RocketMQ 4.9.8版本为基础,深入分析Broker处理消费请求的源码实现。分层存储架构:通过CommitLog+ConsumeQueue的存储设计,实现了高效的随机读和顺序写。零拷贝优化。

2025-11-15 14:20:32 803

原创 RocketMQ源码详解(消费端启动流程)

在分布式消息系统中,消费端的启动流程往往决定了系统能否稳定、高效地处理消息。消费者不仅仅是简单地“连上 Broker 然后收消息”,而是涉及到客户端初始化、负载均衡、队列分配、消息拉取线程、消费服务线程等一系列环节。理解消费端的启动流程,有助于我们掌握 RocketMQ如何实现高可用的消费机制,以及在遇到消息堆积、消费延迟、负载不均等问题时,能快速定位到具体环节。在这篇文章中,我们就从源码角度梳理RocketMQ 消费端启动流程,看看一个消费者从start()

2025-10-25 11:07:22 1191

原创 RocketMQ源码详解(Broker保存消息源码)

在分布式消息队列系统中,消息存储是其核心组成部分之一,它直接决定了消息的可靠性、系统的扩展性与性能。RocketMQ 作为一款广泛使用的高性能、高可靠性的消息队列中间件,凭借其灵活的架构和强大的功能,已成为大规模分布式系统中不可或缺的一部分。在本文中,我将重点解析 RocketMQ Broker 端的消息存储机制。我们将从消息的持久化过程存储结构设计性能优化以及存储与消费的高效协作。

2025-10-22 10:23:43 803

原创 RocketMQ源码(发送消息源码)

在分布式消息系统中,发送端(Producer)扮演着至关重要的角色。它不仅负责将消息高效、可靠地投递到 Broker,还需要在网络波动、Broker负载变化等复杂场景下保证消息的一致性和可达性。Apache RocketMQ 作为阿里巴巴开源并捐赠给 Apache 基金会的高性能消息中间件,其发送端实现有着极高的工程价值和设计考量。消息是如何从 Producer 组装、序列化并发往 Broker 的?发送过程中的重试、超时、路由更新是怎么实现的?同步发送、异步发送、单向发送底层的区别在哪里?

2025-10-11 14:32:45 1050

原创 RocketMQ源码详解(Broker启动过程源码分析)

在分布式消息中间件RocketMQ的架构中,Broker扮演着核心的消息存储和转发枢纽角色。它直接承担了生产者的消息投递、消费者的消息拉取以及消息的持久化存储等核心职责,其稳定性和性能直接决定了整个消息集群的服务质量。本文将深入剖析RocketMQ 4.9.8版本中Broker服务的启动过程源码。我们将从启动脚本的入口开始,一步步揭开Broker如何初始化其核心控制器、如何加载配置与元数据、如何构建高性能的存储引擎和网络通信层,最终如何向NameServer完成注册,正式对外提供服务的完整过程。

2025-09-03 15:49:52 781

原创 RocketMQ源码详解(NameServer启动流程)

消息中间件的设计思路一般是基于主题订阅发布的机制,消息生产者(Producer)发送某一个主题到消息服务器,消息服务器负责将消息持久化存储,消息消费者(Consumer)订阅该兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(Push模式)或者消费者主动向消息服务器拉去(Pull模式),从而实现消息生产者与消息消费者解耦。为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。那消息生产者如何知道消息要发送到哪台消息服务器呢?

2025-08-30 10:52:23 1058

原创 Netty的Http解码器源码分析

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种基于请求-响应模型的无状态应用层协议,广泛用于客户端(如浏览器)和服务器之间的数据通信。基于 TCP 连接(默认端口 80 / HTTPS 默认端口 443);无状态:每次请求都是独立的,服务器不会保留会话状态;文本格式:数据以文本形式组织,便于调试和阅读;支持多种方法:常见如 GET、POST、PUT、DELETE 等;本文围绕的源码展开,从字节流解析、请求行与请求头提取,请求体提取到组装为 Java 层级的。

2025-07-30 21:36:49 1048

原创 Netty解码器在RocketMQ的应用

本文详细分析了Netty解码器在RocketMQ中的实际应用,重点围绕Broker注册到NameServer的流程展开,展示了自定义编解码逻辑在客户端与服务端之间的协作机制。1.Broker端编码流程使用NettyEncoder将RemotingCommand对象编码为字节流,通过fastEncodeHeader方法构建完整的帧结构(包括总长度、头部元数据、头部数据和可选的Body数据)。帧结构的设计清晰,通过ByteBuf的索引操作确保数据的正确性和完整性。2.NameServer端解码流程。

2025-07-28 08:10:08 588

原创 Netty 解码器深入分析:调用时机与继承关系

定义:解码器是 Netty 中用来从 ByteBuf 中提取消息内容的组件。作用:将字节流转化为 Java 对象,以供业务层处理。常见解码器:LengthFieldBasedFrameDecoder、LineBasedFrameDecoder、DelimiterBasedFrameDecoder等。类定义:LineBasedFrameDecoder是一个基于行分隔符的帧解码器,通常用于处理类似HTTP、IRC 等协议。构造方法:maxLength:设置消息的最大长度,用于防止无限制读取数据。

2025-07-23 09:04:25 1103

原创 Netty服务端请求处理源码

自研事件循环模型(EventLoopGroup)非阻塞 IO + 任务队列并行执行(ioRatio)拆分任务类型(定时、尾部)优化调度可重建 Selector 规避空轮询 bugpipeline 解耦、责任链清晰这使得Netty在海量连接、高并发场景下依然保持稳定和灵活。

2025-07-19 08:55:02 700

原创 Netty主要组件和服务器启动源码分析

本文系统性地介绍了Netty框架中各个核心组件的作用与协作机制,深入剖析了诸如 Channel、EventLoop、ChannelPipeline、ChannelHandler、ByteBuf、Future/Promise 等关键类的职责与内部设计。同时,也详细分析了 Netty 中一些重要类的构造函数实现,解释了它们在框架初始化与运行过程中的关键角色。

2025-07-13 08:11:18 477

原创 CompletableFuture源码分析

Java8 引入了CompletableFuture,大大增强了Future接口的能力,支持异步编排、链式调用和异常恢复, 它既是Future的实现类,也是接口的实现, 本文将深入分析其源码结构,了解其核心机制、线程模型和异常处理等设计亮点,本文基于JDK版本:JDK21(源码中已引入VarHandle替代Unsafe)。本文围绕CompletableFuture的核心方法如supplyAsync、thenApply、thenAccept、exceptionally、allOf、get 展开了系统源码分析。

2025-07-01 08:02:37 928

原创 ForkJoinPool源码分析与示例

ForkJoinPool是Java引入的高效并行任务执行框架,基于分治思想。适合将大任务拆分为小任务并行处理。利用多核CPU,提升计算密集型任务性能。兼顾任务拆分、调度和负载均衡。内置工作窃取算法(work-stealing)。本文基于JDK21进行源码分析。每个工作线程拥有自己的任务双端队列线程只从队列头部执行任务保障高CPU利用率,避免线程空闲减少同步开销,提升并行效率抽象基类,代表可分割的任务任务拆分执行核心提供fork()、join()、compute()方法。

2025-06-18 08:55:06 802

原创 DelayQueue源码解析

DelayQueue是Java并发包提供的一个无界阻塞队列,元素必须实现Delayed接口。元素带有“延迟时间”,只有延迟到期后,元素才能被获取。基于最小堆(优先队列)实现,内部使用来排序。线程安全,适合调度、任务过期处理等场景。实现类位于。DelayQueue是Java并发容器中极具代表性的阻塞队列,适用于定时调度类业务结合 PriorityQueue + Condition + leader 线程,实现高效的等待与唤醒机制适合中小规模的延迟任务调度;

2025-05-28 16:06:17 1130

原创 PriorityQueue源码分析

是Java 集合框架中的一个基于优先堆(Heap)实现的无界优先级队列,默认是最小堆,元素的自然顺序或者自定义比较器决定元素优先级。它适合需要快速获取最小/最大元素的场景。Java的PriorityQueue是基于小顶堆实现的优先队列,默认使用元素的自然顺序。支持自定义比较器从而构建大顶堆或其他逻辑顺序。构造函数设计灵活,支持多种初始化方式。源码整体结构简洁高效,适合在各种需要优先队列的场景中使用。

2025-05-20 08:10:22 916

原创 ArrayBlockingQueue源码分析

ArrayBlockingQueue 是一个基于数组的有界阻塞队列。使用了显式锁机制 ReentrantLock 和条件变量 Condition 实现线程安全与阻塞功能。更适用于任务队列、生产者-消费者模型等并发场景。

2025-05-13 09:41:39 821

原创 ConcurrentHashMap源码分析与实现原理

ConcurrentHashMap通过CAS无锁化、分段锁、协作式扩容及智能数据结构(链表/树动态转换),在保证线程安全的同时极大提升了并发性能。其扩容机制中的 ForwardingNode跳转与多线程任务分片设计,堪称并发容器的典范,尤其适合高吞吐、低延迟的分布式场景。

2025-04-17 16:19:53 706

原创 TreeMap源码分析与红黑树实现原理

TreeMap通过红黑树保证数据的有序性,同时提供 O(log n) 级别的查找、插入和删除操作。掌握红黑树的旋转(左旋、右旋)及平衡调整机制,可以更好地理解TreeMap的内部实现!

2025-04-08 16:37:45 1159

原创 LinkedHashMap源码分析及LRU实现原理

继承自HashMap,但它额外维护了一个双向链表,用于维护元素的顺序。可以按照插入顺序或访问顺序迭代元素。提供方法,方便实现 LRU 缓存。LinkedHashMap继承自HashMap,但额外维护了双向链表,支持按插入顺序或访问顺序迭代元素。通过 accessOrder = true 和 removeEldestEntry,可以轻松实现 LRU 缓存。afterNodeAccess、afterNodeInsertion和afterNodeRemoval 方法负责维护双向链表,确保访问顺序正确。

2025-03-31 13:51:43 398

原创 HashMap 底层源码分析

null,此时p的值是发生冲突时之前已经存在的值,此时分三种情况判断,判断要添加的hash是否等于冲突的hash值并且key是否相等,如果相等,说明两个对象是同一个对象,把p的值赋值给临时变量e,如果e不为空,先保留老的oldValue值,把之前的value值赋值为要添加的value,即覆盖已经存在的value值,返回老的value值。二是红黑树的情况下;这块的逻辑主要是处理链表桶(非红黑树)的情况,它的主要逻辑是对旧桶中的链表进行重新分配,将节点拆分到新的newTab数组中不同的桶位置。

2025-03-26 15:29:52 1260

原创 LinkedList 底层源码深度解析

本文深入分析了LinkedList与ArrayList在数据结构上的不同,探讨了它们的适用场景及时间复杂度对比。LinkedList作为一个基于双向链表的数据结构,在插入和删除操作方面表现优异,特别适用于频繁插入、删除的场景,而 ArrayList 则在随机访问方面更具优势。在源码分析部分,我们详细解读了LinkedList的底层实现,深入解析了add()方法的多个重载版本,了解了元素如何被插入到链表的不同位置。

2025-03-18 09:38:16 811

原创 深入剖析Java ArrayList源码

*2.1 List接口的实现**作为动态数组的核心契约,List 接口的实现是 ArrayList 的基础能力来源。(1) 动态扩容的 add 方法// 添加单个元素(核心方法)modCount++;// 结构性修改计数器// 内部方法if (s == elementData.length) // 容量已满// 扩容逻辑// 尾部插入// 更新逻辑大小。

2025-03-11 12:35:21 446

原创 ThreadLocal源码分析

ThreadLocal是Thread的局部变量,用于不同线程之间的数据隔离。每个线程都可以通过ThreadLocal获取到属于自己的数据副本,这样各个线程之间的数据不会互相干扰。

2025-02-22 22:16:46 676

原创 SpringBoot整合Aop源码之动态代理调用分析

本文分析了Cglib代理的请求过程的源码,可以总结简化出如下两点调用步骤1.把能应用于目标对象的Advisor数组转换为包含各种前置通知、异常通知、后置通知等的MethodInterceptor对象集合。2.通过责任链模式依次调用MethodInterceptor对象的invoke方法执行通知方法,在后置通知中有个finally代码块会最后被执行。

2024-02-12 22:59:45 957 1

原创 SpringBoot整合Aop源码之Aop生成动态Cglib代理源码分析

1.AOP先通过AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation创建一个增强器的集合,创建的逻辑主要是查找spring容器中标有@Aspectj注解的类,并且方法标有Pointcut、Around、Before、After、AfterReturning、AfterThrowing注解给他们封装为增强器对象。

2024-02-12 22:57:06 1276 1

原创 SpringBoot整合Aop源码之Aop的加载过程分析

什么是AOP?AOP(面向切面编程)是一种软件开发范式,旨在通过在程序中插入称为“切面”的特殊代码,来提高代码的可维护性、可重用性和可扩展性。切面是与业务逻辑无关的代码,用于横切关注点,例如日志记录、性能监测、事务管理等。在传统的面向对象编程中,应用程序的逻辑通常被分解为多个对象,这些对象协同工作以完成任务。而AOP允许你通过横切关注点的方式来封装这些协同工作,从而提高代码的模块化程度。AOP中的关键概念切面是一个模块化单元,其中包含有关横切关注点的信息。它包含了切点、通知和一些其他配置。切点是一个表达式,

2024-02-12 22:53:57 873 1

原创 SpringBoot整合Ribbon源码分析之核心组件之间调用流程分析

通过这个方法还可以看出一个知识点,就是nextIndex是CAS操作,它是一个原子操作,它是比较内存中的值和当前值是否相等,如果相等把值设置为指定的值,如果不等,会在死循环for中判断直到相等为止才返回。

2024-02-08 00:02:24 808

原创 SpringBoot整合Ribbon源码分析之核心组件加载原理

在我的初次探讨中,我深入剖析了Ribbon的核心构建要素。NacosRibbonClientConfiguration会先加载里面的Bean,如果没有会加载RibbonClientConfiguration中的Bean,而RibbonClientConfiguration中的Bean都是@ConditionalOnMissingBean标注的,这表明如果容器中存在这个Bean就不会加载这个Bean,以我们的NacosRibbonClientConfiguration中配置的Bean为最优先加载的。

2024-02-08 00:00:08 1650

原创 SpringBoot整合Ribbon源码分析之Ribbon简介和核心组件

维护着一组Server实例列表,在应该程序运行过程中,Ribbon通过ServerList中的服务实例供负载均衡选择,ServerList维护的实例列表可能在运行过程中发生动态变化。

2024-02-07 23:52:43 624 1

原创 Spring Cloud OpenFeign源码请求原理解析

请求到达时候会调用FeignInvocationHandler的invoke方法,创建一个RequestTemplate对象设置请求头参数等信息,这些可能是在请求拦截器中设置的,接着调用远程服务获取响应对象,把响应对象解码成为我们Feign接口返回的类型,当服务不可用时候还可以进行重试机制,默认最大为5次,如果5次过后还是请求不到会抛出异常。总体来说,这段代码的作用是在发生可重试异常时,判断是否需要进行重试,如果需要,计算下一次重试的时间间隔,并在间隔后进行重试。

2024-02-05 09:05:49 1016 1

原创 Spring Cloud OpenFeign源码FeignClientFactoryBean原理

接着创建一个数据结构是Map<Method, MethodHandler>的对象,遍历标有@FeginClient注解的接口类的方法,这个方法是通过反射获取的,是java.lang.reflect.Method对象,放入到Map中,key是java.lang.reflect.Method对象对象,value是MethodHandler对象,该对象是通过ParseHandlersByName的apply方法封装而来的。由于这个方法代码量很大就不在此做分析了。new Class<?

2024-02-04 18:36:35 1159 1

原创 Spring Cloud OpenFeign源码加载原理

本节主要分析了Feign是怎么被加载到Spring容器中的,其实主要就是在我们的启动类中添加@EnableFeignClients注解,然后注解又引入了一个FeignClientsRegistrar,它是Spring容器会回调的一个类,它是去指定的包路径下寻找所有子包标有@FeginClient注解的类并把他们封装为FeignClientFactoryBean类型的Bean加载到spring容器中。根据Map获取@Feign注解的value值,又调用了。

2024-02-04 18:31:03 944 1

空空如也

空空如也

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

TA关注的人

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