前言
上一次文章我们主要讲了一些模型框架,最后引出了Netty的框架结构,Netty 主要基于主从 Reactor多线程模型做了⼀定的改进,主从 Reactor 多线程模型有多个 Reactor,如下图:
今天会带在大家一起学习上述架构中的一些核心组件,废话不多说了,下面我们进入正题。
Bootstrap、ServerBootstrap
Bootstrap是引导,⼀个Netty应⽤通常由⼀个Bootstrap开始,主要作⽤是配置Netty程序,采用链式编程模式,串联Netty各个组件。
它们和其它组件之间的关系是它们将 Netty 的其它组件进⾏组装和配置,所以它们会组合和 直接或间接依赖其它的类;如果熟悉Spring Boot 的同学也可认为其实就是程序的启动的入口。
那Bootstrap和ServerBootstrap 有什么区别呢?
其实从名字就可以区分开来,Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类。
伪代码:
ServerBootstrap b = new ServerBootstrap();
b.option(ChannelOption.SO_BACKLOG, 1024);
b.childOption(ChannelOption.TCP_NODELAY,true);
b.childOption(ChannelOption.SO_KEEPALIVE,true);
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new HttpHelloWorldServerInitializer());
ChannelFuture
ServerBootstrap b = new ServerBootstrap();
Channel ch = b.bind(PORT).sync().channel();
Netty 中所有的 IO 操作都是异步的,不能⽴刻得知消息是否被正确处理,但是可以过⼀会等它执⾏完成或者直接注册⼀个监听,具体的实现就是通过 Future 和 ChannelFutures,他们可以注册⼀个监听,当操作执⾏成功或失败时监听会⾃动触发注册的监听事件。、
常用方法:
Channel channel(),返回当前正在进⾏ IO 操作的通道
ChannelFuture sync(),等待异步操作执⾏完毕
JDK 中的 Future 接⼝:
public interface Future {
// 取消该任务
boolean cancel(boolean mayInterruptIfRunning);
// 任务是否已取消
boolean isCancelled();
// 任务是否已完成
boolean isDone();
// 阻塞获取任务执⾏结果
V get() throws InterruptedException, ExecutionException;
// 带超时参数的获取任务执⾏结果
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
Netty 中的 Future 接⼝(同名)继承了 JDK 中的 Future 接⼝,然后添加了⼀些⽅法:
public interface Future extends java.util.concurrent.Future {
// 是否成功
boolean isSuccess();
// 是否可取消
boolean isCancellable();
// 如果任务执⾏失败,这个⽅法返回异常信息
Throwable cause();
// 添加 Listener 来进⾏回调
Future<V> addListener(GenericFutureListener<? extends Future<? super V>>
listener);
Future<V> addListeners(GenericFutureListener<? extends Future<? super
V>>... listeners);
Future<V> removeListener(GenericFutureListener<? extends Future<? super
V>> listener);
Future<V> removeListeners(GenericFutureListener<? extends Future<? super
V>>... listeners);
// 阻塞等待任务结束,如果任务失败,将“导致失败的异常”重新抛出来
Future<V> sync() throws InterruptedException;
// 不响应中断的 sync(),这个⼤家应该都很熟了
Future<V> syncUninterruptibly();
// 阻塞等待任务结束,和 sync() 功能是⼀样的,不过如果任务失败,它不会抛出执⾏过程中的异
//常
Future<V> await() throws InterruptedException;
Future<V> awaitUninterruptibly();
boolean await(long timeout, TimeUnit unit) throws InterruptedException;
boolean await(long timeoutMillis) throws InterruptedException;
boolean awaitUninterrupt