
Netty
文章平均质量分 86
阿弥陀佛僧
知幻即离,不假方便;离幻即觉,亦无渐次。
展开
-
Netty22——用Netty实现RPC
一、RPC介绍 RPC(Remote Procedure Call)— 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序, 而程序员无需额外地为这个交互编程。两个或多个应用程序分布在不同的服务器上,它们之间的调用像是本地方法调用一样。 常见的 RPC 框架有:阿里的Dubbo、google的gRPC、Go语言的rpcx、 Apache的thrift,以及Spring 旗下的 Spring Cloud。 在RPC 中, Client 叫服务消费者,Serv原创 2022-03-17 00:27:45 · 1787 阅读 · 2 评论 -
Netty21——Netty中处理耗时任务的方式
如果在 Netty 中做耗时的、不可预料的操作,比如数据库、网络请求等,会严重影响 Netty 对 Socket 的处理速度。解决方法就是将耗时任务添加到异步线程池中。但就添加线程池这步操作来讲,有2种方式: 在Handler 中加入线程池; 在Context 中添加线程池;一、在Handler中将任务加入线程池 将EchoServerHandler的channelRead()方法进行修改,该为异步的方式:@Sharablepublic class EchoServerHandler exte原创 2022-03-15 23:57:52 · 2728 阅读 · 0 评论 -
Netty20——Netty 核心组件 EventLoop 剖析
一、EventLoop的继承关系EventLoopGroup bossGroup = new NioEventLoopGroup(1); 在使用Netty时,上面的代码是必不可少的,即创建一个EventLoop对象,EventLoop的类继承关系如下: ①ScheduledExecutorService接口表示是一个定时任务接口,即EventLoop可以接受定时任务。 ②EventLoop接口:Netty接口文档说明了该接口的作用,一旦Channel注册了,就处理该Channel对应的所有IO操原创 2022-03-14 23:53:02 · 389 阅读 · 0 评论 -
Netty19——Netty心跳服务剖析
一、Netty连接的有效性检测 Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一个服务-----心跳机制(heartbeat)。通过心跳检查对方是否有效,这是 RPC 框架中必不可少的功能。下面我们分析一下Netty内部心跳服务的实现。 Netty 提供了 IdleStateHandler、ReadTimeoutHandler和WriteTimeoutHandler 三个检测连接的有效性的 Handler ,此处重点分析 IdleStateHandler。原创 2022-03-14 21:37:26 · 772 阅读 · 0 评论 -
Netty18——ChannelPipeline 调度 handler的剖析
当一个请求进来的时候,ChannelPipeline 是如何调用内部的这些 handler 的呢? 当一个请求进来的时候,会第一个调用 pipeline 的 相关方法,如果是入站事件,这些方法由 fire 开头,表示开始管道的流动。从head节点开始,每个handler处理完成后,接着让后面的 handler 继续处理。一、ChannelPipeline调度Handler的过程 在DefaultChannelPipeline中有个fireChannelActive()方法,是请求入站的开始,源码如下原创 2022-03-10 22:46:45 · 496 阅读 · 0 评论 -
Netty17——Pipeline、Handler和HandlerContext的创建
Netty中的ChannelPipeline、ChannelHandler和ChannelHandlerContext是非常核心的组件。一、三者间的关系 每当ServerSocket创建一个新的连接,就会创建一个Socket,对应的就是一个目标客户端;每一个新创建的Socket都会分配一个全新的ChannelPipeline;每个ChannelPipeline内部都含有多个ChannelHandlerContext,这些ChannelHandlerContext组成了一个双向链表,用于包装我们调用ad原创 2022-01-04 21:44:47 · 599 阅读 · 0 评论 -
Netty16——接收请求过程分析
服务器启动后肯定是要接收客户端请求并返回客户端想要的数据的。那么Netty服务端在启动之后是如何接收客户端请求的呢? 服务端启动之后,最终会注册一个 Accept 事件等待客户端的连接。NioServerSocketChannel 将自己注册到了 bossGroup线程池(reactor线程)上,也就是EventLoop(实际类型为NioEventLoop)上。在上一节《Netty启动过程分析》的末尾,我们有提到 NioEventLoop,其中有个run()方法,源码如下:@Overrideprot原创 2021-12-23 00:05:40 · 1397 阅读 · 0 评论 -
Netty15——Netty启动过程分析
在Netty的io.netty.example包下有很多Netty的案例,可以用于源码分析和学习。现在使用该包下的Echo案例分析Netty的启动过程,入口代码如下:public final class EchoServer { static final boolean SSL = System.getProperty("ssl") != null; static final int PORT = Integer.parseInt(System.getProperty("port",原创 2021-12-06 22:17:56 · 700 阅读 · 0 评论 -
Netty14——TCP的粘包和拆包
一、TCP的粘包和拆包 TCP 是面向连接的,也是面向流的。为了提供高可靠性的服务,收发两端(客户端和服务器端)要有一一成对的socket。发送端为了将多个发给接收端的包更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边界的。 由于TCP无消息保护边界, 需要在接收端处理消息边界问题,也就是我们所说的粘包、拆包问题。如下图: 假设客户端分别发原创 2021-10-11 21:24:26 · 146 阅读 · 0 评论 -
Netty13——Handler的调用机制
一、Handler 的作用 Netty 的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等。ChannelHandler 充当了处理入站和出站数据的应用程序逻辑的容器。例如,实现ChannelInboundHandler 接口(或ChannelInboundHandlerAdapter),就可以接收入站事件和数据,这些数据会被业务逻辑处理。当要给客户端发送响应时,可以从 ChannelInboundHandler 冲刷数据。业原创 2021-08-11 00:28:11 · 753 阅读 · 0 评论 -
Netty12——编解码和数据传输
一、编码和解码 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码。 编解码器(codec)的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据。二、Netty 的编解码器 Netty 自身提供了一些 codec(编解码器),Netty 提供的编码器有: StringEncoder:对字符串数据进行编码 ObjectEn原创 2021-08-09 23:57:06 · 352 阅读 · 0 评论 -
Netty11——案例
一、群聊系统 要求:编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞);实现多人群聊。服务器端可以监测用户上线、离线,并实现消息转发功能;客户端通过 channel 可以无阻塞发送消息给其它所有用户,同时可以接收其它用户发送的消息(由服务器转发得到)。二、心跳检测三、通过WebSocket实现服务端和客户端的长连接...原创 2021-08-08 01:29:40 · 215 阅读 · 0 评论 -
Netty10——Netty核心组件
一、Bootstrap、ServerBootstrap Bootstrap 的意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类, ServerBootstrap 是服务端的启动引导类。常见的方法有:// 该方法是在 ServerBootstrap 中定义的,用于服务器端,用来设置两个 EventLoopGroup,这两个 Group 中的线程分别用于接收客户端连接和用原创 2021-07-31 03:59:29 · 235 阅读 · 0 评论 -
Netty09——异步模型
一、基本介绍 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者。Netty 中的 I/O 操作是异步的,包括 Bind、Write、Connect 等操作会简单的返回一个 ChannelFuture。调用者并不能立刻获得结果,而是通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。 Netty 的异步模型是建立在 future 和 callback 之上的。call原创 2021-07-29 23:50:16 · 129 阅读 · 0 评论 -
Netty08——Netty模型
一、工作原理 Netty 主要基于主从 Reactors 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor。 说明: ①BossGroup 线程维护其中一个Selector,它只关注Accept事件 ②当接收到Accept事件,为其分配一个对应的SocketChannel,并将其封装成 NIOScoketChannel 并注册到 Worker 线程(事件循环)中的Selector,并进行维护 ③当 Worker 线程监听到 Selector 中的通道发生原创 2021-07-29 01:00:33 · 189 阅读 · 1 评论 -
Netty07——Netty概述
一、概述 原生NIO存在很多问题: ①NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、 SocketChannel、ByteBuffer 等; ②需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序; ③开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等;原创 2021-07-25 23:30:48 · 169 阅读 · 3 评论 -
Netty06——AIO
一、AIO介绍 JDK 7 引入了 Asynchronous I/O,即 AIO。在进行 I/O 编程中,常用到两种模式: Reactor 和 Proactor。Java 的 NIO 就是 Reactor——当有事件触发时,服务器端得到通知,进行相应的处理。 AIO 即 NIO2.0,叫做异步不阻塞的 IO。AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应原创 2021-07-25 00:10:30 · 457 阅读 · 1 评论 -
Netty05——NIO与零拷贝
一、零拷贝 零拷贝是网络编程的关键,很多性能优化都离不开零拷贝。在 Java 程序中,常用的零拷贝有 mmap(内存映射) 和 sendFile。 Java 中传统的 IO 和网络编程:File file = new File("test.txt"); RandomAccessFile raf = new RandomAccessFile(file, "rw"); byte[] arr = new byte[(int) file.length()]; raf.read(arr); Socket原创 2021-07-24 01:27:55 · 257 阅读 · 0 评论 -
Netty04——NIO 网络编程
一、非阻塞网络编程 NIO 非阻塞网络编程中Selector、SelectionKey、 ServerScoketChannel和SocketChannel的关系原创 2021-07-20 23:51:17 · 162 阅读 · 0 评论 -
Netty03——NIO的核心组件
一、缓冲区Buffer 缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(数组),该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、 网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer。 在 NIO 中,Buffer 是一个顶层父类,它是一个抽象类,常用的子类如下: ①ByteBuffer:存储字节数据到缓冲区 ②ShortBuffer:存储short型数据到缓冲区 ③Cha原创 2021-07-19 23:29:28 · 203 阅读 · 0 评论 -
Netty02——BIO和NIO
一、I/O模型 对I/O 模型简单的理解就是用什么样的通道进行数据的发送和接收,这很大程度上决定了程序通信的性能。Java 共支持3种网络编程模型/IO模式:BIO、NIO、AIO。 Java BIO : 同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的线程开销。 Java NIO : 同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路原创 2021-06-16 00:03:19 · 205 阅读 · 0 评论 -
Netty01——简介
一、Netty简介 Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 Netty 主要针对在 TCP 协议下,面向Clients端的高并发应用,或者 Peer-to-Peer 场景下的大量数据持续传输的应用。 Netty 本质是一个NIO框架,适用于服务器通讯相关的多种应用场景。 Netty是基于NIO的,NIO是基于BIO和网络编程的,网络编程又是基于TCP/IP协议的。二、Netty的应用场景 1、互联网行业:在分布式系统中,各个节点之原创 2021-06-15 22:08:37 · 316 阅读 · 5 评论