mica-net 是基于 t-io 简化而来的高性能 Java 网络通信框架,使用 Java NIO 的 AsynchronousSocketChannel 实现异步非阻塞网络通信。
┌─────────────────────────────────────────────────────────────┐
│ Tio (API层) │
│ 提供所有对外API:send、close、bind、unbind等操作 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ ChannelContext (连接上下文) │
│ • 每个TCP连接对应一个ChannelContext │
│ • 维护连接状态、统计信息、绑定关系 │
│ • 包含3个核心Runnable:DecodeRunnable、HandlerRunnable、 │
│ SendRunnable │
└─────────────────────────────────────────────────────────────┘
↓
┌──────────────────┬──────────────────┬───────────────────────┐
│ DecodeRunnable │ HandlerRunnable │ SendRunnable │
│ (解码任务) │ (业务处理任务) │ (发送任务) │
└──────────────────┴──────────────────┴───────────────────────┘
[网络I/O] → [解码队列] → [处理队列] → [发送队列] → [网络I/O]
↓ ↓ ↓ ↓
ReadHandler DecodeRunnable HandlerRunnable SendRunnable
-
TioConfig: 全局配置管理(线程池、统计、心跳、SSL等)
-
ChannelContext: 连接上下文(状态、队列、统计、绑定关系)
-
ReadCompletionHandler: 异步读完成处理器
-
WriteCompletionHandler: 异步写完成处理器
-
DecodeRunnable: 解码任务(粘包/半包处理)
-
HandlerRunnable: 业务处理任务
-
SendRunnable: 发送任务(批量合并、SSL加密)
1. AsynchronousSocketChannel.read()
↓ [异步读取]
2. ReadCompletionHandler.completed()
├─ 统计接收字节数、更新时间戳
├─ SSL? → SSL解密
└─ 添加到解码队列
↓
3. DecodeRunnable.decode()
├─ 处理lastByteBuffer(上次剩余数据)
├─ 循环解码:TioHandler.decode()
├─ 检测慢包攻击(连续解码失败检测)
├─ 解码成功 → 放入HandlerRunnable
└─ 解码失败 → 保存lastByteBuffer等待更多数据
↓
4. HandlerRunnable.handler()
├─ 同步消息处理(synSeq机制)
├─ 业务处理:TioHandler.handler()
└─ 统计处理时长
1. Tio.send(channelContext, packet)
├─ 检查连接状态
├─ PacketConverter转换(可选)
├─ useQueueSend?
│ ├─ true → 添加到队列
│ └─ false → 直接发送
└─ 触发SendRunnable.execute()
↓
2. SendRunnable.runTask()
├─ 单包?→ 直接发送
└─ 多包?→ 批量合并发送
├─ 自适应批量大小(根据队列积压)
├─ 编码:TioHandler.encode()
├─ SSL? → SSL加密
├─ 合并多个ByteBuffer
└─ 调用sendByteBuffer()
↓
3. sendByteBuffer()
├─ 设置writing标记(防止WritePendingException)
└─ AsynchronousSocketChannel.write()
↓
4. WriteCompletionHandler.completed()
├─ hasRemaining? → 继续写入
├─ 统计发送字节数
├─ 回调:channelContext.processAfterSent()
└─ onWriteCompleted()
├─ 清除writing标记
└─ 触发下一批发送
- 客户端主动断开用 close(Tio.close),服务端主动断开用(Tio.remove)。
该项目基于 t-io(Apache License v2)简化而来,并且完全遵循 Apache License v2 协议。
- 使用 Java 8 作为最低编译版本
- 基于 t-io 3.8.1.v20220401-RELEASE 简化而来
- mica-net 2.0.0 开始调整了包名,从
org.tio迁移到net.dreamlu.mica.net避免跟原版 t-io 包冲突。 - 去除了一些使用不到的模块和代码,代码更精简
- 不强制依赖 fastjson,支持多种 JSON 工具(Jackson2、Jackson3、Fastjson、Fastjson2、Gson、Hutool-json、Snack3、Snack4)
- 添加 mica 中的 HexUtils、DigestUtils、ExceptionUtils 等工具类
- ChannelContext 采用二进制位标识状态位,减少内存占用,预留
isAccepted、isBizStatus给业务使用 - Packet 使用位域压缩技术,将 boolean 标志合并到 byte 中
- LongAdder 替换 AtomicInteger,提升统计性能
- 使用并发集合替换锁,降低锁竞争
- TioConfig 字段排序优化,减少内存 padding 提升缓存命中
- ChannelStat 按 JVM 对齐原则重排字段,引用类型集中放置
- Node 类调整字段顺序,每个对象节省 4 字节
- 无锁异步写入:移除 ReentrantLock,改用无锁异步写入逻辑
- scatter-write 零拷贝:优化异步写入为零拷贝批量发送,减少内存分配
- SSL 解密优化:使用 slice() 替代字节缓冲区复制,降低内存开销
- 自适应批量发送:动态调整批量发送大小,适应高负载场景
- 滑动窗口慢包检测:实现滑动窗口算法检测慢包攻击,降低检测开销
- 队列监控:心跳任务中增加解码/处理/发送队列大小统计
- UDP 重构:UDP 重构为 NIO UDP 形式,统一 TCP、UDP 编解码和处理
- TCP Proxy Protocol v1和v2:支持 nginx、ELB 转发原始 IP
- SSL 双向认证:支持客户端和服务端双向认证,客户端可跳过域名校验
- PKCS12 证书支持:SSL 支持 PKCS12 证书格式
- backlog 配置:服务端添加 backlog 配置项
- SSE(Server-Sent Events):支持 HTTP Server-Sent Events
- 时间轮心跳:服务端心跳改为时间轮,减少线程数
- 心跳超时策略:支持 HeartbeatTimeoutStrategy,支持发送 ping 或断开等待重连
- 虚拟线程支持:biz 线程池支持虚拟线程
- 模块化支持:添加
module-info.java,支持 Java Platform Module System - SSLEngineCustomizer:用于配置 TLS 协议版本和加密套件
- 简化 TioConfig:不继承
MapPropSupport,使用更简洁 - FileQueue:内置文件队列,支持 GraalVM
- NodeSelector:为客户端集群做准备
- JacksonJsonAdapter:调整默认配置,优化序列化/反序列化行为