随笔分类 -  Netty

摘要:设计模式在Netty 中的应用(回顾): 单例模式要点回顾: 在我们利用netty自带的容器来管理客户端链接的NIOSocketChannel的时候我们会利用public static final ChannelGroup group = new DefaultChannelGroup(Global 阅读全文
posted @ 2019-08-12 20:25 吴振照 阅读(1628) 评论(0) 推荐(0) 编辑
摘要:Netty 编码器原理和数据输出: Netty 默认提供了丰富的编解码框架供用户集成使用,我们只对较常用的Java 序列化编码器进行讲解。其它的编码器,实现方式大同小异。其实编码器和解码器比较类似, 编码器也是一个handler, 并且属于outbounfHandle, 就是将准备发出去的数据进行拦 阅读全文
posted @ 2019-08-12 20:13 吴振照 阅读(1030) 评论(0) 推荐(0) 编辑
摘要:什么是拆包/粘包: TCP 粘包/拆包: TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP 作为传输层协议并不了解上层业务数据的具体含义,它会根据TCP 缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被TCP 拆分成多个包进行发送,也有可能把多个小的 阅读全文
posted @ 2019-08-11 16:38 吴振照 阅读(1008) 评论(0) 推荐(0) 编辑
摘要:SocketChannel 读取ByteBuf 的过程: 我们首先看NioEventLoop 的processSelectedKey 方法: if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyO 阅读全文
posted @ 2019-08-07 14:29 吴振照 阅读(2013) 评论(0) 推荐(0) 编辑
摘要:内存池ByteBuf 内存回收: 在前面的章节中我们有提到, 堆外内存是不受JVM 垃圾回收机制控制的, 所以我们分配一块堆外内存进行ByteBuf 操作时, 使用完毕要对对象进行回收, 本节就以PooledUnsafeDirectByteBuf 为例讲解有关内存分配的相关逻辑。PooledUnsa 阅读全文
posted @ 2019-08-07 11:20 吴振照 阅读(2371) 评论(0) 推荐(0) 编辑
摘要:SubPage 级别的内存分配: 通过之前的学习我们知道, 如果我们分配一个缓冲区大小远小于page, 则直接在一个page 上进行分配则会造成内存浪费, 所以需要将page 继续进行切分成多个子块进行分配, 子块分配的个数根据你要分配的缓冲区大小而定, 比如只需要分配1KB 的内存, 就会将一个p 阅读全文
posted @ 2019-08-05 17:48 吴振照 阅读(1050) 评论(4) 推荐(0) 编辑
摘要:Page 级别的内存分配: 之前我们介绍过, netty 内存分配的单位是chunk, 一个chunk 的大小是16MB, 实际上每个chunk, 都以双向链表的形式保存在一个chunkList 中, 而多个chunkList, 同样也是双向链表进行关联的, 大概结构如下所示: 在chunkList 阅读全文
posted @ 2019-08-02 18:30 吴振照 阅读(1278) 评论(0) 推荐(0) 编辑
摘要:内存池的内存规格: 在前面的源码分析过程中,关于内存规格大小我们应该还有些印象。其实在Netty 内存池中主要设置了四种规格大小的内存:tiny 是指0-512Byte 之间的规格大小,small 是指512Byte-8KB 之间的规格大小,normal 是指8KB-16MB 之间的规格大小,hug 阅读全文
posted @ 2019-08-02 12:33 吴振照 阅读(2467) 评论(0) 推荐(0) 编辑
摘要:ByteBufAllocator 内存管理器: Netty 中内存分配有一个最顶层的抽象就是ByteBufAllocator,负责分配所有ByteBuf 类型的内存。功能其实不是很多,主要有以下几个重要的API: 到这里有些小伙伴可能会有疑问,以上API 中为什么没有前面提到的8 中类型的内存分配A 阅读全文
posted @ 2019-08-02 12:31 吴振照 阅读(3753) 评论(0) 推荐(1) 编辑
摘要:初识ByteBuf: ByteBuf 是Netty 整个结构里面最为底层的模块,主要负责把数据从底层IO 里面读到ByteBuf,然后传递给应用程序,应用程序处理完成之后再把数据封装成ByteBuf 写回到IO。所以,ByteBuf 是直接与底层打交道的一层抽象。这块内容,相对于Netty 其他模块 阅读全文
posted @ 2019-07-23 14:08 吴振照 阅读(1571) 评论(0) 推荐(0) 编辑
摘要:Pipeline 设计原理 Channel 与ChannelPipeline: 相信大家都已经知道,在Netty 中每个Channel 都有且仅有一个ChannelPipeline 与之对应,它们的组成关系如下: 通过上图我们可以看到, 一个Channel 包含了一个ChannelPipeline 阅读全文
posted @ 2019-07-21 16:17 吴振照 阅读(6491) 评论(0) 推荐(4) 编辑
摘要:EventLoopGroup 与Reactor: 前面的章节中我们已经知道了,一个Netty 程序启动时,至少要指定一个EventLoopGroup(如果使用到的是NIO,通常是指NioEventLoopGroup),那么,这个NioEventLoopGroup 在Netty 中到底扮演着什么角色呢 阅读全文
posted @ 2019-07-21 14:45 吴振照 阅读(2806) 评论(0) 推荐(0) 编辑
摘要:客户端BootStrap: Bootstrap 是Netty 提供的一个便利的工厂类, 我们可以通过它来完成Netty 的客户端或服务器端的Netty 初始化。下面我先来看一个例子, 从客户端和服务器端分别分析一下Netty 的程序是如何启动的。首先,让我们从客户端的代码片段开始: EventLoo 阅读全文
posted @ 2019-07-19 21:57 吴振照 阅读(1716) 评论(0) 推荐(1) 编辑
摘要:传统RPC 调用性能差的三宗罪 网络传输方式问题:传统的RPC 框架或者基于RMI 等方式的远程服务(过程)调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增大之后,同步阻塞IO 会由于频繁的wait 导致IO 线程经常性的阻塞,由于线程无法高效的工作,IO 处理能力自然下降。下面,我们通过B 阅读全文
posted @ 2019-07-17 18:43 吴振照 阅读(3657) 评论(0) 推荐(1) 编辑
摘要:下面的这张图,大概很多小伙伴都见到过,这是Dubbo 官网中的一张图描述了项目架构的演进过程。随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 单一应用架构 当网站流量很小时,只需一个应用,将所有 阅读全文
posted @ 2019-07-17 14:13 吴振照 阅读(761) 评论(0) 推荐(1) 编辑
摘要:Netty是什么: 异步事件驱动框架,用于快速开发高i性能服务端和客户端 封装了JDK底层BIO和NIO模型,提供高度可用的API 自带编码解码器解决拆包粘包问题,用户只用关心业务逻辑 精心设计的Reactor线程模型支持高并发海量连接 自带协议栈,无需用户关心 Netty 是一款提供异步的、事件驱 阅读全文
posted @ 2019-07-15 18:31 吴振照 阅读(1408) 评论(2) 推荐(1) 编辑
摘要:同步阻塞IO(BIO): 我们熟知的Socket编程就是BIO,每个请求对应一个线程去处理。一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线 阅读全文
posted @ 2019-07-05 09:56 吴振照 阅读(1207) 评论(0) 推荐(0) 编辑