互联网码农必备技能,Netty进阶篇,Netty核心组件详解

本文深入探讨了Netty的关键组件,包括Bootstrap和ServerBootstrap启动引导类,ChannelFuture的异步操作,Selector的IO多路复用,Channel的网络操作,以及ChannelHandler、ChannelHandlerContext和ChannelPipeline的事件处理。此外,还讲解了ChannelOption配置选项,EventLoopGroup和NioEventLoopGroup的角色,以及ByteBuf的缓冲区操作。通过对这些组件的理解,有助于提升Java后端开发者对Netty框架的掌握。
摘要由CSDN通过智能技术生成

前言

上一次文章我们主要讲了一些模型框架,最后引出了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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值