Netty之Unpooled类和ByteBuf对象
Unpooled类Netty 提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类
常用方法如下所示
public static ByteBuf copiedBuffer(CharSequence string, Charset charset)通过给定的数据和字符编码返回一个 ByteBuf 对象(类似于 NIO 中的 ByteBuffer 但有区别)
public static ByteBuf buffer(int initialCapacity)获取指定容量的ByteBuf对象
ByteBufByteBuf是一个byte存放的缓冲区。
ByteBuf通过两个位置的指针来协助缓冲区的读写操作,读操作使用readIndex,写操作使用writeIndex。
discardable bytes 丢弃的读空间
readable bytes 可读空间
writeable bytes 可写空间
创建对象,该对象包含一个数组arr , 是一个byte[10]
在netty 的buffer中,不需要使用flip 进行反转 。底层维护了 readerIndex 和 wr ...
Netty核心模块组件
Bootstrap ServerBootstrapBootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中Bootstrap类是客户端程序的启动引导类。ServerBootstrap是服务端启动引导类
常见的方法有
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroupchildGroup),该方法用于服务器端,用来设置两个 EventLoop
public B group(EventLoopGroup group),该方法用于客户端,用来设置一个 EventLoop
public B channel(Class<? extends C> channelClass),该方法用来设置一个服务器端的通道实现
public <T> B option(ChannelOption<T> option, T value),用来给 ServerChannel 添加配置
pub ...
Nett之Http服务实例
快速入门实例-HTTP 服务实例要求:使用IDEA创建Netty项目
Netty 服务器在 6668 端口监听,浏览器发出请求 “http://localhost:6668/ “
服务器可以回复消息给客户端 “Hello! 我是服务器 5 “ , 并对特定请求资源进行过滤.
目的:Netty可以做Http服务开发,并且理解Handler实例和客户端及其请求的关系.
这次,我们将把这个类抽取出来,单独创建。而不是继续使用匿名类的方式。
123456789101112131415161718192021public class TestServer { public static void main(String[] args) throws InterruptedException { NioEventLoopGroup boosGroup = new NioEventLoopGroup(1); NioEventLoopGroup workerGroup = new NioEventLoopGroup(8); tr ...
Netty异步模型
基本介绍异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在 完成后,通过状态、通知和回调来通知调用者。
Netty 中的 I/O 操作是异步的,包括 Bind、Write、Connect 等操作会简单的返回一个 ChannelFuture。
调用者并不能立刻获得结果,而是通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得IO 操作结果。
Netty 的异步模型是建立在 future 和 callback 的之上的。callback 就是回调。重点说 Future,它的核心思想是:假设一个方法 fun,计算过程可能非常耗时,等待 fun 返回显然不合适。那么可以在调用 fun 的时候,立马返回一个 Future,后续可以通过 Future 去监控方法 fun 的处理过程(即 : Future-Listener 机制)
Future 说明表示异步的执行结果, 可以通过它提供的方法来检测执行是否完成,比如检索计算等等.
ChannelFuture 是一个接口 : public interface Channe ...
Netty任务队列TaskQueue
使用场景任务队列中的 Task 有 3 种典型使用场景
用户程序自定义的普通任务 [举例说明]
用户自定义定时任务
非当前 Reactor 线程调用 Channel 的各种方法
比如这里我们有一个非常耗时长的业务,需要10秒钟才能执行完成。
123456789101112131415161718192021222324252627282930313233343536373839404142434445/** * 1.我们自定义一个Handler需要继承netty规定好对某个HandlerAdapter(规范) * 2.这时我们自定义一个Handler,才能称为一个handler */public class NettyServerHandler extends ChannelInboundHandlerAdapter { //读取数据实际(这里我们可以读取客户端发送的消息) //1.ChannelHandlerContext ctx : 上下文对象,含有管道pipeline,通道channel,地址 //2.Object msg: 就是客户端发送的数据 ...
Netty入门案例及分析
Netty快速入门实例 TCP 服务Netty 服务器在 6668 端口监听,客户端能发送消息给服务器 “hello, 服务器~”
服务器可以回复消息给客户端 “hello, 客户端~”
首先导入依赖
12345<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.53.Final</version></dependency>
服务端
1234567891011121314151617181920212223242526272829303132333435363738public class NettyServer { public static void main(String[] args) throws InterruptedException { //创建BoosGroup和WorkerGroup ...
Netty高性能架构设计
线程模型基本介绍不同的线程模式,对程序的性能有很大影响,为了搞清Netty线程模式,我们来系统的讲解下各个线程模式,最后看看 Netty 线程模型有什么优越性.
目前存在的线程模型有:
传统阻塞 I/O 服务模型
Reactor 模式
根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现
单 Reactor 单线程
单 Reactor 多线程
主从 Reactor 多线程
Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor)
传统阻塞 I/O 服务模型 黄色的框表示对象,蓝色的框表示线程。白色的框表示方法(API)
模型特点
采用阻塞IO模式获取输入的数据
每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
问题分析
当并发数很大,就会创建大量的线程,占用很大系统资源 。
连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源浪费。
Reactor模式Reactor 对应的叫法: 1. 反应器模式 2. 分发 ...
Netty概述
原生NIO存在的问题NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。
需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。
开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流 的处理等等。
JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。
Netty概述
Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
https://netty.io/
Netty官网说明
Netty 是由JBOSS提供的一个Java开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络IO程序。
Nett ...
NIO与零拷贝
零拷贝基本介绍 零拷贝是网络编程的关键,很多性能优化都离不开。
所谓零拷贝不是不拷贝,而是没有CPU拷贝。
在 Java 程序中,常用的零拷贝有mmap(内存映射)和sendFile。那么,他们在 OS 里,到底是怎么样的一个的设计?我们分析 mmap 和 sendFile 这两个零拷贝
Java 传统 IO 和 网络编程的一段代码
传统 IO 模型
DMA: direct memory access 直接内存拷贝(不使用 CPU)
传统IO经过了4次拷贝,4次切换。
mmap优化mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数。如下图
mmap优化后3次拷贝,4次切换。
sendFile优化Linux 2.1 版本 提供了sendFile函数,其基本原理如下:数据根本不经过用户态,直接从内核缓冲区进入到Socket Buffer,同时,由于和用户态完全无关,就减少了一次上下文切换
此时的拷贝次数为3.切换次数为3。但是还是存在cpy拷贝。
Linux 在 2.4 版本中,做了一些 ...
Java之NIO编程
Java NIO 简介Java NIO(New IO)是从Java 1.4版本开始引入的 一个新的IO API,可以替代标准的Java IO API。 NIO与原来的IO有同样的作用和目的,但是使用 的方式完全不同,NIO支持面向缓冲区的、基于 通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
IO
NIO
面向流(Stream Oriented)
面向缓冲区(Buffer Orientend)
阻塞IO(Blocking IO)
非阻塞IO(Non Blocking IO)
无
选择器(Selectors)
NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。
NIO和传统IO(一下简称IO)之间第一个最大的区别是,IO是面向流的,NIO是面向 ...