Netty核心技术
2024-08-24 21:27:59 0 举报
AI智能生成
Netty核心技术
作者其他创作
大纲/内容
https://netty.io/
Netty核心技术
应用场景: BIO适用于font color=\"#ff0000\
BIO--同步并阻塞(传统阻塞型)
应用场景: NIO适用于font color=\"#ff0000\
NIO--同步非阻塞
应用场景: AIO适用于font color=\"#ff0000\
AIO--异步非阻塞(了解)
Java 支持三种网络编程模式I/O
server
telnet 127.0.0.1 端口
ctrl +] 进入命令行模式 send xx
可以在控制面板->程序->打开或关闭window->勾选 telnet client
client
BIO(Block IO)源代码
read() 从通道读取数据并放入到缓冲区
write() 把缓存区的数据写入到通道中
transferFrom() 从目标通道中复制数据到当前通道
transferTo() 把数据从当前通道复制给目标通道
FileChannel 主要用于对本地文件进行IO操作
代码展示
Channel (通道)
标记
mark
position
limit
capacity
Buffer 类定义了所有缓冲区都具有的四个属性来提供关于其所包含的数据元素的信息
Buffer (缓冲区)
Buffer 和 Channel 注意事项和细节
open() 得到一个选择器对象
font color=\"#ff0000\
selectedKeys() 返回此选择器的选定键集
font color=\"#ff00ff\
wakeup() 唤醒selector
keys() 返回此选择器的键集
java.nio.channels.Selector
NIOServer
NIOClient
Selector (选择器)
OP_READ = 1 << 0 读(1)
OP_WRITE = 1 << 2 写(4)
OP_CONNECT = 1 << 3 连接(8)
OP_ACCEPT = 1 << 4 接受(16)
selector() 得到与之关联的selector 对象
channel() 得到与之关联的通道
attachment() 得到与之关联的共享数据
interestOps(x) 设置或改变监听事件
SelectionKey 表示Selector 和网络通道的注册关系
open() 得到一个 ServerSocketChannel 通道
bind(x) 设置服务器端口号
register() 注册一个选择器并设置监听事件
ServerSocketChannel 在服务器监听新的客户端 socket连接
open() 得到一个socketChannel 通道
connect(x) 连接服务器
write(x) 向通道写入数据
read(x) 从通道读数据
close() 关闭通道
SocketChannel font color=\"#ff0000\
NIO(New IO)
要求
服务端
客户端
NIO群聊系统
BIO编程
基本介绍
mmap优化
sendFile 优化
mmap 和 sendFile 区别
零拷贝服务器
零拷贝客户端
NIO与零拷贝
为什么有了NIO之后还会有Netty
概述
Netty 对JDK自带的NIO的api进行了封装解决了一下问题
优点
应用场景
Netty概述
采用阻塞IO模式获取输入的数据
特点
问题
传统阻塞I/O服务模型
说明
Reatcor 核心组成
Reactor (感应器/分发者/通知者)模式
单Reactor单线程
单Reactor 多线程
主从Reactor 多线程
NettyServer
NettyServerHandler
NettyClient
NettyClientHandler
线程模型基本介绍
Netty高性能架构设计
Netty --TaskQueue自定义任务
isDone() 判断当前操作是否完成
isSuccess() 判断已完成的当前操作是否成功
getCause() 获取已完成的当前操作失败的原因
isCancelled() 判断已完成的当前操作是否被取消
常用api
Future -Listener机制
HttpServer
HtppServerHandler
快速入门实例-Http服务
Netty -- 异步模型
ServerBootstrap : 是服务端启动引导类
常见api说明
channel() 返回当前正在进行IO操作的通道
sync() 等待异步操作执行完毕
Channel
Selector
ChannelHandler
addFirst() 把一个业务处理类(Handler)添加到链中的第一个位置
addLast() 把一个业务员处理类(Handler) 添加到链中的最后一个位置
常见api
ChannelPipeline 是一个重点
Netty--核心组件
flush() 刷新
writeAndFlush() 将数据写入 channelPipeline 当中并刷新当前通道
ChannleHandlerContext
ChannelOption.SO_BACKLOG
一直保持连接活动的状态
ChannelOption.SO_KEEPALIVE
ChannelOption
NioEventLoopGroup() 构造方法
EventLoopGroup
Netty提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类
Unpooled
Netty -- EventLoop组件
服务端处理器
客户端处理器
Netty-- 群聊应用实例
服务器
服务器处理器
Netty -- 心跳监测机制
要求
长连接服务器
长连接handler
hello.html
Netty -- 通过WebSocket 实现服务器和客户端长连接
codec(编解码器) 的组成部分由两个 : decoder(解码器) 负责把字节码数据转换成业务数据 和 encoder (编码器) 负责将业务数据转换成字节码数据
编码和解码的基本介绍
StringEncoder : 对字符串数据进行编码
ObjectEncoder 对java 对象进行编码
Netty提供的编码器
StringDecoder 对字符串进行解码
ObjectDecoder 对java对象进行解码
Netty 提供的解码器
Netty 自身编解码的机制和问题分析
Protobuf 基本介绍
引入 pom
student.proto
UserInfo.proto
下载 protoc.exe
protoc.exe --java_out . student.proto
Protobuf 使用
NettyCoderServer
NettyCoderServerHandler
Netty -- Google Protobuf(谷歌协议)
编码解码器
总结
Netty -- 编解码器和Handler的调用机制
1). pom.xml
Netty -- 整合Log4j
服务端handler
客户端handler
代码问题产生
解决方案
服务器handler
Decoder
Encoder
TCP 沾包和拆包及解决方案
前提说明
children 的类型是 EventExecutor 所以可以放入NioEventLoop
查找到 doBind(xx)方法
channel = channelFactory.newChannel();
init(channel);
initAndRegister();
NioServerSocketChannel 类的 doBind 方法
doBind0();
Netty启动源码说明
服务器启动肯定是要接收客户端请求并返回客户端想要的信息
processSelectedKeys()
processSelectedKeysOptimized()
AbstractNioMessageChannel 类的 read()
ServerBootstrap 类的 channelRead方法
接收请求 -> 创建一个新的NioSocketChannel -> 注册到一个work EventLoop上 -> 注册到 selector Read 事件上
Netty 接收请求过程源码梳理
接收请求过程源码剖析
三者关系
协议解码器--将二进制数据转为java对象
协议编码器--将java对象转为二进制数据
业务处理程序 --执行实例业务逻辑
ChannelPipeline
handlerAdded() 当把ChannelHandler 添加到 pipeline 时被调用
handlerRemoved() 当从pipeline 中移除使用
exceptionCaught() 当处理过程中发生异常时调用
ChannelHandlerContent
DefaultChannelPipeline(Channel channel)
ChannelPipeline | ChannelHandler | ChannelHandlerContent 创建过程
ChannelPipeline 调度 Channelhandler 的源码剖析
pipeline 与 Handler 和 HandlerContent创建源码剖析
目的
idStateHandler
ReadTimeoutHandler
WriteTimeoutHandler
Netty 提供了 font color=\"#ff0000\
private final boolean font color=\"#ff00ff\
private final long font color=\"#ff00ff\
重要属性
initialize(ChannelHandlerContext ctx)
ReaderIdleTimeoutTask
WriterIdleTimeoutTask
AllIdleTimeoutTask
IdleStateHandler
Netty心跳(hearbeat)服务源码剖析
font color=\"#1b5e20\
EventLoop 源码剖析
这两种方式比较
目的
handler 中加入线程池和 Context 中添加线程池的源码剖析
Netty --核心源码剖析
需求说明
netty服务端
netty服务端handler
netty客户端
netty客户端handler
服务接口
接口实现类
使用 Netty编写 dubbo RPC(基于Netty)
Netty -- RPC(remote procedure call)远程过程调用
0 条评论
回复 删除
下一页