
后端框架源码专栏
文章平均质量分 83
源码解读,含Spring,SpringMVC,SpringBoot,SpringCloud,Netty,Mybatis,RocketMQ,Dubbo,Tomcat等等
小新杂谈社
积极乐观,不畏困难,敢于拼搏,能快速适应环境!
展开
-
Netty 服务端创建源码分析
服务器处于 listen 状态 时,收到客户端 syn 过程(connect) 时在未完成队列中创建一个新的条目,然后用三次握手的第二个过程,即服务器的 syn 响应客户端,此条目在第三个过程到达前 (客户端对服务器 syn 的 ack) 一直保留在未完成连接队列中,如果三次握手完成,该条目将从未完成连接队列搬到已完成连接队列尾部。从调度层面看,也不存在从 EventLoop 线程 中再启动其他类型的线程用于异步执行另外的任务,这样就避免了多线程并发操作和锁竞争,提升了 IO 线程 的处理和调度性能。原创 2024-07-06 16:30:00 · 906 阅读 · 0 评论 -
基于 Netty 创建客户端的流程分析
相对于服务端,Netty 客户端 的创建更加复杂,除了要考虑线程模型、异步连接、客户端连接超时等因素外,还需要对连接过程中的各种异常进行考虑。本章将对 Netty 客户端 创建的关键流程和源码进行分析,以期读者能够了解客户端创建的细节。原创 2024-07-06 09:00:00 · 1123 阅读 · 0 评论 -
TCP 粘包/拆包问题说明Neety解决方案
TCP 是个 “流” 协议,所谓流,就是没有界限的一串数据。TCP 底层 并不了解上层(如 HTTP 协议)业务数据的具体含义,它会根据 TCP 缓冲区 的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。由于底层的 TCP 无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。原创 2024-07-05 15:00:00 · 1098 阅读 · 0 评论 -
Netty 内存池申请内存流程
该文所涉及的 netty 源码版本为 4.1.16。原创 2024-07-05 12:00:00 · 496 阅读 · 0 评论 -
PoolChunk 的内部完全二叉树结构
该文所涉及的 netty 源码版本为 4.1.16。原创 2024-07-04 12:00:00 · 1354 阅读 · 0 评论 -
Netty 的对象池 Recycler 是什么
该文所涉及的 netty 源码版本为 4.1.6。原创 2024-07-04 08:00:00 · 845 阅读 · 0 评论 -
MpscLinkedQueue 是什么
该文所涉及的 netty 源码版本为 4.1.6。原创 2024-07-03 14:30:00 · 863 阅读 · 0 评论 -
HashedWheelTimer 实现图示
因为我玩具项目实现业务 ACK 的方案就打算用 HashedWheelTimer,所以本节核心是分析 HashedWheelTimer,另外会提下它与 schedule 的区别,其它定时任务实现原理就请自动 Google 吧。原创 2024-07-03 10:45:00 · 1084 阅读 · 0 评论 -
Netty 的 FastThreadLocal 源码解析
该文中涉及到的 Netty 源码版本为 4.1.6。原创 2024-07-02 13:30:00 · 1124 阅读 · 0 评论 -
Netty 中的 ByteBuf 为什么会发生内存泄漏
该文所涉及的 netty 源码版本为 4.1.6。原创 2024-07-02 08:45:00 · 1814 阅读 · 0 评论 -
Channel 组件和Unsafe接口
/ 父Channel// Channel的全局唯一标识// 内部辅助类 Unsafe// Netty 会为每一个 channel 创建一个 pipeline// 本地地址// 远程主机地址// 注册到了哪个 EventLoop 上// 是否已注册/*** channnel 会将 网络IO操作 触发到 ChannelPipeline 对应的事件方法。* Netty 基于事件驱动,我们也可以理解为当 Chnanel 进行 IO操作 时会产生对应的IO 事件,原创 2024-07-01 11:21:21 · 507 阅读 · 0 评论 -
ChannelPipeline 的功能和作用
ChannelPipeline 通过 ChannelHandler 来实现事件的拦截和处理,由于 ChannelHandler 中的事件种类繁多,不同的 ChannelHandler 可能只需要关心其中的个别事件,所以,自定义的 ChannelHandler 只需要继承 ChannelInboundHandlerAdapter / ChannelOutboundHandlerAdapter,覆盖自己关心的方法即可。原创 2024-06-30 11:30:00 · 750 阅读 · 0 评论 -
注册中心的Zookeeper实现
Dubbo 的注册中心虽然提供了多种实现,但生产上的事实标准基本上都是 基于 Zookeeper 实现的。这种注册中心的实现方法也是 Dubbo 最为推荐的。为了易于理解 Zookeeper 在 Dubbo 中的应用,我们先简单看一下 zookeeper。由于 Dubbo 是一个分布式 RPC 开源框架,各服务之间单独部署,往往会出现资源之间数据不一致的问题,比如:某一个服务增加或减少了几台机器,某个服务提供者变更了服务地址,那么服务消费者是很难感知到这种变化的。原创 2024-06-29 14:45:00 · 735 阅读 · 0 评论 -
Dubbo注册中心模块简析
注册中心在 Dubbo 中的作用服务治理框架可以大致分为 服务通信 和 服务管理 两部分,服务管理可以分为服务注册、服务订阅以及服务发现,服务提供者 Provider 会往注册中心注册服务,而消费者 Consumer 会从注册中心中订阅自己关注的服务,并在关注的服务发生变更时 得到注册中心的通知。Provider、Consumer 以及 Registry 之间的依赖关系 如下图所示。dubbo-registry 模块 结构分析dubbo 的注册中心有多种实现方案,如:zookeeper、redis、原创 2024-06-30 07:00:00 · 953 阅读 · 0 评论 -
Selector、SelectionKey及Channel组件
Selector、SelectionKey 和 Channel 这三个组件构成了 Java nio 包的核心,也是 Reactor 模型在代码层面的体现。Selector 能让单线程同时处理多个客户端 Channel,非常适用于高并发,传输数据量较小的场景。要使用 Selector,首先要将对应的 Channel 及 IO 事件(读、写、连接)注册到 Selector,注册后会产生一个 SelectionKey 对象,用于关联 Selector 和 Channel,及后续的 IO 事件处理。原创 2024-06-29 07:45:00 · 599 阅读 · 0 评论 -
Linux 网络 IO 模型简介
Linux 的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个 fd (file descriptor,文件描述符)。而对一个 socket 的读写也会有相应的描述符,称为 socket fd (socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据 UNIX 网络编程对 I/O 模型 的分类,UNIX 提供了 5 种 I/O 模型,分别如下。原创 2024-06-28 14:45:00 · 812 阅读 · 0 评论 -
Netty-RPC 调用性能模型分析
作为一个高性能的 NIO 通信框架,Netty 被广泛应用于大数据处理、互联网消息中间件、游戏和金融行业等。大多数应用场景对底层的通信框架都有很高的性能要求,作为综合性能最高的 NIO 框架 之一,Netty 可以完全满足不同领域对高性能通信的需求。本章我们将从架构层对 Netty 的高性能设计和关键代码实现进行剖析,看 Netty 是如何支撑高性能网络通信的。原创 2024-06-28 08:00:00 · 994 阅读 · 0 评论 -
Netty 的三层架构设计
本博文用于重点分析 Netty 的逻辑架构及关键的架构质量属性,希望有助于大家从 Netty 的架构设计中汲取营养,设计出高性能、高可靠性和可扩展的程序。Netty 采用了典型的三层网络架构进行设计和开发,其逻辑架构图如下所示。原创 2024-06-27 14:00:00 · 1686 阅读 · 0 评论 -
RocketMQ 消息发送存储流程
CommitLog 文件的存储目录为${ROCKET_HOME}/store/commitlog ,MappedFileQueue 对应此文件夹,MappedFile 对应文件夹下的文件。如果是第一次写入或者最新偏移量所属文件已满,创建新的文件。第三步:获取当前可以写入的 CommitLog 文件。第四步:将消息写入到 MappedFile 中。2、校验属性的长度不能大于 32767。1、校验主题的长度不能大于 127。2、检查 broker 的角色。第一步:检查消息存储状态。原创 2024-06-27 11:00:00 · 327 阅读 · 0 评论 -
RocketMQ 消息发送流程
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-26 13:00:00 · 901 阅读 · 0 评论 -
从Spring及Mybatis框架源码中学习设计模式(行为型)
设计模式是解决问题的方案,从大神的代码中学习对设计模式的使用,可以有效提升个人编码及设计代码的能力。本系列博文用于总结阅读过的框架源码(Spring 系列、Mybatis)及 JDK 源码中 所使用过的设计模式,并结合个人工作经验,重新理解设计模式。本篇博文主要看一下行为型的几个设计模式,即,策略模式、模板方法模式、迭代器模式、观察者模式 及 责任链模式。原创 2024-06-26 09:30:00 · 51 阅读 · 0 评论 -
从Spring及Mybatis框架源码中学习设计模式(结构型)
设计模式是解决问题的方案,从大神的代码中学习对设计模式的使用,可以有效提升个人编码及设计代码的能力。本系列博文用于总结阅读过的框架源码(Spring 系列、Mybatis)及 JDK 源码中 所使用过的设计模式,并结合个人工作经验,重新理解设计模式。本篇博文主要看一下结构型的几个设计模式,即,适配器模式、代理模式 及 装饰器模式。原创 2024-06-25 14:00:00 · 76 阅读 · 0 评论 -
从Spring及Mybatis框架源码中学习设计模式(创建型)
设计模式是解决问题的方案,从大神的代码中学习对设计模式的使用,可以有效提升个人编码及设计代码的能力。本系列博文用于总结阅读过的框架源码(Spring 系列、Mybatis)及 JDK 源码中 所使用过的设计模式,并结合个人工作经验,重新理解设计模式。本篇博文主要看一下创建型的几个设计模式,即,单例模式、各种工厂模式 及 建造者模式。原创 2024-06-25 09:30:00 · 181 阅读 · 0 评论 -
Java并发编程在各主流框架中的应用
Spring、Netty、Mybatis 等框架的代码中大量运用了 Java 多线程编程技巧。并发编程处理的恰当与否,将直接影响架构的性能。本章通过对 这些框架源码 的分析,结合并发编程的常用技巧,来讲解多线程编程在这些主流框架中的应用。原创 2024-06-24 10:55:13 · 679 阅读 · 0 评论 -
论一个程序员的自我修养
不允许任何魔法值(意义不明的变量 / 常量)直接出现在代码中。反例:在 long 或者 Long 赋值时,数值后使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解。说明:Long a = 2l;写的是数字的 21,还是 Long 型的 2?不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。正例:缓存相关常量放在类 CacheConsts 下;原创 2024-06-24 10:45:58 · 977 阅读 · 0 评论 -
RocketMQ 消息拉取流程
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-23 14:45:00 · 296 阅读 · 0 评论 -
RocketMQ broker 处理拉取消息请求流程
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-23 08:30:00 · 174 阅读 · 0 评论 -
RocketMQ 生产者启动流程
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-22 15:15:00 · 437 阅读 · 0 评论 -
RockerMQ Nameserver 如何与 Broker 进行通信的?
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-22 07:30:00 · 887 阅读 · 0 评论 -
RocketMQ MappedFile 内存映射文件详解
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-21 15:45:00 · 443 阅读 · 0 评论 -
RocketMQ IndexFile 详解
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-21 08:15:00 · 1321 阅读 · 0 评论 -
RocketMQ 消费者启动流程
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-20 13:30:00 · 643 阅读 · 0 评论 -
RocketMQ 消息消费流程
该文所涉及的 RocketMQ 源码版本为 4.9.3。拉取消息 成功之后 会调用 org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService#submitConsumeRequest 组装 消费消息 请求获取 consumeMessageBatchMaxSize,表示一个 ConsumeRequest 包含的消息 数量,默认为 1入参 msgs 为拉取消息的最大值,默认为 32如果 msgs 小于等于 consume原创 2024-06-19 14:00:00 · 876 阅读 · 0 评论 -
RocketMQ CommitLog 详解
该文所涉及的 RocketMQ 源码版本为 4.9.3。原创 2024-06-19 08:00:00 · 1112 阅读 · 0 评论 -
Nacos 服务注册
找到类两个流程将注解的属性读取,放入到 nacos 的全局属性配置中bean 注入。原创 2024-06-18 14:00:00 · 1831 阅读 · 0 评论 -
一个简单的 Servlet 容器代码设计
Servlet 算是 Java Web 开发请求链路调用栈中底层的一个技术,当客户端发起一个请求后,到达服务器内部,就会先进入 Servlet(这里不讨论更底层的链路),SpringMVC 的请求分发核心也是一个 Servlet,名叫,一个请求首先会进入到这个 Servlet,然后在通过 SpringMVC 的机制去分发到对应的 Controller 下。但是再往上一层说,普通的开发人员可能不会关心 Servlet 是怎么被调用的,我们只要写一个。原创 2024-06-18 08:00:00 · 1587 阅读 · 0 评论 -
Servlet原理分析
Servlet(Server Applet)是 J2EE 的内容之一,由 Java 编写的服务器端小程序。它是 web 请求的入口,主要功能在于交互式地(Request 和 Response)浏览和修改数据,生成动态 Web 内容。Servlet 运行于支持 Servlet 的 WEB 容器中,如 Tomcat。从实现上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议 的 Web 服务器。客户端发送请求至 WEB 服务器;原创 2024-06-17 15:52:50 · 775 阅读 · 0 评论 -
Spring Cloud OpenFeign 介绍
是一个声明式的 Web 服务客户端,它使 Java 编写 Web 服务客户端变得更加容易。其实就是通过 JDK 代理生成接口的代理对象,方法的执行就是执行 Http 请求。而 OpenFeign 的作用是通过自动装配将 Feign 集成到应用程序中。原创 2024-06-17 15:49:28 · 920 阅读 · 0 评论 -
Spring Cloud Gateway 介绍
GatewayControllerEndpoint 和 GatewayLegacyControllerEndpoint 是由注册的,默认是注册 GatewayControllerEndpoint ,可以设置属性变成让 GatewayLegacyControllerEndpoint 生效。原创 2024-06-13 15:30:00 · 1099 阅读 · 0 评论 -
Spring Cloud 介绍
SpringCloud 是在 SpringBoot 的基础上构建的。Spring Cloud 以两个库的形式提供了许多特性:Spring Cloud Context 和 Spring Cloud Commons。Spring Cloud Context 为 SpringCloud 应用程序的 ApplicationContext 提供扩展机制(引导上下文、加密、刷新属性和环境端点)。原创 2024-06-11 14:30:00 · 1529 阅读 · 0 评论