![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
2020面试题
文章平均质量分 91
自己整体的大厂面试题
小马的学习笔记
这个作者很懒,什么都没留下…
展开
-
Pipeline 的事件传播机制
Pipeline 的事件传播机制前面章节中,我们已经知道 AbstractChannelHandlerContext 中有 inbound 和 outbound 两个 boolean 变量,分别用于标识 Context 所对应的 handler 的类型,即:1、inbound 为 true 是,表示其对应的 ChannelHandler 是 ChannelInboundHandler 的子类。2、outbound 为 true 时,表示对应的 ChannelHandler 是 ChannelOutbo原创 2021-02-22 18:37:17 · 394 阅读 · 1 评论 -
netty源码-EventLoopGroup
EventLoopGroup 与 Reactor 关联我们介绍了三种 Reactor 的线程模型, 那么它们和 NioEventLoopGroup 又有什么关系呢?其实,不同的设置NioEventLoopGroup 的方式就对应了不同的 Reactor 的线程模型。1.单线程模型,来看下面的应用代码:EventLoopGroup bossGroup = new NioEventLoopGroup(1); ServerBootstrap server = new ServerBootstr原创 2020-12-27 15:46:32 · 463 阅读 · 0 评论 -
netty源码-服务端初始化
NioServerSocketChannel的创建再看服务端代码,我们调用了 ServerBootstarap 的 channel(NioServerSocketChannel.class)方法,传的参数是 NioServerSocketChannel.class 对象。如此,按照客户端代码同样的流程,我们可以确定 NioServerSocketChannel 的 实例化也是通过 ReflectiveChannelFactory 工厂类来完成的,而 ReflectiveChannelFactory 中的原创 2020-12-17 19:14:11 · 571 阅读 · 0 评论 -
netty源码-客户端初始化
netty的客户端代码例子:public Test connect(int port, String host, final String nickName) { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioSock...原创 2020-12-01 18:15:31 · 434 阅读 · 0 评论 -
netty中的设计模式
设计模式在 Netty 中的应用单例模式源码举例单例模式要点回顾:1、一个类在任何情况下只有一个对象,并提供一个全局访问点。2、可延迟创建。3、避免线程安全问题案例分析@Sharable public final class MqttEncoder extends MessageToMessageEncoder<MqttMessage> { public static final MqttEncoder INSTANCE = new MqttEncode..原创 2020-11-26 10:35:48 · 589 阅读 · 0 评论 -
netty无锁化的串行设计理念
无锁化的串行设计理念在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来 严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息 的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。为了尽可能提升性能,Netty 采用了串行无锁化设计,在 IO 线程内部进行串行操作,避免多线程竞争导致的性能下降表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 N原创 2020-12-01 18:17:30 · 1845 阅读 · 0 评论 -
netty的内存池
内存池随着 JVM 虚拟机和 JIT 即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区 Buffer,情 况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty 提供了基于内存池的缓冲区重用机制。下面我们一起看下 Netty ByteBuf 的实现:Netty 提供了多种内存管理策略,通过在启动辅助类中配置相关参数,可以实现差异化的定制。下面通过性能测试,我们看下基于内存池循环利用的 ByteBuf 和普通 ByteBuf原创 2020-11-13 10:07:58 · 687 阅读 · 1 评论 -
netty的零拷贝
Netty 的“零拷贝”主要体现在如下三个方面:1) Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲 区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接 内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。2) Netty 提供了组合 Buffer 对象,可以聚合多个 B原创 2020-11-13 10:07:05 · 493 阅读 · 0 评论 -
netty的基本概念-阻塞与非阻塞,同步与异步
阻塞(Block)和非阻塞(Non-Block)阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。同步(Synchronization)和异步(Asynchronous)同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式。比如同步:是应用原创 2020-11-13 10:06:09 · 1225 阅读 · 0 评论 -
netty的基本概念-编码器和解码器
编、解码技术通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持 久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原 始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远程跨进程服务调用时(例如 RPC 调用),需要使用特定的编解码技术,对需要进行网络传输的对象做编码或者解码,以便完成远程调用。Netty 为什么要提供编解码框架?作为一个原创 2020-11-13 10:05:30 · 897 阅读 · 0 评论 -
netty的基本概念-TCP粘包和拆包
TCP 粘包/拆包TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP 作为传输层协议并不不了解上层业务数据的具 体含义,它会根据 TCP 缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。 同样, 在 Netty 的编码器中, 也会对半包和粘包问题做相应的处理。什么是半包, 顾名思义, 就是不完整的数据包, 因为 Betty 在轮询读事件的时候原创 2020-11-13 10:04:57 · 279 阅读 · 0 评论 -
netty的基本概念-NIO三件套
Java NIO 三件套在 NIO 中有几个核心对象需要掌握:缓冲区(Buffer)、选择器(Selector)、通道(Channel)缓冲区 Buffer1.Buffer 操作基本 AP在 NIO 中,所有的缓冲区类型都继承于抽象类 Buffer,最常用的就是 ByteBuffer,对于 Java 中的基本类型,基本都有一个具体 Buffer 类型与之相对应,它们之间的继承关系如下图所示:下面是一个简单的使用 IntBuffer 的例子:package com.gupaoed原创 2020-11-13 10:04:28 · 276 阅读 · 0 评论 -
netty的基本概念-BIO与NIO对比
BIO 与 NIO 对比下表总结了 Java BIO(Block IO)和 NIO(Non-Block IO)之间的主要差别异。面向流与面向缓冲Java NIO 和 BIO 之间第一个最大的区别是,BIO 是面向流的,NIO 是面向缓冲区的。 Java BIO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。 如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO 的缓冲导向方法略有不同。数据读取到原创 2020-11-13 10:02:59 · 614 阅读 · 1 评论 -
netty的基本概念-AIO详解
Java AIO 详解jdk1.7 (NIO2)才是实现真正的异步 AIO、把 IO 读写操作完全交给操作系统,学习了 linux epoll 模式,下面我们来做一些演示。AIO(Asynchronous IO)基本原理服务端:AsynchronousServerSocketChannel客服端:AsynchronousSocketChannel用户处理器:CompletionHandler 接口,这个接口实现应用程序向操作系统发起 IO 请求,当完成后处理具体逻辑,否则做自己该做的事情原创 2020-11-13 10:02:01 · 907 阅读 · 0 评论 -
netty的高效的Reactor线程模型
高效的 Reactor 线程模型常用的 Reactor 线程模型有三种,分别如下:1) Reactor 单线程模型;2) Reactor 多线程模型;3) 主从 Reactor 多线程模型Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下:1) 作为 NIO 服务端,接收客户端的 TCP 连接;2) 作为 NIO 客户端,向服务端发起 TCP 连接;3) 读取通信对端的请求或者应答消息;4) 向通信对端发送消息请求原创 2020-11-13 10:01:04 · 305 阅读 · 0 评论 -
netty的拆包粘包,在生产中是怎么处理的
概念TCP 是以流的方式来处理数据,所以会导致粘包 / 拆包。 拆包:一个完整的包可能会被 TCP 拆分成多个包进行发送。 粘包:也可能把小的封装成一个大的数据包发送。 原因 应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象。而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象。 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。 以太网帧的 payload(净荷)大于 MTU(.原创 2020-11-13 10:00:37 · 233 阅读 · 0 评论 -
netty的epoll和linux的epoll是如何实现的
1.linux的epollepoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。原创 2020-11-04 18:25:06 · 4164 阅读 · 0 评论