1

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的代码确实做了很多优化。

5 参考:

https://segmentfault.com/a/1190000038211285

http://www.52im.net/thread-2043-1-1.html


杜若
70 声望3 粉丝