当前位置:首页 > 科技  > 软件

面试官:说说Netty核心组件?

来源: 责编: 时间:2024-05-30 09:10:44 311观看
导读Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。Netty 核心组件包含以下内容:启动器 Bootstrap/ServerBootstrap事件循环器 EventLoopGroup

Cdi28资讯网——每日最新资讯28at.com

Netty 核心组件是指 Netty 在执行过程中所涉及到的重要概念,这些核心组件共同组成了 Netty 框架,使 Netty 框架能够正常的运行。Cdi28资讯网——每日最新资讯28at.com

Netty 核心组件包含以下内容:Cdi28资讯网——每日最新资讯28at.com

  • 启动器 Bootstrap/ServerBootstrap
  • 事件循环器 EventLoopGroup/EventLoop
  • 通道 Channel
  • 通道处理器 ChannelHandler
  • 通道管道 ChannelPipeline

这些组件的交互流程如下:Cdi28资讯网——每日最新资讯28at.com

Cdi28资讯网——每日最新资讯28at.com

上图是 Netty 逻辑处理架构,这个逻辑处理架构为典型网络分层架构设计,共分为网络通信层、事件调度层、服务编排层,每一层各司其职,共同成为了 Netty 的核心组件。Cdi28资讯网——每日最新资讯28at.com

1.Bootstrap/ServerBootstrap【启动器】

Bootstrap 是“引导”的意思,它主要负责整个 Netty 程序的启动、初始化、服务器连接等过程,它相当于一条主线,串联了 Netty 的其他核心组件。Cdi28资讯网——每日最新资讯28at.com

Cdi28资讯网——每日最新资讯28at.com

PS:Netty 中的引导器共分为两种类型:一个为用于客户端引导的 Bootstrap,另一个为用于服务端引导的 ServerBootStrap。Cdi28资讯网——每日最新资讯28at.com

2.Channel【通道】

Channel 是网络数据的传输通道,它代表了到实体(如硬件设备、文件、网络套接字或能够执行 I/O 操作的程序组件)的开放连接,如读操作和写操作。Cdi28资讯网——每日最新资讯28at.com

Channel 提供了基本的 API 用于网络 I/O 操作,如 register、bind、connect、read、write、flush 等。Netty 自己实现的 Channel 是以 JDK NIO Channel 为基础的,相比较于 JDK NIO,Netty 的 Channel 提供了更高层次的抽象,同时屏蔽了底层 Socket 的复杂性,赋予了 Channel 更加强大的功能,你在使用 Netty 时基本不需要再与 Java Socket 类直接打交道。Cdi28资讯网——每日最新资讯28at.com

常见的 Channel 类型有以下几个:Cdi28资讯网——每日最新资讯28at.com

  • NioServerSocketChannel 异步 TCP 服务端。
  • NioSocketChannel 异步 TCP 客户端。
  • OioServerSocketChannel 同步 TCP 服务端。
  • OioSocketChannel 同步 TCP 客户端。
  • NioDatagramChannel 异步 UDP 连接。
  • OioDatagramChannel 同步 UDP 连接。

当然 Channel 也会有多种状态,如连接建立、连接注册、数据读写、连接销毁等状态。Cdi28资讯网——每日最新资讯28at.com

3.EventLoopGroup/EventLoop【事件循环器】

EventLoopGroup 是一个处理 I/O 操作和任务的线程组。在 Netty 中,EventLoopGroup 负责接受客户端的连接,以及处理网络事件,如读/写事件。它包含多个 EventLoop,每个 EventLoop 包含一个 Selector 和一个重要的组件,用于处理注册到其上的 Channel 的所有 I/O 事件Cdi28资讯网——每日最新资讯28at.com

(1)EventLoopGroup、EventLoop和Channel

它们三者的关系如下:Cdi28资讯网——每日最新资讯28at.com

  1. 一个 EventLoopGroup 往往包含一个或者多个 EventLoop。EventLoop 用于处理 Channel 生命周期内的所有 I/O 事件,如 accept、connect、read、write 等 I/O 事件。
  2. EventLoop 同一时间会与一个线程绑定,每个 EventLoop 负责处理多个 Channel。
  3. 每新建一个 Channel,EventLoopGroup 会选择一个 EventLoop 与其绑定。该 Channel 在生命周期内都可以对 EventLoop 进行多次绑定和解绑。

(2)线程模型

Netty 通过创建不同的 EventLoopGroup 参数配置,就可以支持 Reactor 的三种线程模型:Cdi28资讯网——每日最新资讯28at.com

  1. 单线程模型:EventLoopGroup 只包含一个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup;
  2. 多线程模型:EventLoopGroup 包含多个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup;
  3. 主从多线程模型:EventLoopGroup 包含多个 EventLoop,Boss 是主 Reactor,Worker 是从 Reactor,它们分别使用不同的 EventLoopGroup,主 Reactor 负责新的网络连接 Channel 创建,然后把 Channel 注册到从 Reactor。

4.ChannelHandler【通道处理器】

ChannelHandler 是 Netty 处理 I/O 事件或拦截 I/O 操作的组件。当发生某种 I/O 事件时(如数据接收、连接打开、连接关闭等),ChannelHandler 会被调用并处理这个事件。Cdi28资讯网——每日最新资讯28at.com

例如,数据的编解码工作以及其他转换工作实际都是通过 ChannelHandler 处理的。站在开发者的角度,最需要关注的就是 ChannelHandler,我们很少会直接操作 Channel,都是通过 ChannelHandler 间接完成。Cdi28资讯网——每日最新资讯28at.com

5.ChannelPipeline【通道管道】

ChannelPipeline 是 ChannelHandler 的容器,提供了一种方式,以链式的方式组织和处理跨多个 ChannelHandler 之间的交互逻辑。当数据在管道中流动时,它会按照 ChannelHandler 的顺序被处理。Cdi28资讯网——每日最新资讯28at.com

6.Netty 简单示例

下面是一个使用 Netty 构建的最简单服务器端和客户端示例,这个例子中,服务器接收到客户端的消息后,会直接将消息原样回传给客户端。Cdi28资讯网——每日最新资讯28at.com

(1)服务器端

import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.handler.codec.string.StringDecoder;import io.netty.handler.codec.string.StringEncoder;public class NettyServer {    public static void main(String[] args) throws Exception {        // 创建BossGroup和WorkerGroup,它们都是EventLoopGroup的实现        // BossGroup负责接收进来的连接        EventLoopGroup bossGroup = new NioEventLoopGroup(1);        // WorkerGroup负责处理已经被接收的连接        EventLoopGroup workerGroup = new NioEventLoopGroup();        try {            // 创建服务器端的启动对象,配置参数            ServerBootstrap bootstrap = new ServerBootstrap();            // 设置两个线程组            bootstrap.group(bossGroup, workerGroup)                    // 设置服务器通道实现类型                    .channel(NioServerSocketChannel.class)                    // 设置通道初始化器,主要用来配置管道中的处理器                    .childHandler(new ChannelInitializer<SocketChannel>() {                        @Override                        protected void initChannel(SocketChannel ch) throws Exception {                            // 向管道加入处理器                            // 解码器:ByteBuf -> String                            ch.pipeline().addLast(new StringDecoder());                            // 编码器:String -> ByteBuf                            ch.pipeline().addLast(new StringEncoder());                            // 自定义的处理器                            ch.pipeline().addLast(new ServerHandler());                        }                    });            System.out.println("服务器 is ready...");            // 绑定一个端口并且同步,生成了一个ChannelFuture对象            ChannelFuture cf = bootstrap.bind(6668).sync();            // 对关闭通道进行监听            cf.channel().closeFuture().sync();        } finally {            // 优雅关闭线程组            bossGroup.shutdownGracefully();            workerGroup.shutdownGracefully();        }    }}

(2)客户端代码

import io.netty.bootstrap.Bootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;import io.netty.handler.codec.string.StringDecoder;import io.netty.handler.codec.string.StringEncoder;public class NettyClient {    public static void main(String[] args) throws Exception {        // 创建EventLoopGroup,相当于线程池        EventLoopGroup group = new NioEventLoopGroup();        try {            // 创建客户端启动对象            Bootstrap bootstrap = new Bootstrap();            // 设置相关参数            bootstrap.group(group) // 设置线程组                    .channel(NioSocketChannel.class) // 设置客户端通道实现类型                    .handler(new ChannelInitializer<SocketChannel>() { // 设置处理器                        @Override                        protected void initChannel(SocketChannel ch) throws Exception {                            // 向管道加入处理器                            ch.pipeline().addLast(new StringDecoder());                            ch.pipeline().addLast(new StringEncoder());                            // 自定义的处理器                            ch.pipeline().addLast(new ClientHandler());                        }                    });            System.out.println("客户端 is ready...");            // 发起异步连接操作            ChannelFuture future = bootstrap.connect("127.0.0.1", 6668).sync();            // 发送消息            future.channel().writeAndFlush("Hello Server!");            // 对关闭通道进行监听            future.channel().closeFuture().sync();        } finally {            group.shutdownGracefully(); // 优雅关闭线程组        }    }}

参考&鸣谢

《Netty核心原理剖析与RPC实践》Cdi28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91684-0.html面试官:说说Netty核心组件?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 聊聊什么是微服务,你看明白了吗?

下一篇: C#开源实用的工具类库,集成超过1000多种扩展方法

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top