随笔分类 - netty
摘要:单例模式 单例模式是最常见的设计模式,它可以保证全局只有一个实例,避免线程安全问题。单例模式有很多种实现方法,其中我比较推荐三种最佳实践:双重检验锁、静态内部类方式、饿汉方式和枚举方式,其中双重检验锁和静态内部类方式属于懒汉式单例,饿汉方式和枚举方式属于饿汉式单例。 双重检验锁 在多线程环境下,为了
阅读全文
摘要:框架总结 Netty 服务端启动 Netty 提供了 ServerBootstrap 引导类作为程序启动入口,ServerBootstrap 将 Netty 核心组件像搭积木一样组装在一起,服务端启动过程我们需要完成以下三个基本步骤: 配置线程池。Netty 是采用 Reactor 模型进行开发的,
阅读全文
摘要:服务发现与负载均衡机制的实现 注册中心选型 服务消费者在发起 RPC 调用之前,需要知道服务提供者有哪些节点是可用的,而且服务提供者节点会存在上线和下线的情况。所以服务消费者需要感知服务提供者的节点列表的动态变化,在 RPC 框架中一般采用注册中心来实现服务的注册和发现。 目前主流的注册中心有 Zo
阅读全文
摘要:项目结构 rpc-provider,服务提供者。负责发布 RPC 服务,接收和处理 RPC 请求。 rpc-consumer,服务消费者。使用动态代理发起 RPC 远程调用,帮助使用者来屏蔽底层网络通信的细节。 rpc-registry,注册中心模块。提供服务注册、服务发现、负载均衡的基本功能。 r
阅读全文
摘要:RPC 框架架构设计 github地址:https://github.com/xiaojiesir/mini-rpc RPC 又称远程过程调用(Remote Procedure Call),用于解决分布式系统中服务之间的调用问题。通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。下面我们通过
阅读全文
摘要:JDK 原生并发队列 JDK 并发队列按照实现方式可以分为阻塞队列和非阻塞队列两种类型,阻塞队列是基于锁实现的,非阻塞队列是基于 CAS 操作实现的。JDK 中包含多种阻塞和非阻塞的队列实现,如下图所示。 队列是一种 FIFO(先进先出)的数据结构,JDK 中定义了 java.util.Queue
阅读全文
摘要:定时器的基础知识 定时器一般有三种表现形式:按固定周期定时执行、延迟一定时间后执行、指定某个时刻执行。 定时器的本质是设计一种数据结构,能够存储和调度任务集合,而且 deadline 越近的任务拥有更高的优先级。那么定时器如何知道一个任务是否到期了呢?定时器需要通过轮询的方式来实现,每隔一个时间片去
阅读全文
摘要:传统 Linux 中的零拷贝技术 在介绍 Netty 零拷贝特性之前,我们有必要学习下传统 Linux 中零拷贝的工作原理。所谓零拷贝,就是在数据操作时,不需要将数据从一个内存位置拷贝到另外一个内存位置,这样可以减少一次内存拷贝的损耗,从而节省了 CPU 时钟周期和内存带宽。 我们模拟一个场景,从文
阅读全文
摘要:Netty的Unsafe接口 这个Unsafe不是JDK原生的Unsafe,主要就是一些直接跟IO底层直接相关的通用操作: interface Unsafe { // 接受数据的时候用于分配字节缓冲区的处理器 RecvByteBufAllocator.Handle recvBufAllocHandl
阅读全文
摘要:ChannelFuture 吧自定义的处理器修改下。 class EchoServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx,
阅读全文
摘要:WebSocket编解码器 客户端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script type="text/javascript">
阅读全文
摘要:POST消息体传输方式 直接发送消息体 最长见的就是直接在POST请求头里设置了Content-Length属性,也就是所谓的定长,只要接收端根据这个去读定长的字节就行,这个方便是方便,但是如果一个比较大的数据,可能要消耗比较大的内存。 块传输 还有一种是Transfer-Encoding: chu
阅读全文
摘要:编解码器 编解码技术这是实现网络通信的基础,让我们可以定义任何满足业务需求的应用层协议。在网络编程中,我们经常会使用各种网络传输协议,其中 TCP 是最常用的协议。我们首先需要了解的是 TCP 最基本的拆包/粘包问题以及常用的解决方案,才能更好地理解 Netty 的编解码框架。 出现拆包/粘包的原因
阅读全文
摘要:Selector 之前说过 SingleThreadEventExecutor.this.run(); 方法,里面有段代码 strategy = selectStrategy.calculateStrategy(selectNowSupplier, hasTasks()); 现在详细说明下此方法 @
阅读全文
摘要:Recycler 讲回收器之前,先说下对象池,即之前提过的ObjectPool。 public abstract class ObjectPool<T> { //通过对象创建接口和处理器关联,以便于创建的的对象内部可以调用处理器的方法,用来回收对象。 ObjectPool() { } /** * G
阅读全文
摘要:PoolThreadLocalCache PooledByteBufAllocator 持有 PoolThreadLocalCache 对象,PoolThreadLocalCache 继承 FastThreadLocal<PoolThreadCache>,属于本地线程缓存变量。因此每个线程拥有属于自
阅读全文
摘要:池化内存分配三 FastThreadLocal 在前面几篇源码解析的课程中,我们都有在源码中发现 FastThreadLocal 的身影。顾名思义,Netty 作为高性能的网络通信框架,FastThreadLocal 是比 JDK 自身的 ThreadLocal 性能更高的通信框架。FastThre
阅读全文
摘要:池化内存分配二 PoolChunk poolChunk表示的内存池中一整块的内存(默认16M),也是内存池向java虚拟机申请和释放的最小单位,即内存池每次会向虚拟机申请一个PoolChunk内存来进行分配,并在PoolChunk空闲时将PoolChunk中的内存释放。 内存池对于内存的分配其最终分
阅读全文
摘要:池化内存分配一 Netty 默认提供了池化对象的内存分配,使用完后归还到内存池,所以一套高性能的内存管理机制是 Netty 必不可少的。在上节课中我们介绍了原生 jemalloc 的基本原理,而 Netty 高性能的内存管理也是借鉴 jemalloc 实现的,它同样需要解决两个经典的核心问题: 在单
阅读全文
摘要:jemalloc内存分配算法 jemalloc内存分配算法简介 jemalloc 是由 Jason Evans 在 FreeBSD 项目中引入的新一代内存分配器。它是一个通用的 malloc 实现,侧重于减少内存碎片和提升高并发场景下内存的分配效率,其目标是能够替代 malloc。jemalloc
阅读全文

浙公网安备 33010602011771号