面试题-Netty框架
前言
Netty框架部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,并添加了一些比较重要的问题,希望对大家起到一定的帮助。
系列文章:
Netty框架
Netty 是什么?
- Netty是一个基于NIO的client-server框架,使用它可以快速开发网络应用程序
- 并且支持多种协议,包括FTP,HTTP以及各种二进制和基于文本的传输协议
为什么要⽤ Netty?
- 阻塞和⾮阻塞的Socket都使用统一的API,便于开发
- 实现了强大的线程模型
- 自带解决粘包拆包的解码器
- 社区活跃,经历了大型项目的考验,成熟稳定
Netty 应⽤场景了解么?
- 我们项目中的就是利用Netty实现了一个自有协议的网络服务器
- 很多分布式框架的网络通信工具,比如我们项目中使用的Storm底层也是使用Netty进行通信的
Netty 核⼼组件有哪些?分别有什么作⽤?
- Channel:Netty对网络操作的抽象,包括了一些常见的网络IO操作,比如read,write等等,最常见的实现类:NioServerSocketChannel和NioSocketChannel,对应Bio中的ServerSocketChannel和SocketChannel
- EventLoop:负责监听网络事件并调用事件处理器进行相关的处理
- ChannelFuture:Netty是异步的,所有操作都可以通过ChannelFuture来实现绑定一个监听器然后执行结果成功与否的业务逻辑,或者把通过调用sync方法,把异步方法变成同步的。
- ChannelHandler 和 ChannelPipeline:Netty底层的处理器是一个处理器链,链条上的每一个处理器都可以对消息进行处理,选择继续传递或者到此为止,一般我们业务会实现自己的解码器/心跳处理器和实际的业务处理Handler,然后按照顺序绑定到链条上。
EventloopGroup 了解么?和 EventLoop 啥关系?
EventLoop可以理解为线程,那么Group就是线程池或者线程组,Netty的线程模型中,每一个channel需要绑定到一个固定的EventLoop进行后续的处理,Netty就是根据某一个算法从线程组中选择一个线程进行绑定的。
Bootstrap 和 ServerBootstrap 了解么?
BootStarp和ServerBootstrap都是一个启动引导类,相当于如果要使用Netty需要把相关信息配置到启动引导类中,这样Netty才能正确工作。
Bootstrap是客户端引导类,核心方法是connect,传入一个EventLoopGroup就可以
ServerBootstrap是服务断引导类,核心方法是bind,需要传入两个EventLoopGroup,一个负责接受连接,一个负责处理具体的连接上的网络IO任务。
NioEventLoopGroup 默认的构造函数会起多少线程?
NioEventLoopGroup 默认的构造函数实际会起的线程数为 CPU核⼼数*2 。
Netty 线程模型了解么?
Netty主要靠配置EventLoopGroup来实现具体的线程模型的。
以服务端开发为例,通过配置不同的线程数量可以实现不同的线程模型。
- 单线程:两个EventloopGroup都是用同一个只为1的group,这意味着一个线程需要处理所有的socket的所有网络IO事件,对高负载高并发高性能的场景不适用。
- 多线程:一个acceptor线程负责监听连接,N个EventLoop负责处理具体连接的网络IO,但是如果并发连接大,就会出现性能问题
- 主从模型:主从模型就是acceptor连接线程使用线程池来实现,我们具体项目也是使用这种方式的。
什么是 TCP 粘包/拆包?
TCP的粘包拆包指的是,基于TCP发送数据时,多条消息会在一个包中粘在一起,或者一条消息直接被分为两个包发送过来,我们需要正确的处理,把每条消息都正确的拆分和合并起来。
简单说说Netty中自带的解决粘包拆包的解码器类型吧?
Netty自带四种解决粘包拆包的解码器。
- LineBasedFrameDecoder :基于换行符的解码器
- DelimiterBasedFrameDecoder:基于分隔符的解码器
- FixedLengthFrameDecoder:基于固定长度的解码器
- LengthFieldBasedFrameDecoder:基于消息中的消息长度字段进行解码的解码器,我们项目中实际使用的就是这种解码器,核心就是传入长度字节的起始位置和长度即可。
⻓连接是什么
什么是连接:TCP协议中如果两端想要传递数据,首先需要通过三次握手建立连接,握手完毕,连接就建立完毕,但是这个过程是比较消耗网络资源的。
短连接:一轮数据传输完毕后,就断开连接,实现和管理都很方便,但是频繁的建立断开连接比较消耗网络资源。
长连接:数据传输完毕后,不断开连接,下次有数据发送需求的时候再使用这个连接,省去了握手的过程。
如何实现长连接?
我在自己的博客中专门写过一篇博客总结过为什么需要保活机制,详见此 网络编程-为什么需要应用层做心跳处理?总结来说,依赖TCP的超时或者Keep alive机制,在最差情况下的超时时间都是不可接受的,所以我们需要通过定时发送带序号的心跳包来实现应用层保活,并且为了防止误判,需要多发送几次心跳包来检测,在我们具体的业务实现中,使用的是Netty的IdeStateHandle中的回调方法来实现心跳机制。
Netty 的零拷⻉了解么?
首先说说什么是零拷贝:
- 零拷贝技术指的是,cpu不需要为了在内存中拷贝数据而消耗资源
- Netty中的零拷贝技术表现形式有下面几种:
- 可以把文件中的数据直接发送到发送缓冲区中,底层用的是操作系统提供的sendFile系统调用(节省了内核到用户空间和用户空间到内核的两次拷贝)。 参考材料: 内核零拷贝的实现原理
- 允许多段数据合并为一段虚拟数据供用户使用,节约了copy的消耗
面试题-Netty框架的更多相关文章
- Android Netty框架的使用
Netty框架的使用 1 TCP开发范例 发送地址---192.168.31.241 发送端口号---9223 发送数据 { "userid":"mm910@mbk.co ...
- 基于netty框架的Socket传输
一.Netty框架介绍 什么是netty?先看下百度百科的解释: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...
- Netty框架
Netty框架新版本号:3.0.2.GA,于2008年11月19日公布.Netty项目致力于提供一个异步的.事件驱动的网络应用框架和工具,用于高速开发可维护的.高性能的.高扩展性的server和cli ...
- NetCore Netty 框架 BT.Netty.RPC 系列随讲 二 WHO AM I 之 NETTY/NETTY 与 网络通讯 IO 模型之关系?
一:NETTY 是什么? Netty 是什么? 这个问题其实百度上一搜一堆. 这是官方话的描述:Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个 ...
- 深入理解Netty框架
前言 本文讨论的主题是Netty框架,本着3W原则 (What 是什么?->Why 为什么?->How 如何做?)来一步步探究Netty原理和本质以及运用场景. 了解基本名词 1.BIO. ...
- 架构-Java-Netty:Netty框架
ylbtech-架构-Java-Netty:Netty框架 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网 ...
- 【转】彻底搞透Netty框架
本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序 ...
- java面试题-常用框架
Spring Spring 是什么 一个开发框架,一个容器,主要由面向切面AOP 和依赖注入DI两个方面,外加一些工具 AOP和IOC AOP 面向切面 AOP是一种编程思想,主要是逻辑分离, 使业务 ...
- 基于Java Netty框架构建高性能的部标808协议的GPS服务器
使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标808协议的固有复杂性和几个月长周 ...
- websocket(三) 进阶!netty框架实现websocket达到高并发
引言: 在前面两篇文章中,我们对原生websocket进行了了解,且用demo来简单的讲解了其用法.但是在实际项目中,那样的用法是不可取的,理由是tomcat对高并发的支持不怎么好,特别是tomcat ...
随机推荐
- ESP8266 wifi模块+CH340烧录板安装使用运行教程
硬件准备 ESP8266-01S 模块 USB转TTL烧录板(CH340) LED灯(建议使用3.3V LED) 220Ω电阻(LED限流) 面包板和跳线若干 我的是这样的不用接线,其他的参考 ESP ...
- biancheng-Pygame(python)
http://c.biancheng.net/pygame/ Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows.Linux.Mac OS 等操作系统 ...
- Python使用技巧2
python url网址拼接 在做爬虫中,经常会遇到需要把一个域名和网址路径进行拼接,在开发时一时没想到方法,特此记录下来. 利用parse.urljoin方法进行网址拼接 from urllib i ...
- RocketMQ -- offset管理
正文首先来明确一下 Offset 的含义, RocketMQ 中, 一 种类型的消息会放到 一 个 Topic 里,为了能够并行, 一般一个 Topic 会有多个 Message Queue (也可以 ...
- mysql事务中使用临时表
最近在使用存储过程完成晚上数据的定时汇总功能,其中需要在存储过程中启用事务,但是发现使用了create table语句后事务会自动提交这个语句前的语句,即便是这个语句后发生了错误进行了回滚. 测试语句 ...
- dart变量类型详解
1==> 三个单引号的作用 String Str = ''' qijqowjdo 哈哈嘿嘿黑 '''; print(Str); 这样使用三个单引号,输出来换行:方便我们观看而已哈 2==> ...
- Svelte 最新中文文档翻译(5)—— 基础标记
前言 Svelte,一个非常"有趣".用起来"很爽"的前端框架.从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 ...
- 无耳科技 Solon v3.0.7 发布(2025农历新年版)
Solon 框架! Solon 框架由杭州无耳科技有限公司(下属 Noear 团队)开发并开源.是新一代,面向全场景的 Java 企业级应用开发框架.从零开始构建(非 java-ee 架构),有灵活的 ...
- 实“智”名归!天翼云论文被国际顶会IEEE CVPR收录!
近日,由天翼云弹性网络产品线撰写的<Small Scale Data-free Knowledge Distillation>长文被IEEE Conference on Computer ...
- hashmap为什么要引入红黑树?
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依 ...