2024年3月6日
最近在看 Spring AOP 部分的源码,所以对 JDK 动态代理具体是如何实现的这件事产生了很高的兴趣,而且能从源码上了解这个原理的话,也有助于对 spring-aop 模块的理解。话不多说,上代码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63……
阅读全文
2024年3月6日
理论性的文字,我觉得就没必要再扯一遍咯,大道理讲这么多,越听越迷糊。不如直接看源码加注释来的明白痛快。所以话不多说,直接上源码。 1 主要的接口 1.1 Advice 通知 本接口定义了切面的增强方式,如:前置增强 BeforeAdvice,后置增强 AfterAdvice,异常增强 ThrowsAdvice 等。下面看两个主要的子接……
阅读全文
2024年3月6日
Sentinel 中漏桶算法的实现 Sentinel 中漏桶算法通过 RateLimiterController 来实现,在漏桶算法中,会记录上一个请求的到达时间,如果新到达的请求与上一次到达的请求之间的时间差小于限流配置所规定的最小时间,新到达的请求将会排队等待规定的最小间隔到达,或是直接失败。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30……
阅读全文
2024年3月6日
获取时间窗口的主要流程 在 Sentinel 中,主要是通过 LeapArray 类来实现滑动时间窗口的实现和选择。在 sentinel 的这个获取时间窗口并为时间窗口添加指标的过程中,主要的流程为: 根据当前时间选择当前时间应该定位当前时间应该属于的时间窗口 id。 根据时间窗口 id 获取时间窗口。这里可能会存在四种情况: 时间窗口还未建立,那么……
阅读全文
2024年3月6日
LongAdder 的原理 在 LongAdder 中,底层通过多个数值进行累加来得到最后的结果。当多个线程对同一个 LongAdder 进行更新的时候,将会对这一些列的集合进行动态更新,以避免多线程之间的资源竞争。当需要得到 LongAdder 的具体的值的时候,将会将一系列的值进行求和作为最后的结果。 在高并发的竞争下进行类似指标数据的收集的时候,Long……
阅读全文
2024年3月6日
深挖 Redis 6.0 源码——SDS SDS(Simple Dynamic Strings, 简单动态字符串)是 Redis 的一种基本数据结构,主要是用于存储字符串和整数。 这篇文章里,我们就来探讨一下 Redis SDS 这种数据结构的底层实现原理。 学习之前,首先我们要明确,Redis 是一个使用 C 语言编写的键值对存储系统。 前置思考 我们首先考虑一个问题,如……
阅读全文
2024年3月6日
Redis Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。在这篇博客中,我们将介绍 Redis 的基本使用和常见操作。 1. 环境准备 首先,我们需要在本地安装 Redis。可以从官网下载对应版本的 Redis,这里我们使用的是 6.2.6 版本。下……
阅读全文
2024年3月6日
Netty 服务端创建源码分析 当我们直接使用 JDK 的 NIO 类库 开发基于 NIO 的异步服务端时,需要用到 多路复用器 Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey 等,相比于传统的 BIO 开发,NIO 的开发要复杂很多,开发出稳定、……
阅读全文
2024年3月6日
相对于服务端,Netty 客户端 的创建更加复杂,除了要考虑线程模型、异步连接、客户端连接超时等因素外,还需要对连接过程中的各种异常进行考虑。本章将对 Netty 客户端 创建的关键流程和源码进行分析,以期读者能够了解客户端创建的细节。 基于 Netty 创建客户端的流程分析 Netty 为了向使用者屏蔽 NIO 通信 的底层细节,……
阅读全文
2024年3月6日
TCP 粘包/拆包 熟悉 TCP 编程的都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑 TCP 底层 的 粘包/拆包机制。TCP 粘包/拆包问题,在功能测试时往往不会怎么出现,而一旦并发压力上来,或者发送大报文之后,就很容易出现 粘包 / 拆包问题。如果代码没有考虑,往往就会出现解码错位或……
阅读全文