Hyperion: 一个支持自定义编解码器的TCP通信框架
特性
- 支持自定义编解码器
- 高效的ByteBuffer实现,降低请求处理过程中数据拷贝
- 自带连接池支持,支持连接重建、连接空闲超时
- 易于扩展,可以积木式添加IoFilter处理入栈、出栈消息
组件
- hyperion.buffer: 支持扩容的ByteBuffer实现
- hyperion.logadapter:支持打印异常堆栈的日志实现,可以适配第三方日志系统
- hyperion.objectpool:对象池实现
- hyperion.threadpool:线程池实现
- hyperion.transport:支持自定义编解码器的TCP通信框架
Redis仓颉语言客户端SDK: redis-sdk 项目使用了该TCP框架,并实现了RESP2、RESP3协议的编解码。
ActiveMQ仓颉语言客户端SDK:acitvemq4cj项目使用了该TCP框架。
1. 编译和测试
工程目录结构
|---samples 使用Hyperion TCP框架的示例目录
|---src Hyperion TCP框架的源码目录
|---module.json
|---README.md
1.1 编译步骤
清理工程,在工程根目录下运行:
$> cjpm clean
编译工程,在工程根目录下运行:
$> cjpm build
编译的静态库位于:
build/release/hyperion/hyperion.buffer.cjo
build/release/hyperion/hyperion.logadapter.cjo
build/release/hyperion/hyperion.objectpool.cjo
build/release/hyperion/hyperion.threadpool.cjo
build/release/hyperion/hyperion.transport.cjo
1.2 单元测试
在工程根目录下运行:
$> cjpm test
1.3 运行示例程序
编译服务端示例程序,在samples/echo_server目录下运行:
$> cjpm build
启动服务端,在samples/echo_server目录下运行:
$>./build/release/bin/main
编译客户端示例程序,在samples/echo_client目录下运行:
$> cjpm build
启动服务端,在samples/echo_client目录下运行:
$>./build/release/bin/main
2. 架构
2.1 Hyperion TCP框架的架构
Hyperion TCP框架的架构图如下:
MessageCompletedHandler接口
用于判断消息的报文是否读取完整,提供如下方法:
func messageCompleted(buffer: ByteBuffer, status: MessageCompletedStatus): Unit
Session接口
单向会话接口,可以向对端发送消息
IoSession接口
双向会话接口,可以从对端收取消息,也可以向对端发送消息
IoFilter接口
对TCP框架客户端或者服务端的入栈消息、出栈消息进行加工,提供如下方法:
func inboundMessage(context: IoFilterContext, session: Session, inMessages: ArrayList): Unit
func outboundMessage(context: IoFilterContext, session: Session, outMessages: ArrayList): Unit
SingularMessageIoFilter类
只处理单个入栈消息和单个出栈消息的IoFilter实现
IoFilterChain类
由IoFilter串联而成的链表
Connection接口
TCP框架客户端和服务端之间建立的连接
ConnectionInitializer接口
用于客户端和服务端初始化TCP连接,提供如下方法:
func initialize(session: Session): Unit
EventLoopHandler类
TCP框架客户端或者服务端的事件处理器,循环处理入栈消息,并按需要将消息出栈