1、Netty源码编译
我们看一下版本4.1.40.Final-SNAPSHOT源码包,可以把源码pull到本地,用IDEA打开。
github地址:https://github.com/netty/netty
包含的模块如下图:
2、Netty 源码核心包
2.1 Netty源码核心包主要分成下面几块:
1、工具类
下图红色的模块,如buffer、common、resolver
2、底层协议(transport)
下图黄色的模块,TCP的不同实现(linux(epoll)、Mac(kqueue),unix)
3、人性化协议
下图蓝色模块,包括编解码codec、还有handler(这是Netty好用的原因)
2.2 源码的基本组件
学习看源码前,我们需要了解一下源码包含的基本机构,下面是源码中常见的组件:
- 1)Bootstrap/ServerBootstrap:Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类。;
- 2)Channel:通道,代表一个连接,不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应。
下面是一些常用的 Channel 类型:
NioSocketChannel,异步的客户端 TCP Socket 连接。
NioServerSocketChannel,异步的服务器端 TCP Socket 连接。
NioDatagramChannel,异步的 UDP 连接。
NioSctpChannel,异步的客户端 Sctp 连接。
NioSctpServerChannel,异步的 Sctp 服务器端连接,这些通道涵盖了 UDP 和 TCP 网络 IO 以及文件 IO。
- 3)ChannelPipeline:责任链,持有handler的责任链,负责handler的添加和删除
- 4)ChannelHandlerContext: 责任链上下文信息,是责任链的一个节点,持有一个handler
- 5)handler:用于处理出入站消息及相应的事件,实现我们自己要的业务逻辑;
- 6)NioEventLoop:处理任务的线程,NioEventLoop 中维护了一个线程和任务队列,支持异步提交执行任务
- 7)NioEventLoopGroup:EventLoop线程池
- 8)ChannelInitializer:Channel初始化
- 9)Future/ChannelFuture : 异步I/O无法立即获得结果,这里是指操作的执行结果,通过事件机制,获取执行结果,通过添加监听器,执行我们想要的操作;
- 10)ByteBuf :用来操作缓冲区的字节数组
下面我们开始看源码了,我们先看一下Netty对IO模式支持的源码,其他的源码解析我后续会给出来
3、Netty对三种IO模式的支持
我们看到对三种IO模式的支持,相关的类都加了不同的前缀Oio,Nio,Aio。现在其他IO模式都已弃用,只有支持NIO了。
3.1 我们看一下Channel如何实现的
进入ServeBootstrap设置Channel的方法,他的参数是一个class类型
3.1.1 ServeBootstrap.channel方法
这个方法里面通过new ReflectiveChannelFactory来获取Channel的一个反射工厂,参数为ChannelClass,进入ReflectiveChannelFactory
3.1.2 ReflectiveChannelFactory
ReflectiveChannelFactory构造方法通过获取获取Channel构造器,并将该构造器作为他的属性,该方法参数是class,根据入参决定是哪种类型构造器(NioServerSocketChannel或者OiOServerSocketChannel)。
下面的newChannel方法是通过构造器来获取Channel,那么需要channel的地方就可以通过这个Facotry的newChannel方法获取channel。
在Bootstrap初始化的阶段,Channel被构造出来
4 总结
Netty通过channel的反射工厂获取channel的构造器,channel类型通过参数传递(这里实现对不同类型IO的支持),channel通过反射工厂在需要的时候构造出来(这里是一个优化)。
我们可以看到Netty的代码确实做了很多优化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。