Netty
文章平均质量分 89
Netty专栏!!!
程序员小潘
Java开发工程师,现居杭州,CSDN博客专家,热衷于分享计算机编程相关知识,欢迎关注~
展开
-
Netty对HTTP2流控的支持
流量控制是HTTP/2的一项重要功能,它允许发送方根据接收方的处理能力来控制数据的传输速率。通过合理的流控机制,可以确保服务器和客户端之间的通信不会出现拥塞或资源浪费。其中,流量控制窗口的实现较为简单,流优先级的控制则需要一套复杂的算法来支撑,好在Netty已经帮我们实现了。原创 2023-08-14 19:47:18 · 1476 阅读 · 0 评论 -
Netty对HTTP2多路复用的支持
在HTTP/1.1中,连接可以被复用,但是连接上的请求-响应是串行的,如果要同时处理多个请求-响应,不得不开启多个连接,带来的问题就是消耗大量的资源。HTTP/1.x时代,TCP连接远远没有被有效利用,于是HTTP2带来了多路复用的新特性。原创 2023-08-14 19:46:29 · 393 阅读 · 0 评论 -
Netty对HTTP2 Frame编解码
在HTTP/1.x时代,HTTP是一个文本协议,简单直接,人类友好的可读性,头部和主体通过换行符来区分,计算机处理起来低效且容易出错。HTTP2打破了这个传统,它不改变HTTP协议的语义,请求响应仍然有头部和主体,只是在数据传输上做了改变,由之前的文本改为二进制分帧传输。原创 2023-08-14 19:44:44 · 228 阅读 · 0 评论 -
Netty对HPACK头部压缩的支持
HTTP2终于支持对头部进行压缩传输了,Netty很早就支持HTTP2了,看下Netty对HPACK的实现源码,可以对HPACK理解的更深一下。原创 2023-08-14 19:43:48 · 169 阅读 · 0 评论 -
基于Netty实现RPC框架
笔者以前写过一篇文章《摊牌了,我要手写一个RPC》,当时实现的比较粗糙,底层基于JDK的阻塞IO进行通信。刚好最近在看Netty,于是想重构一下,用Netty来作为底层的RPC通信框架。1. 项目大纲项目取名「nrpc」,n取自Netty的首字母,项目结构如下:nrpc |--- common [公共模块] |--- example [使用示例] |--- rpc [RPC调用核心模块] |--- serialization [序列化模块]项目特点:基于Netty通信的RP原创 2021-06-18 15:08:59 · 330 阅读 · 1 评论 -
Netty实现HTTP服务器
Netty本身就支持了HTTP协议,内置的HttpServerCodec可以针对HTTP协议进行编解码,开箱即用,非常方便。使用Netty来来实现一个简单的HTTP服务是非常简单的。代码上传至Gitee:https://gitee.com/panchanghe/netty-project1. HttpServerHttp服务的启动类,它主要是创建ServerBootstrap引导,让Netty服务可以跑起来。public class HttpServer { private final i原创 2021-06-17 19:59:43 · 374 阅读 · 0 评论 -
Netty实现WebSocket聊天室
前面的文章主要以分析Netty源码为主,后面的文章以Netty实践为主。本篇文章会带大家使用Netty实现一个WebSocket聊天室。代码已上传至Gitee:https://gitee.com/panchanghe/netty-project。1. 前端代码因为是基于网页的聊天室,所以HTML等文件必不可少。笔者是后端开发,前端写的确实不怎么样,大家凑合看吧,主要是学习Netty的使用哈~index.html:<!DOCTYPE html><html lang="原创 2021-06-17 19:58:42 · 518 阅读 · 3 评论 -
EventLoop和EventLoopGroup
EventLoop和EventLoopGroup描述了Netty程序运行所使用的线程模型,通过修改EventLoopGroup,可以让Netty在不同的线程模型间快速切换,甚至可以在Nio和Bio间一键切换。1. EventLoopGroupEventLoopGroup直译过来叫「事件循环组」,它管理着一组EventLoop。EventLoopGroup实现了Iterable接口,可以通过迭代器遍历它管理的EventLoop。EventLoopGroup还继承了ScheduledExecu原创 2021-06-17 19:55:42 · 983 阅读 · 2 评论 -
ChannelPipeline:Netty的事件传播管道
Netty是一个异步的、高性能的、基于事件驱动的网络IO框架,它经过精心设计,不仅功能强大,还保持了良好的可扩展性,使用非常的灵活。Netty的主要功能就是处理网络IO事件,它使用了「拦截过滤器」设计模式,ChannelHandler被设计为用来处理事件,而ChannelPipeline则用来传播事件。通过类图可以发现,ChannelPipeline实现了ChannelInboundInvoker和ChannelOutboundInvoker,这代表它可以传播入站/出站事件。实现了Iterable原创 2021-06-17 19:54:21 · 329 阅读 · 0 评论 -
ByteBuf:Netty的数据容器
网络传输的基本单位总是字节,JDK使用ByteBuffer作为Nio网络编程的数据容器,但是这个类使用过于复杂,存在一些缺点,例如:它不支持扩容、读写模式切换需要经常调用flip(),导致开发者经常因为忘记调用而导致无法读取写入的数据。Netty使用ByteBuf来代替JDK的ByteBuffer,它有以下优点:支持扩容。分别维护读写索引,无需调用flip()。支持链式调用。支持引用技术、池化,对象和内存可以复用。CompositeByteBuf实现了透明的零拷贝。1. 工作模式原创 2021-06-17 19:52:52 · 260 阅读 · 0 评论 -
ServerBootstrapAcceptor:接收连接的核心
ServerBootstrapAcceptor是Netty服务端用来接收客户端连接的核心类,之前的文章在分析Netty服务端启动全流程的时候有提到过一嘴,今天这篇文章会详细分析一下。1. 何时被添加到Pipeline?服务端启动时,会调用ServerBootstrap.bind()绑定本地端口用来监听客户端的连接,这个方法会通过反射创建ServerSocketChannel并初始化,ServerBootstrap.init()会初始化ServerSocketChannel,将ServerBootst原创 2021-06-17 16:17:24 · 1001 阅读 · 1 评论 -
Netty是如何检测资源泄漏的?
为了减轻GC的压力、以及避免频繁向OS申请和释放内存,Netty基于JeMalloc思想自己实现了一套内存管理方案。不管是堆内存还是直接内存,都可以交给Netty来统一管理,这带来了两个好处,一是可以减轻GC的压力,二是可以避免向OS频繁申请和释放内存,Netty一次性申请一大块内存,然后按需分配。同时,也带来一个坏处,就是开发者使用完毕后,必须及时释放掉资源,否则会导致内存泄漏。综上所述,自己管理内存会带来更好的性能,但是也增大了内存泄漏的可能性。为了尽量避免内存泄漏,Netty提供了Resource原创 2021-06-16 17:31:18 · 738 阅读 · 0 评论 -
【Netty】对象重用的秘密:Recycler源码分析
Netty作为一个高性能的网络IO框架,在代码层面做了大量的优化,为了减轻GC的压力,尽可能的使对象可以被重用,避免频繁的创建和销毁。Recycler抽象类是Netty实现的,基于线程本地变量Stack实现的一个轻量级的对象重用池。调用get()方法时优先从对象池中获取可重用的对象,当池中没有对象可用时会自动触发newObject()创建新对象。io.netty.util.internal.ObjectPool.Handle.recycle()方法可以帮助对象进行回收,默认的实现类是DefaultH原创 2021-06-15 20:06:42 · 454 阅读 · 0 评论 -
【Netty】TCP粘包/拆包解决方案
TCP作为传输层(4层)协议,并不知道你的应用层(7层)数据报文的含义,因此使用TCP传输数据时,可能会出现「粘包/拆包」,需要引用层通过特定的协议去解决。1. 什么是TCP粘包/拆包?「粘包/拆包」在Socket编程中经常会出现,使用TCP协议传输数据时,如果对端连续发送多个小的数据包,TCP会将这些小的数据包打包,合并成一个TCP报文发送出去,这就是「粘包」。如果对端发送一个超大的数据包,TCP会根据缓冲区的情况,将这个超大数据包拆分成多个小的TCP报文发送出去,这就是「拆包」。拿HTTP服.原创 2021-06-11 22:21:34 · 1276 阅读 · 2 评论 -
FastThreadLocal源码分析
前面在分析NioEventLoop源码时提到过,Netty默认使用io.netty.util.concurrent.DefaultThreadFactory线程工厂来创建新线程,它会创建FastThreadLocalThread线程来驱动NioEventLoop的执行,而不是JDK原生的Thread,原因是FastThreadLocalThread可以提升FastThreadLocal的性能。既然JDK已经提供了ThreadLocal,为何Netty还要重复造轮子呢?原因无它,就是因为JDK的Thre原创 2021-06-08 20:27:54 · 388 阅读 · 2 评论 -
Java网络IO演变史
前置知识操作系统的几个概念1.用户态和内核态Linux操作系统的体系架构分为用户态和内核态,内核本质上是一个特殊的软件程序,它控制着计算机的硬件资源,例如协调CPU资源、分配内存资源,并为上层应用程序提供稳定的运行环境。用户态即为上层应用程序,它的运行依赖于内核。为了使用户程序也能够访问到内核管理的资源,所以内核必须提供通用的访问接口,这些接口被称为「系统调用」。2.系统调用和软中断系统调用是操作系统提供给应用程序访问的一组通用接口,它使得运行在用户态的进程可以访问内核管理的资源,例如新线程原创 2021-06-07 20:22:44 · 238 阅读 · 3 评论 -
无锁队列MpscQueue源码分析
前言之前的文章在分析NioEventLoop源码的时候,有提到过Netty没有用JDK提供的阻塞队列,而是使用了高性能无锁队列MpscQueue。因为篇幅原因,那篇文章并没有详细介绍MpscQueue,今天,它来啦!!!在Netty较早的版本中,使用的是自己实现的任务队列,后来全部替换为JCTools工具的无锁化队列了,为啥呢?没别的,因为它的效率实在是太高了。何为Mpsc???JCTools提供了很多队列,大家需要针对不同的应用场景选择合适的队列,避免发生潜在的问题。这里解释一下「MSP原创 2021-06-04 08:55:37 · 2168 阅读 · 2 评论 -
【Netty】ChannelOutboundBuffer源码分析
上一篇文章对RecvByteBufAllocator的源码进行了分析,介绍了Netty是如何接收对端发送过来的数据。以及Netty是如何通过AdaptiveRecvByteBufAllocator来自适应调整ByteBuf的动态分配,解决Java ByteBuffer分配过大浪费内存,分配过小又需要频繁扩容的问题。本篇文章会分析,Netty是如何将数据发送出去的。前置知识Netty支持的数据传输类型首先你需要知道,通过Netty来发送数据,它只支持两种数据类型:ByteBuf和FileReg原创 2021-06-02 23:23:18 · 494 阅读 · 2 评论 -
【Netty】RecvByteBufAllocator源码分析
前言前面写过《Netty服务端启动全流程源码分析》,BossGroup获取到客户端连接SocketChannel后会将其注册到WorkerGroup,由WorkerGroup来驱动数据IO读写。WorkerGroup的EventLoop监听到Channel有OP_READ事件时,会调用Channel.Unsafe.read()方法,Netty会将读取到的数据包装成ByteBuf,然后触发回调pipeline.fireChannelRead(byteBuf)将事件传播出去。整体流程是清楚了,但是对于详原创 2021-05-31 16:46:58 · 510 阅读 · 0 评论 -
Netty服务端启动全流程源码分析
想要阅读Netty源码的同学,建议从GitHub上把源码拉下来,方便写注释、Debug调试哦~点我去下载!先来看一个简单的Echo服务端程序,监听本地的9999端口,有客户端接入时控制台输出一句话,接收到客户端的数据后直接原样写回。public class EchoServer { // 绑定的端口 private final int port; public EchoServer(int port) { this.port = port; } public static void m原创 2021-05-29 15:34:56 · 282 阅读 · 3 评论 -
Netty简单入门
笔者最近在看Netty相关的东西,想把过程中所学到的和感悟记录下来,于是决定单独开一个专栏,专门记录Netty相关的文章。第一篇就从「简单入门」开始吧!!!Netty简介Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。提取句子主干,首先,Netty是一个网络应用程序框架,也可以理解为网络IO框架。利用Netty,开发者可以快速开发出一个高性能、高可靠的原创 2021-05-28 19:44:35 · 683 阅读 · 1 评论