11-Netty 高性能架构设计-异步模型(ChannelFuture)
异步模型
基本介绍
- 异步模型和同步模型相对, 当一个异步过程调用发出后, 调用者不能立刻得到结果, 实际处理这个调用的组件在完成后,通过状态, 通知和回调来通知调用者
- Netty中的IO操作是异步的,包括bind, write, Connect等操作会简单的返回一个ChannelFuture
- 调用者不能立刻获得结果, 而是通过Future-listener机制, 用户可以方便的主动获取或者通过通知机制获得IO操作结果
- Netty的异步模型是建立在future 和 callback之上的, callback就是回调, 重点说Future, 他的核心思想是: 假设一个方法fun, 计算过程可能非常耗时, 等待Fun返回显然不合适, 那么可以再调用Fun的时候,立马写一个Future, 后续可以通过Future去监控方法Fun的处理过程, (即Future-Listener 机制)
Futurn说明
- 表示异步的执行结果, 可以通过他提供的方法来检查执行是否完成,比如检索计算等等
- ChannelFuture是一个接口: public interface ChannelFuture extends Future<Void> {}
- 我们可以添加监听器, 当监听的事件发生时, 就会通知到监听器, 案例说明
工作原理示意图
说明:
- 在使用Netty进行编程时拦截操作和转换出入站数据只需要提供callback或者利用future即可, 这使链式操作简单, 高效, 并有利于编写可重用的通用的代码
- Netty框架的目标就是让你的业务逻辑从网络基础应用编码中分离出来, 解脱出来
future-listener机制
- 当Future对象刚刚创建时, 处于非完成状态, 调用者可以通过返回的ChannelFuture来获取操作执行的状态, 注册监听函数来执行完成后的操作
- 常见有如下操作
- 通过isDone方法来判断当前操作是否完成
- 通过isSuccess方法来判断已完成的当前操作是否成功
- 通过getCause方法来获取已完成的当前操作失败的原因
- 通过isCancelled方法来判断已完成的当前操作是否被取消
- 通过addListener方法注册监听器, 当操作已完成(isDone 方法返回完成), 将会通知指定的监听器, 如果Future对象已完成, 则通知指定的监听器
举例说明
// 绑定一个接口 并且同步 生成一个 ChannelFuture 对象 // 启动服务器(并绑定端口) ChannelFuture channelFuture = serverBootstrap.bind(6668).sync(); // 给channelFuture注册监听器 channelFuture.addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture channelFuture) throws Exception { // 如果操作成功 if (channelFuture.isSuccess()){ System.out.println("监听端口 6668 成功"); }else{ System.out.println("监听端口 6668 失败"); } } });
执行结果
server is ready......
监听端口 6668 成功