Netty网络框架
Posted jfcat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty网络框架相关的知识,希望对你有一定的参考价值。
Netty网络框架
- core functionalities
- development sta
- ck on top of the core
1. Rich Buffer Data Structure
ByteBuffer与ByteBuf 的比较
- You can define your own buffer type if necessary.
- Transparent zero copy is achieved by a built-in composite buffer type.
- A dynamic buffer type is provided out-of-the-box, whose capacity is expanded on demand, just like StringBuffer. 开箱即用,容量可扩展
- There's no need to call flip() anymore. ByteBuf自带read和write索引,不用flip切换
- It is often faster than ByteBuffer.
ByteBuffer的不足之处
JDK NIO类库中提供的java.nio.Buffer,但是由于NIO编程的复杂性,ByteBuffer的不足:
1、ByteBuffer 的API不是很丰富,很多都是要自己去封装实现一些api供自己去支持一些高级的需求。
2、ByteBuffer只有一个标识位置的position,读写的时候要手工去flip,rewind,一不小心操作,很容易搞乱导致数据错乱接收。
3、ByteBuffer 长度是固定的,不能动态扩展和收缩,很容易发生越界。
ByteBuf 支持Zero-Copy
根据 Wiki 对 Zero-copy 的定义:
"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when transmitting a file over a network.
所谓的zero-copy 可以理解为在操作数据的时候,避免内存中的数据从一块区域拷贝到另一块区域,从而提升执行性能。从OS层面来说,zero-copy通常是避免从用户态到内核态之间的数据拷贝。例如Linux提供的mmap系统调用,它可以将一段用户空间内存映射到内核空间。这样就避免了在用户态和内核态之间拷贝数据。
Netty的zero-copy与OS层面的zero-copy不一样,Netty的应用是完全在用户态的,所以这里的zero-copy更多是优化数据操作。
Netty的zero-copy体现在一下几个方面:
- Netty 提供了 CompositeByteBuf 类, 它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf, 避免了各个 ByteBuf 之间的拷贝
- 通过 wrap 操作, 我们可以将 byte[] 数组、ByteBuf、ByteBuffer等包装成一个 Netty ByteBuf 对象, 进而避免了拷贝操作.
- ByteBuf 支持 slice 操作, 因此可以将 ByteBuf 分解为多个共享同一个存储区域的 ByteBuf, 避免了内存的拷贝.
- 通过 FileRegion 包装的FileChannel.tranferTo 实现文件传输, 可以直接将文件缓冲区的数据发送到目标 Channel, 避免了传统通过循环 write 方式导致的内存拷贝问题.
Combining and Slicing ChannelBuffers
参考:
https://www.cnblogs.com/xys1228/p/6088805.html
https://netty.io/3.8/guide/#start.pojo
Universal Asynchronous I/O API
A ChannelEvent is handled by a list of ChannelHandlers in a ChannelPipeline.
Advanced Components for More Rapid Development
- Codec framework
- SSL / TLS Support
- HTTP Implementation
- WebSockets Implementation
- Google Protocol Buffer Integration
类库的视角
Channel --- socket
EventLoop -- 控制流、多线程处理、并发
ChannelFuture---异步通知
ByteToMessageDecoder 和 ReplayingDecoder --- 将字节解码为消息
MessageToMessageDecoder --- 将一种消息解码为另一种
解码器负责将一种格式转换为另外一种格式,实现了ChannelInboundhandler接口。
buffer
|_ ByteBuf
|_ ByteBufUtil
....
codec
|_ DatagramPacketDecoder
|_ DatagramPacketEncoder
....
codec-dns
|_ DatagramDnsResponseDecoder
|_ DatagramDnsResponseEncoder
...
codec-http
codec-redis
...
docker
handler
|_address
|_ flow
|_ flush
|_ ipfliter
|_ logging
|_ ssl
|_ stream
|_ timeout
|_ traffic
...
transport
|_ bootstrap
|_ channel
transport-native-epoll
|_ Epoll
|_ EpollSocketChannel
|_ EpollServerSocketChannel
框架的视角
异步和事件驱动保证高负载应用程序的性能的最大化和可伸缩性。
可测试性、模块化和代码可重用性
以上是关于Netty网络框架的主要内容,如果未能解决你的问题,请参考以下文章
Day858.高性能网络应用框架Netty -Java 并发编程实战