随笔分类 -  netty

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