diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 3fd7bf0..51d01a4 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -37,14 +37,26 @@ "state": { "type": "markdown", "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", "source": false } } } ], - "currentTab": 2 + "currentTab": 3 } ], "direction": "vertical" @@ -110,7 +122,7 @@ "state": { "type": "backlink", "state": { - "file": "后端/极客时间Java实战/分布式服务容错.md", + "file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -127,7 +139,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "后端/极客时间Java实战/分布式服务容错.md", + "file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -150,7 +162,7 @@ "state": { "type": "outline", "state": { - "file": "后端/极客时间Java实战/分布式服务容错.md" + "file": "后端/极客时间Java实战/Netty/Netty 实现IM系统.md" } } } @@ -171,16 +183,20 @@ "command-palette:打开命令面板": false } }, - "active": "fcca90a4313bff23", + "active": "b0885c2694804173", "lastOpenFiles": [ - "后端/极客时间Java实战/Dubbo服务端与客户端通信原理.md", - "后端/极客时间Java实战/分布式服务容错.md", - "后端/极客时间Java实战/Dubbo提供的各种服务引用机制.md", - "后端/极客时间Java实战/Zookeeper.md", + "后端/极客时间Java实战/Netty/Netty 与 网络通信.md", + "后端/极客时间Java实战/Netty/Netty 实现IM系统.md", + "后端/极客时间Java实战/分布式服务/Zookeeper.md", + "后端/极客时间Java实战/Netty", + "后端/极客时间Java实战/分布式服务", + "后端/极客时间Java实战/分布式服务/Dubbo服务端与客户端通信原理.md", + "后端/极客时间Java实战/分布式服务/分布式服务容错.md", + "后端/极客时间Java实战/分布式服务/Dubbo提供的各种服务引用机制.md", "未分类日志.md", "日志检索.md", - "后端/极客时间Java实战/Dubbo.md", - "后端/极客时间Java实战/RPC.md", + "后端/极客时间Java实战/分布式服务/Dubbo.md", + "后端/极客时间Java实战/分布式服务/RPC.md", "后端/极客时间Java实战", "VSCode 连接 云服务器.md", "README.md", diff --git a/后端/极客时间Java实战/Netty/Netty 与 网络通信.md b/后端/极客时间Java实战/Netty/Netty 与 网络通信.md new file mode 100644 index 0000000..c22d1bf --- /dev/null +++ b/后端/极客时间Java实战/Netty/Netty 与 网络通信.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 diff --git a/后端/极客时间Java实战/Netty/Netty 实现IM系统.md b/后端/极客时间Java实战/Netty/Netty 实现IM系统.md new file mode 100644 index 0000000..e69de29 diff --git a/后端/极客时间Java实战/Dubbo.md b/后端/极客时间Java实战/分布式服务/Dubbo.md similarity index 100% rename from 后端/极客时间Java实战/Dubbo.md rename to 后端/极客时间Java实战/分布式服务/Dubbo.md diff --git a/后端/极客时间Java实战/Dubbo提供的各种服务引用机制.md b/后端/极客时间Java实战/分布式服务/Dubbo提供的各种服务引用机制.md similarity index 100% rename from 后端/极客时间Java实战/Dubbo提供的各种服务引用机制.md rename to 后端/极客时间Java实战/分布式服务/Dubbo提供的各种服务引用机制.md diff --git a/后端/极客时间Java实战/Dubbo服务端与客户端通信原理.md b/后端/极客时间Java实战/分布式服务/Dubbo服务端与客户端通信原理.md similarity index 100% rename from 后端/极客时间Java实战/Dubbo服务端与客户端通信原理.md rename to 后端/极客时间Java实战/分布式服务/Dubbo服务端与客户端通信原理.md diff --git a/后端/极客时间Java实战/RPC.md b/后端/极客时间Java实战/分布式服务/RPC.md similarity index 100% rename from 后端/极客时间Java实战/RPC.md rename to 后端/极客时间Java实战/分布式服务/RPC.md diff --git a/后端/极客时间Java实战/Zookeeper.md b/后端/极客时间Java实战/分布式服务/Zookeeper.md similarity index 100% rename from 后端/极客时间Java实战/Zookeeper.md rename to 后端/极客时间Java实战/分布式服务/Zookeeper.md diff --git a/后端/极客时间Java实战/分布式服务容错.md b/后端/极客时间Java实战/分布式服务/分布式服务容错.md similarity index 100% rename from 后端/极客时间Java实战/分布式服务容错.md rename to 后端/极客时间Java实战/分布式服务/分布式服务容错.md