Alligator 系列:Protocol Buffer
1. 概述
在系统中,Protocol Buffer 的使用有两种方式:1)定义 .proto 文件,生成相应的 Bean 对象及序列化的代码;2)根据现有的 Java Bean 对象,动态生成对应的 schema, 使用工具类完成对象的序列化。这两种方式的优缺点也比较明显,.proto 文件支持向前、向后兼容,后者使用简单,引用工具类,便可支持序列化操作,缺点是存在代码兼容性问题。
在系统中,Protocol Buffer 的使用有两种方式:1)定义 .proto 文件,生成相应的 Bean 对象及序列化的代码;2)根据现有的 Java Bean 对象,动态生成对应的 schema, 使用工具类完成对象的序列化。这两种方式的优缺点也比较明显,.proto 文件支持向前、向后兼容,后者使用简单,引用工具类,便可支持序列化操作,缺点是存在代码兼容性问题。
在 Alligator 系统中,网关与业务系统之间是通过 MQ
进行通信。为了简化开发成本,基于 MQ, 实现了一套 RPC
调用,其封装了超时、同步调用及异步调用等功能,调用模型如下图所示: 
RocketMQ 是阿里推出的一款消息系统,用来取代 Kafka 及 RabbitMQ. 在
Alligator 中支持使用 RocketMQ, 其概念模型如下所示: 
RabbitMQ 是一种消息系统,相比较其它消息系统,除了 queue,它多了一个
exchange 交换器的概念,在 Alligator 中支持使用 RabbitMQ,
其整体结构如下图所示: 
在操作系统中内存管理的基本单位是 page, page 大小一般是
4k。为了满足不同场景,分配不同大小的内存,操作系统提供了丰富的内存管理方法。从分层的角度来说,可以用下面的层次图来表示。

EventLoop 是 Reactor 模式中的执行者,首先它持有 Selector 对象,监听多路 SocketChannel 的网络 I/O 事件,并对 I/O 事件分发处理。同时,它持有一个 Thread 对象,除了监听网络 I/O 事件, EventLoop 也可以执行提交的任务,包括定时任务,总结来说,EventLoop 具有如下三大功能:
ChannelPipeline 可以理解为一个 ChannelHandler 列表,而 ChannelHandler 是一个能够独立处理 channel 入站 (inbound) 事件或出站 (outbound) 操作的处理器。ChannelPipeline 实现了 "Intercepting Filter" 模式,它给用户提供了事件处理及 ChannelHandler 之间交互的能力,用户可以根据业务场景定义 ChannelHandler,以类似插件的方式添加到 ChannelPipeline 中。
因 Netty 中大量使用异步的调用方式,启动流程中的代码在不同的线程中执行,给分析其启动的顺序带来了一定的麻烦。这篇文章主要是对 ServerBootstrap 服务器启动流程做一个整体性的讲述,分析了每一个步骤所承担的工作,以及前后步骤的触发关系,即前一个步骤怎么调用后一个步骤,仍然以服务器启动的代码为例,分析其流程。
Reactor
模式是一种服务器网络编程模式,它根据网络数据接收的特点,将连接的建立、网络数据的读写分离,用
mainReactor 线程处理网络的连接,用 subReactor
处理数据的读写,同时为了有效利用 CPU 多核的优势,subActor
可以有多个。它的整体结构如下图所示: 
特点:
Netty 中所有的的 I/O 操作都是异步的。I/O 操作是比较耗时的,为了不阻塞调用线程,Netty 提供了 ChannelFuture 接口,使用 addListener()方法注册一个 ChannelFutureListener 监听器,可以在 I/O 操作结束之后进行通知返回结果。在下面的代码中,bind 操作返回一个 ChannelFuture 对象,可以继续执行后续操作,也可以调用 sync() 方法同步等待执行结果,给程序开发带来了更多的开发模式,结合不同的业务场景,可以方便选择异步还是同步模式。