20240403
parent
8bd71be8de
commit
acc50a0f9c
|
|
@ -37,14 +37,26 @@
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "后端/极客时间Java实战/分布式服务容错.md",
|
"file": "后端/极客时间Java实战/分布式服务/分布式服务容错.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b0885c2694804173",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"currentTab": 2
|
"currentTab": 3
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "vertical"
|
"direction": "vertical"
|
||||||
|
|
@ -110,7 +122,7 @@
|
||||||
"state": {
|
"state": {
|
||||||
"type": "backlink",
|
"type": "backlink",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "后端/极客时间Java实战/分布式服务容错.md",
|
"file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md",
|
||||||
"collapseAll": false,
|
"collapseAll": false,
|
||||||
"extraContext": false,
|
"extraContext": false,
|
||||||
"sortOrder": "alphabetical",
|
"sortOrder": "alphabetical",
|
||||||
|
|
@ -127,7 +139,7 @@
|
||||||
"state": {
|
"state": {
|
||||||
"type": "outgoing-link",
|
"type": "outgoing-link",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "后端/极客时间Java实战/分布式服务容错.md",
|
"file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md",
|
||||||
"linksCollapsed": false,
|
"linksCollapsed": false,
|
||||||
"unlinkedCollapsed": true
|
"unlinkedCollapsed": true
|
||||||
}
|
}
|
||||||
|
|
@ -150,7 +162,7 @@
|
||||||
"state": {
|
"state": {
|
||||||
"type": "outline",
|
"type": "outline",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "后端/极客时间Java实战/分布式服务容错.md"
|
"file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -171,16 +183,20 @@
|
||||||
"command-palette:打开命令面板": false
|
"command-palette:打开命令面板": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "fcca90a4313bff23",
|
"active": "b0885c2694804173",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"后端/极客时间Java实战/Dubbo服务端与客户端通信原理.md",
|
"后端/极客时间Java实战/Netty/Netty 与 网络通信.md",
|
||||||
"后端/极客时间Java实战/分布式服务容错.md",
|
"后端/极客时间Java实战/Netty/Netty 实现IM系统.md",
|
||||||
"后端/极客时间Java实战/Dubbo提供的各种服务引用机制.md",
|
"后端/极客时间Java实战/分布式服务/Zookeeper.md",
|
||||||
"后端/极客时间Java实战/Zookeeper.md",
|
"后端/极客时间Java实战/Netty",
|
||||||
|
"后端/极客时间Java实战/分布式服务",
|
||||||
|
"后端/极客时间Java实战/分布式服务/Dubbo服务端与客户端通信原理.md",
|
||||||
|
"后端/极客时间Java实战/分布式服务/分布式服务容错.md",
|
||||||
|
"后端/极客时间Java实战/分布式服务/Dubbo提供的各种服务引用机制.md",
|
||||||
"未分类日志.md",
|
"未分类日志.md",
|
||||||
"日志检索.md",
|
"日志检索.md",
|
||||||
"后端/极客时间Java实战/Dubbo.md",
|
"后端/极客时间Java实战/分布式服务/Dubbo.md",
|
||||||
"后端/极客时间Java实战/RPC.md",
|
"后端/极客时间Java实战/分布式服务/RPC.md",
|
||||||
"后端/极客时间Java实战",
|
"后端/极客时间Java实战",
|
||||||
"VSCode 连接 云服务器.md",
|
"VSCode 连接 云服务器.md",
|
||||||
"README.md",
|
"README.md",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
### BIO
|
||||||
|
阻塞式IO的问题
|
||||||
|
- 性能问题
|
||||||
|
- 可靠性问题
|
||||||
|
- 维护性问题
|
||||||
|
|
||||||
|
从BIO到NIO
|
||||||
|
- Reactor模式
|
||||||
|
- Acceptor 只负责接收请求,具体的处理逻辑,转移给其他线程
|
||||||
|
- NIO改良:把数据的业务处理逻辑,独立到其他线程中,
|
||||||
|
|
||||||
|
## Java NIO 核心概念与交互模型
|
||||||
|
- Server
|
||||||
|
- Thread
|
||||||
|
- ==Selector==
|
||||||
|
- ==Channel==
|
||||||
|
- ==Buffer==
|
||||||
|
- 一个线程对应一个selector,一个selector对应多个Channel (连接),Selector会根据不同的事件,在不同的Channel上切换,切换到哪个Channel由时间决定
|
||||||
|
- 每个Channel都会对应一个Buffer,Buffer就是一个内存块,底层是数组
|
||||||
|
|
||||||
|
#### Java NIO的问题
|
||||||
|
- 编程模型复杂,对开发人员不友好
|
||||||
|
- 功能支持不够,简单的拆包操作都需要手动实现
|
||||||
|
- 底层基于操作系统的Epoll实现,存在线程空轮询bug
|
||||||
|
- 维护成本高,容易出现开发上的漏洞
|
||||||
|
|
||||||
|
### Netty 的解决方案
|
||||||
|
|
||||||
|
| 高效的API | 内置一组辅助类,简化开发难度 |
|
||||||
|
| ---------- | ------------------ |
|
||||||
|
| 多协议支持 | TCP、UDP等 |
|
||||||
|
| 内置编解码 | Java 序列化、ProtoBuf等 |
|
||||||
|
| Listener机制 | 异步操作即成监听回调 |
|
||||||
|
| 管道-过滤器 | 可插拔,高扩展架构 |
|
||||||
|
|
||||||
|
## Netty 的逻辑架构
|
||||||
|
- 服务编排层
|
||||||
|
负责组装各类服务,是Netty的核心处理链,用以实现网络事件的动态编排和有序传播
|
||||||
|
- ChannelHandlerContext
|
||||||
|
- ChannelHandler
|
||||||
|
- ChannelPipeline : 数据传输通道
|
||||||
|
- 事件调度层
|
||||||
|
通过Reactor模型对各类事件进行聚合处理,通过Selector主循环线程集成各种事件
|
||||||
|
- EventLoop
|
||||||
|
- 和ChannelPipeline做Read、Write 等I/O操作
|
||||||
|
- Select 事件循环
|
||||||
|
- EventLoopGroup
|
||||||
|
- 事件循环线程池
|
||||||
|
- TaskPool 定时任务线程池
|
||||||
|
- 网络通信层
|
||||||
|
执行网络I/O操作,并触发各种网络事件,这些网络事件会分发给事件调度层进行处理
|
||||||
|
- ServerBootGroup 服务端启动,初始化EventLoopGroup
|
||||||
|
- 把Channel、ServerSocketChannel 等注册到EventLoopGroup中
|
||||||
|
|
||||||
|
## Netty 的功能特性
|
||||||
|
- 编解码
|
||||||
|
- MessageToMessageCodec
|
||||||
|
- ByteToMessageCodec
|
||||||
|
- 编码解码器(Codec)
|
||||||
|
- 编码器(Encoder)
|
||||||
|
- 解码器(Decoder)
|
||||||
|
- 粘包,拆包(流式协议,数据没有边界)
|
||||||
|
- 概念
|
||||||
|
- 粘包:多个数据包在接收到的时候,是一个整体
|
||||||
|
- 拆包:一个数据包的被分成两个部分被接收到
|
||||||
|
- 分包解码器
|
||||||
|
- `FixedLengthFrameDecoder` -- 基于固定长度划分业务包
|
||||||
|
- `LengthFieldBasedFrameDecorder` -- 使用特定协议划分业务包
|
||||||
|
- `LineBasedFrameDecorder -- 基于换行符划分业务包
|
||||||
|
- `DelimiterBasedFrameDecoder` -- 使用自定义分隔符划分业务包
|
||||||
|
- 多协议
|
||||||
|
- HTTP
|
||||||
|
- FTP
|
||||||
|
- SSH
|
||||||
|
- TCP
|
||||||
|
- UDP
|
||||||
|
- 自定义协议
|
||||||
|
- 可靠性
|
||||||
|
- 超时控制
|
||||||
|
- 异步连接超时配置
|
||||||
|
- ChannelConfig
|
||||||
|
- 心跳检测
|
||||||
|
- 链路空闲状态处理起
|
||||||
|
- IdelStateHandler
|
||||||
|
- 流量整形
|
||||||
|
- 可定制的流量整形处理器
|
||||||
|
- AbstractTrafficShapingHandler
|
||||||
Loading…
Reference in New Issue