Netty架构剖析

1.Netty逻辑架构

Netty采用了典型的三层网络架构进行设计和开发。

在这里插入图片描述

  1. Reactor通信调度层
    1、它由一系列辅助类完成,包括Reactor线程NioEventLoop及其父类,NioSocketChannel/NioServerSocketChannel及其父类,Byteuffer及其由其衍生出来的各种Buffer,Unsafe及其其衍生出的各种内部类等。该层的主要职责就是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,将这些事件Pipeline管理的职责链来进行后续的处理。
  2. 职责链ChannelPipeline
    1、它负责事件在职责链中的有序传播,同时负责动态地编排职责链。职责链可以选择监听和处理自己关心的事件,它可以拦截处理和向后/向前传播事件。上层业务则只需要关心处理业务逻辑即可,不需要感知底层的协议差异和线程模型差异,实现了架构层面的分层隔离。
  3. 业务逻辑编排层
    1、业务逻辑编排层通常由2类:一类是纯粹的业务逻辑编排,还有一类是其他的应用层协议插件,用于特定协议相关的会话和链路管理。

2.关键架构质量属性

  1. 高性能:
    (1)采用异步非阻塞的IO类库,基于Reactor模式实现,解决了传统同步阻塞IO模式下一个服务端无法平滑地处理线性增长的客户端的问题。
    (2)TCP接收和发送缓冲区使用直接内存代替堆内存,避免了内存复制,提升了IO读取和写入的性能
    (3)支持通过内存池的方式循环利用ByteBuf,避免了频繁创建和销毁ByteBuf带来的性能消耗
    (4)可配置的IO线程数、TCP参数等,为不同的用户场景提供定制化的调优参数。
    (5)采用环形数组缓冲区实现无锁化并发编程,代替传统的线程安全容器或锁。
    首先对环形缓冲区做下说明:
    1. 环形缓冲区使用改进的数组版本,缓冲区容量为2的幂
    2. 缓冲区满阻塞生产者,消费者进行消费后,缓冲区又有可用资源,由消费者唤醒生产者
    3. 缓冲区空阻塞消费者,生产者进程生产后,缓冲区又有可用资源,由生产者唤醒消费者
      (6)合理地使用线程安全容器、原子类等,提升系统的并发处理能力。
      (7)关键资源的处理使用单线程串行化的方式,避免多线程并发访问带来的锁竞争和额外的CPU消耗
      (8)通过引用计数器及时地申请释放不再被引用的对象,细粒度的内存管理降低了GC的频率,减少了频繁GC带来的时延增大和CPU损耗。
  2. 可靠性:
    (1)链路有效性检测:心跳检测机制
    (2)内存保护机制:
    1、通过对象引用计数器对Netty的ByteBuf等内置对象进行细粒度的内存申请和释放,对非法的对象引用进行检测和保护
    2、通过内存池来重用ByteBuf,节省内存
    3、可设置的内存容量上限
    4、ByteBuf的解码保护,防止非法码流导致内存溢出
    (3)优雅停机
    1、指的是系统退出时,JVM通过注册的Shutdown Hook拦截到退出信号量,然后执行退出操作,释放相关模块的资源占有,将缓冲区的消息处理完成或者清空,将待刷新的数据持久化到磁盘或数据库中,等到资源回收和缓冲区消息处理完成之后,再退出。
    2、往往需要设置最大超时时间T,如果达到T后系统仍没有退出,则通过Kill -9 pid强杀进程。
  3. 可定制性
    (1)责任链模式,便于业务逻辑的拦截、定制和扩展。
    (2)基于接口的开发:关键的类库提供了接口或抽象类,如果Netty自身的实现无法满足用户的需求,可以由用户自定义实现相关接口。
    (3)提供了大量工厂类,通过重载这些工厂类可以按需创建出用户实现的对象。
    (4)提供了大量的系统参数供用户按需设置,增强系统的场景定制性。
  4. 可扩展性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值