SOFABolt 用户手册
蚂蚁通信框架实践
SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。
为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。
为了让中间件开发者能将更多的精力放在产品功能特性实现上,而不是重复地一遍遍制造通信框架的轮子,SOFABolt 应运而生。
SOFABolt的基础功能:
- 基础通信功能 ( remoting-core )
基于 Netty 高效的网络 IO 与线程模型运用
连接管理 (无锁建连,定时断链,自动重连)
基础通信模型 ( oneway,sync,future,callback )
超时控制
批量解包与批量提交处理器
心跳与 IDLE 事件处理 - 协议框架 ( protocol-skeleton )
命令与命令处理器
编解码处理器
心跳触发器 - 私有协议定制实现 - RPC 通信协议 ( protocol-implementation )
RPC 通信协议的设计
灵活的反序列化时机控制
请求处理超时 FailFast 机制
用户请求处理器 ( UserProcessor )
双工通信
基础功能实现
1.1 实现用户请求处理器 (UserProcessor)
我们提供了两种用户请求处理器,同步请求处理器(SyncUserProcessor) 与 异步请求处理器(AsyncUserProcessor)。 二者的区别在于,前者需要在当前处理线程以return返回值的形式返回处理结果;而后者,有一个== AsyncContext 存根==,可以在当前线程,也可以在异步线程,调用 sendResponse 方法返回处理结果。
1.2 实现连接事件处理器 (ConnectionEventProcessor)
我们提供了两种事件监听,建连事件(ConnectionEventType.CONNECT)与断连事件(ConnectionEventType.CLOSE),用户可以创建自己的事件处理器,并注册到客户端或者服务端。客户端与服务端,都可以监听到各自的建连与断连事件。
处理连接建立事件
处理连接断开事件
1.3 客户端与服务端初始化 (RpcClient,RpcServer)
我们提供了一个 RpcClient 与 RpcServer,经过简单的必要功能初始化,或者功能开关,即可使用。一个最简单的例子如下:
客户端初始化示例
服务端初始化示例
用法1
将 SOFABolt 用作一个远程通信框架,使用者可以不用关心如何实现一个私有协议的细节,直接使用我们内置的 RPC 通信协议。可以非常简单的启动客户端与服务端,同时注册一个用户请求处理器,即可完成远程调用。同时,像连接管理、心跳等基础功能特性都默认可以使用。 当前支持的调用类型如下图所示:
示例 Demo
四种通信模型:
1.Oneway 调用
当前线程发起调用后,不关心调用结果,不做超时控制,只要请求已经发出,就完成本次调用。注意 Oneway 调用不保证成功,而且发起方无法知道调用结果。因此通常用于可以重试,或者定时通知类的场景,调用过程是有可能因为网络问题,机器故障等原因,导致请求失败。业务场景需要能接受这样的异常场景,才可以使用。
- Sync 同步调用
当前线程发起调用后,需要在指定的超时时间内,等到响应结果,才能完成本次调用。如果超时时间内没有得到结果,那么会抛出超时异常。这种调用模式最常用。注意要根据对端的处理能力,合理设置超时时间。
- Future调用
当前线程发起调用,得到一个 RpcResponseFuture 对象,当前线程可以继续执行下一次调用。可以在任意时刻,使用 RpcResponseFuture 对象的 get() 方法来获取结果,如果响应已经回来,此时就马上得到结果;如果响应没有回来,则会阻塞住当前线程,直到响应回来,或者超时时间到。
- Callback异步调用
当前线程发起调用,则本次调用马上结束,可以马上执行下一次调用。发起调用时需要注册一个回调,该回调需要分配一个异步线程池。待响应回来后,会在回调的异步线程池,来执行回调逻辑。