源码分析-Netty: 架构剖析

2021-03-23 11:40:41 浏览数 (1)

系列文章:

源码分析 -Netty:开篇

源码分析 -Netty:多线程在 Netty 中的应用

源码分析-Netty: 并发编程的实践(二)

一 概述

前面描述了Netty的架构图、特性、基本版本信息和并发编程实践等,本篇将详细剖析Netty的逻辑架构,自顶向下梳理Netty的设计思想和主体实现方式,并据此对Netty框架有一个整体的把握。

二 逻辑架构

Netty的逻辑架构图如下所示:

图1 逻辑架构图

可见Netty采用了三层网络结构的架构设计进行设计和开发。Reactor、PipeLine 和 Service三层组成了Netty的逻辑架构。

三 通信调度-Reactor

前面我们介绍过Reactor线程模型。事实上,Netty中的Reactor由多个辅助类组成,包括Reactor线程NioEventLoop及其父类,NioSocketChannel及其父类、ByteBuffer及其衍生的多个Buffer、Unsafe以及它们衍生出的各种内部类等等。

作为三层结构中的最底层,Reactor层主要负责监听网络的读写和链接操作,负责将网络层的数据读取到内存缓冲区中,然后触发网络事件,如连接创建、连接激活、读/写事件等,这些事件会被触发到PipeLine中,由PipeLine管理的责任链来进行后续处理。

四 责任链-ChannelPipeline

责任链(Netty权威指南 第2版中称为职责链),负责事件在责任链中的有序传播,同时也负责责任链的动态编排。如果你对设计模式足够熟悉,那么应该知道有一个叫做责任链的设计模式,可以简单理解为这一层就是责任链模式的一个实现。

责任链可以选择监听和处理关心的事件,可以拦截处理和向后or向前传播时间(类似filter)。不同应用的Handler节点的功能也有所不同。

通常情况下,我们需要开发编解码Handler用于处理接收到消息的编解码,用于把外部传来的协议消息转换成内部的数据结构(POJO对象)。通过这样的处理,上层业务只需要关心核心业务逻辑即可,不必再感知底层的协议差异和线程模型差异,实现了架构层面的分层隔离。

五 业务逻辑层-Service ChannelHandler

业务逻辑层也可以分为两大部分:应用层协议插件, 以及纯粹的业务逻辑编排。应用协议插件用于特定协议相关会话和链路管理,例如图1 逻辑架构图中所包含的FTP、HTTP和CMPP三种协议插件,其中CMPP就是用于管理和中国移动短信系统对接的协议插件。

在这一层,作为业务开发人员,我们只需要关心责任链的拦截和业务Handler的编排。因为应用层协议栈通常是只需要开发一次,后续可以直接使用。这样把开发人员的职责聚焦到服务层的业务逻辑开发上,可以更高效,并且逻辑清晰。这样的设计实现了NIO框架各层之间的解耦,便于上层业务协议栈的开发和业务逻辑的定制。

六 总结

本篇介绍了Netty的逻辑架构。看似内容不多,但深入分析,可以发现『简单』的基础之上蕴含了很多我们曾经学习过的架构设计原则,例如分层架构、Reactor模型、责任链设计模式、事件模型等等。正是由于有这些非常合理的设计,才有基于Netty的各种应用服务器和协议栈开发的快速发展。

0 人点赞