背景
- 高性能
- 可靠性
- 可定制性
- 可扩展性
- 易用性
- 安全性
过程
- Netty的高性能体现在哪儿?
- Reactior模式的使用
- 直接内存
- 池化内存
- 环形数组缓冲区。实现无锁化的并发编程,比如使用轻量级的ThreadLocal,使用轻量级的同步关键字volatile。比如使用Atomic系列类。比如使用CountDownLatch, CyclicBarrerier。比如使用线程安全容器。LinkedBlockingQueue。
- 引用计数器及时申请释放不再引用的对象。
- 关键资源的处理使用单线程串行化方式,避免多线程并发访问带来的锁竞争和额外的CPU资源消耗问题。
- Netty是如何做到可靠性?
- 链路有效性检测
- 内存保护机制
- 优雅停机(如何理解优雅停机?释放资源,处理未完成的任务,完成数据的持久化),不然后因为系统退出,任务还没有执行完成。资源还占用着。
- 可定制性
- 责任链模式的设计,便于定制业务逻辑。
- 基于接口的开发:开发者自定义实现相关接口。
- 提供了大量工厂类,通过重载这些工厂类可以按需创建出用户实现的对象。
- 提供了大量的系统参数供用户按需设置,增强系统的场景定制性。
- 可扩展性
- 基于Netty的二进制类库即可实现协议的扩展和定制。
- 基于Netty的HTTP协议
- Dubbo协议
- RocketMQ内部私有协议
- 易用性
- Netty屏蔽底层JDK的NIO繁琐的细节。
- 使用Reactor理论,提供高层接口,使开发者使用起来十分简单。
- 切换I/O模型也十分方便。Oio, Nio。
- 不同平台切换也十分方便,比如Linux操作系统。
- 安全性
- 提供黑白名单。
- 支持IP过滤。
- 支持SSL(SslHandler)。
小结
- 模仿Netty在设计的时候考虑到的点。
- 环形数组缓冲区:由两个指针,一个指向可读的头(当头被读了后,把数据清除掉,并移动头指针)。一个指向可写的尾,当写了一个数据后,再移动尾指针)。这样做的话,是可以避免内存的浪费的。循环使用内存空间,不浪费。
- 如何才能实现无锁化的并发编程?比如使用轻量级的ThreadLocal,使用轻量级的同步关键字volatile。比如使用Atomic系列类。比如使用CountDownLatch, CyclicBarrerier。比如使用线程安全容器。LinkedBlockingQueue。