参加的阿里中间件性能挑战赛用到了Netty,就决定利用这个机会,读一读Netty的源码。首先,我认为阅读源码大致有2个主要目的,1.了解Netty的内部机制,更好的使用Netty;2.学习Netty的实现,比如池化的ByteBuf、以及EventLoop的责任链模式,我认为都有很多值得借鉴,可以用在工作中的技巧和思想;3.可以看一看比较复杂的框架代码的组织结构、代码风格,并做一些思考🤔。
阅读源码之前,首先要有一个大局观,就是Netty解决了什么问题,有什么优点,主要有哪些模块组成?
另外,我认为带着问题去阅读,才能够带来更多的收获。所以,我想在这次阅读源码的过程中,能够回答以下这些问题:
1. Netty有哪些主要组成部分?
Channel、ChannelPipeline、ChannelHandler、Eventloop、ChannelFuture、Bootstrap等。
2. Netty如何对Java NIO进行的封装?
Netty的Channel借助门面模式,(1)封装了和网络相关的操作,提供了统一的视图(对于ServerSocketChannel和SocketChannel),其底层IO操作是由UnSafe接口实现的,而Channel的骨骼类AbstractChannel只是调用了ChannelPipeline的相应方法让事件在责任链上传递依次处理,ChannelPipeline上的HeadContext调用UnSafe的方法执行实际的IO操作;(2)封装了对Channel接口的配置参数操作(3)维护了Channel的状态(readable,writable,open,active等)(4)Channel接口还聚合了ChannelPipeline接口,而ChannelPipeline用于处理所有的IO事件。
3. Netty如何利用无锁化做到的高性能?
4. netty如何监控内存泄漏?
5. netty如何实现的buffer池?
6. netty在代码设计方面值得学习的地方?
最后,给出一些我初次阅读较大项目源码的一些思考:
1. 先了解整体框架,再去找感兴趣的部分去读;
2.带着问题去读;
3.阅读Netty源码是一个学习并发编程,网络编程极好的方式。
Netty中的设计模式:
观察者模式:Future,Listener
责任链模式:ChannelPipeline
门面模式:Channel统一封装了网络操作。
适配器模式:ChannelInboundHandlerAdapter
装饰器模式:SimpleLeakAwareByteBuf
io.netty.util.concurrent.SingleThreadEventExecutor#wakeup 什么作用?
Netty中的死锁问题?
网友评论