Mermaid绘制与学习
一个简单的例子
flowchart TD
%% 样式定义
classDef objClass fill:#e2d1f9,stroke:#9d4edd,stroke-width:2px,color:#5a189a,font-weight:bold
classDef dataClass fill:#ffccd5,stroke:#ff5d8f,stroke-width:2px,color:#c9184a,font-weight:bold
classDef netClass fill:#a7e8bd,stroke:#21ba45,stroke-width:2px,color:#2b9348,font-weight:bold
classDef adapterClass fill:#f9c74f,stroke:#f8961e,stroke-width:2px,color:#e85d04,font-weight:bold
%% 标题
title["Java消息处理流程"]
%% 发送流程 - 第一行
subgraph send["发送流程"]
direction LR
A[/"业务对象"/]
A -->|"MessageAdapter.createPacket()"| B["Protobuf字节数组"]
B -->|"NettyEncoder.encode()"| C["带长度前缀的字节数组(相当于DataPgk{Len,Data},写死在NettyEncoder中,为了简化DataPacket对象)"]
C -->|"Channel.writeAndFlush()"| D[("Netty Channel")]
end
%% 接收流程 - 第二行
subgraph receive["接收流程"]
direction LR
E[("Netty Channel")] -->|"NettyDecoder.decode()"| F["解析后的字节数组"]
F -->|"MessageHandler.handleMessage()"| G{{"消息类型识别与路由"}}
G -->|"MessageAdapter.parsePacket()"| H[/"业务对象"/]
end
%% 连接两个流程
D -.-> E
%% 确保两个流程垂直布局
send --> receive
%% 应用类样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
%% 标题样式
class title fill:none,stroke:none
相关知识解读:
flowchart TD:其中flowchart表示图表类型
图表类型
| 图表类型 | 语法关键词 | 主要用途 | 典型应用场景 |
|---|---|---|---|
| 流程图 | flowchart 或 graph | 表示工作流程、算法或过程 | 业务流程、程序逻辑、工作步骤 |
| 序列图 | sequenceDiagram | 显示对象之间交互的时间顺序 | API调用流程、用户交互流程、消息传递 |
| 类图 | classDiagram | 展示系统中的类及其关系 | 软件架构、面向对象设计 |
| 状态图 | stateDiagram | 描述对象可能的状态和转换 | 状态机、工作流状态流转 |
| 甘特图 | gantt | 项目日程安排和进度跟踪 | 项目管理、时间线规划 |
| 饼图 | pie | 显示比例关系 | 数据统计、占比分析 |
| 实体关系图 | erDiagram | 数据库设计 | 数据库模型、实体关系 |
| 用户旅程图 | journey | 用户体验映射 | 用户体验分析、业务流程优化 |
| 需求图 | requirementDiagram | 系统需求可视化 | 软件需求分析 |
| Git图 | gitGraph | Git操作和分支流程 | 版本控制、Git工作流 |
TD表示创建一个从上到下(Top-Down)方向的流程图
图表整体方向设置
| 方向关键字 | 含义 | 语法示例 | 适用场景 |
|---|---|---|---|
| TB | Top to Bottom(从上到下) | flowchart TB | 层级关系明显的流程,如组织架构 |
| TD | Top to Down(从上到下) | flowchart TD | 与TB完全相同,是另一种写法 |
| BT | Bottom to Top(从下到上) | flowchart BT | 自下而上的过程,如数据汇总 |
| RL | Right to Left(从右到左) | flowchart RL | 从结果到起因的分析流程 |
| LR | Left to Right(从左到右) | flowchart LR | 线性流程,如时间序列或数据流 |
注意,不是所有类型的图都有方向设置这个属性。以下给出具体的解释。
| 图表类型 | 支持整体方向设置 | 支持子图方向设置 | 支持的方向 | 备注 |
|---|---|---|---|---|
| flowchart/graph | ✅ | ✅ | TB, TD, BT, RL, LR | 流程图完全支持所有方向设置 |
| sequenceDiagram | ❌ | ❌ | 固定从上到下 | 序列图始终是从上到下时间顺序,不可改变 |
| classDiagram | ❌ | ❌ | 固定布局 | 类图遵循标准UML布局,不可指定方向 |
| stateDiagram | ✅ | ❌ | LR, TB | 状态图支持有限的整体方向,无子图 |
| erDiagram | ❌ | ❌ | 固定布局 | ER图遵循标准数据库模型布局 |
| gantt | ❌ | ❌ | 固定横向 | 甘特图始终横向展示时间线 |
| pie | ❌ | ❌ | 固定布局 | 饼图是固定的圆形布局 |
| requirementDiagram | ❌ | ❌ | 固定布局 | 需求图遵循固定布局规则 |
| gitGraph | ❌ | ❌ | 固定横向 | Git图显示提交历史,固定方向 |
| journey | ❌ | ❌ | 固定横向 | 用户旅程图固定横向展示 |
Mermaid图表在Markdown中的最佳显示方案
如果原图采用横向或竖向布局
横向布局
flowchart LR
%% 样式定义
classDef objClass fill:#e2d1f9,stroke:#9d4edd,stroke-width:2px,color:#5a189a,font-weight:bold
classDef dataClass fill:#ffccd5,stroke:#ff5d8f,stroke-width:2px,color:#c9184a,font-weight:bold
classDef netClass fill:#a7e8bd,stroke:#21ba45,stroke-width:2px,color:#2b9348,font-weight:bold
classDef adapterClass fill:#f9c74f,stroke:#f8961e,stroke-width:2px,color:#e85d04,font-weight:bold
%% 标题
title["Java消息处理流程"]
%% 主流程图 - 从左到右方向
A[/"发送端业务对象"/] -->|"MessageAdapter.createPacket()"| B["Protobuf字节数组"]
B -->|"NettyEncoder.encode()"| C["带长度前缀的字节数组"]
C -->|"Channel.writeAndFlush()"| D[("Netty Channel")]
D -.->|"网络传输"| E[("Netty Channel")]
E -->|"NettyDecoder.decode()"| F["解析后的字节数组"]
F -->|"MessageHandler.handleMessage()"| G{{"消息类型识别与路由"}}
G -->|"MessageAdapter.parsePacket()"| H[/"接收端业务对象"/]
%% 应用类样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
%% 标题样式
class title fill:none,stroke:none
垂直纵向布局
flowchart TB
%% 高对比度商业样式
classDef objClass fill:#d1d1e0,stroke:#2e4057,stroke-width:2px,color:#2e4057,font-weight:bold
classDef dataClass fill:#e1e5f2,stroke:#2e4057,stroke-width:2px,color:#2e4057,font-weight:bold
classDef netClass fill:#bfdbf7,stroke:#2e4057,stroke-width:2px,color:#2e4057,font-weight:bold
classDef adapterClass fill:#1f7a8c,stroke:#022b3a,stroke-width:2px,color:white,font-weight:bold
%% 紧凑垂直布局
S1[/"发送端业务对象"/] -->|"① MessageAdapter.createPacket()"| S2["Protobuf字节数组"]
S2 -->|"② NettyEncoder.encode()"| S3["带长度前缀字节数组"]
S3 -->|"③ Channel.writeAndFlush()"| S4[("Netty Channel")]
S4 -.->|"④ 网络传输"| R1[("Netty Channel")]
R1 -->|"⑤ NettyDecoder.decode()"| R2["解析后字节数组"]
R2 -->|"⑥ MessageHandler.handleMessage()"| R3{{"消息类型识别与路由"}}
R3 -->|"⑦ MessageAdapter.parsePacket()"| R4[/"接收端业务对象"/]
%% 应用样式
class S1,R4 objClass
class S2,S3,R2 dataClass
class S4,R1 netClass
class R3 adapterClass
这在markdown中显示和阅读都不方便
所以,原图采用了一种比较合适的解决方案
混合布局分组优化
flowchart TB
%% 蓝色专业风格
classDef objClass fill:#caf0f8,stroke:#0077b6,stroke-width:2px,color:#03045e,font-weight:bold
classDef dataClass fill:#90e0ef,stroke:#0077b6,stroke-width:2px,color:#03045e,font-weight:bold
classDef netClass fill:#00b4d8,stroke:#0077b6,stroke-width:2px,color:white,font-weight:bold
classDef adapterClass fill:#0077b6,stroke:#023e8a,stroke-width:2px,color:white,font-weight:bold
%% 标题
title["Java消息处理流程 - 混合布局"]
%% 分组内水平流程,整体垂直布局
subgraph Send["发送流程"]
direction LR
S1[/"业务对象"/] -->|"MessageAdapter.createPacket()"| S2["Protobuf<br>字节数组"]
S2 -->|"NettyEncoder.encode()"| S3["带长度前缀<br>的字节数组"]
S3 -->|"Channel.writeAndFlush()"| S4[("Netty<br>Channel")]
end
Send -.->|"网络传输"| Receive
subgraph Receive["接收流程"]
direction LR
R1[("Netty<br>Channel")] -->|"NettyDecoder.decode()"| R2["解析后的<br>字节数组"]
R2 -->|"MessageHandler.handleMessage()"| R3{{"消息类型<br>识别与路由"}}
R3 -->|"MessageAdapter.parsePacket()"| R4[/"业务对象"/]
end
%% 应用样式
class S1,R4 objClass
class S2,S3,R2 dataClass
class S4,R1 netClass
class R3 adapterClass
%% 标题样式
class title fill:none,stroke:none
将内容拆分为多个子图,内部采用横向布局,子图之间采用纵向布局
%% 发送流程 - 第一行 subgraph send["发送流程"] direction LR
Mermaid 子图(Subgraph)
子图基础语法
| 功能 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 基本子图 | subgraph id 节点内容 end | subgraph sg1 A --> B end | 创建基本分组,无标题 |
| 带ID和标题子图 | subgraph id [标题] 节点内容 end | subgraph process [处理流程] C --> D end | 创建带ID和显示标题的子图 |
| 带引号标题 | subgraph id ["标题"] 节点内容 end | subgraph sg2 ["复杂流程"] E --> F end | 标题中可使用特殊字符 |
| 仅标题无ID | subgraph ["标题"] 节点内容 end | subgraph ["输入处理"] G --> H end | 自动生成ID的子图 |
子图方向控制
| 方向 | 语法 | 说明 | 适用场景 |
|---|---|---|---|
| 从左到右 | subgraph id direction LR 节点内容 end | 子图内节点从左到右排列 | 线性流程,数据流向 |
| 从上到下 | subgraph id direction TB 节点内容 end | 子图内节点从上到下排列 | 层级关系,决策树 |
| 从右到左 | subgraph id direction RL 节点内容 end | 子图内节点从右到左排列 | 逆向分析流程 |
| 从下到上 | subgraph id direction BT 节点内容 end | 子图内节点从下到上排列 | 归纳汇总流程 |
子图嵌套与结构
| 功能 | 语法 | 效果 | 使用场景 |
|---|---|---|---|
| 子图嵌套 | subgraph 外层ID subgraph 内层ID 节点内容 end end | 创建层次化的嵌套分组 | 复杂系统分层展示 |
| 子图间连接 | subgraph sg1 A end subgraph sg2 B end A --> B | 不同子图中的节点相互连接 | 模块间数据流或关系 |
| 子图整体连接 | sg1 --> sg2 | 整个子图作为一个单元连接到另一个子图 | 高层次流程概览 |
| 多列子图 | 使用方向和样式控制子图并排显示 | 创建多列布局效果 | 并行流程或对比展示 |
子图交互与连接
| 连接类型 | 语法 | 示例 | 说明 | ||||
|---|---|---|---|---|---|---|---|
| 子图到子图 | 子图ID --> 子图ID | sg1 --> sg2 | 整体子图之间的连接 | ||||
| 节点到子图 | 节点ID --> 子图ID | A --> sg1 | 从外部节点到整个子图的连接 | ||||
| 子图到节点 | 子图ID --> 节点ID | sg1 --> B | 从整个子图到外部节点的连接 | ||||
| 跨子图节点连接 | 节点ID --> 节点ID | A --> B (A和B在不同子图中) | 不同子图中节点间的直接连接 | ||||
| 带文本连接 | `子图ID --> | "文本" | 子图ID` | `sg1 --> | "数据流" | sg2` | 添加连接说明的子图连接 |
高级子图技巧
| 技巧 | 实现方法 | 效果 | 应用场景 |
|---|---|---|---|
| 透明子图 | style 子图ID fill:transparent,stroke:transparent | 创建无可见边界的逻辑分组 | 保持分组而不影响视觉 |
| 强调子图 | 使用醒目的填充色和边框 | 突出显示重要流程或组件 | 重点关注区域 |
| 扁平化边框 | style 子图ID stroke-width:0 | 只有背景色的分组 | 现代简约设计 |
| 创建标签区 | 使用小型、简单内容的子图 | 为图表添加标签或注释区域 | 图表说明、图例 |
| 多彩主题 | 为不同子图使用配色方案 | 创建视觉上区分的功能区域 | 复杂系统的模块划分 |
| 隐形容器 | subgraph none[""] style none fill:none,stroke:none | 创建不可见的组织容器 | 控制布局但不显示边界 |
classDef objClass xxxxxxxx
classDef:是关键字,代表以下要定义样式类
objClass:是自定义的类名。代表以下xxxx 的名字
样式及样式应用
基本样式定义方法
| 方法 | 语法 | 示例 | 适用范围 |
|---|---|---|---|
| 内联样式 | style 节点ID 样式属性 | style A fill:#f9f,stroke:#333 | 单个节点 |
| 样式类定义 | classDef 类名 样式属性 | classDef red fill:#f00,color:white | 可重用于多个节点 |
| 默认样式 | classDef default 样式属性 | classDef default fill:#f9f9f9 | 所有未指定样式的节点 |
常用样式属性
| 类别 | 属性名 | 值示例 | 支持程度 | 说明 |
|---|---|---|---|---|
| 填充与颜色 | fill | #f9f9fa, red, rgba(0,0,0,0.1) | ✅ 完全支持 | 节点背景填充色 |
| stroke | #333, blue | ✅ 完全支持 | 节点边框颜色 | |
| color | #666, white | ✅ 完全支持 | 文本颜色 | |
| fill-opacity | 0.5, 1 | ✅ 完全支持 | 填充透明度 | |
| stroke-opacity | 0.7 | ✅ 完全支持 | 边框透明度 | |
| opacity | 0.8 | ✅ 完全支持 | 整体透明度 | |
| 边框 | stroke-width | 2px, 1.5 | ✅ 完全支持 | 边框粗细 |
| stroke-dasharray | 5 3, 10 2 | ✅ 完全支持 | 虚线边框模式 | |
| stroke-linecap | round, square | ✅ 完全支持 | 线条端点样式 | |
| stroke-linejoin | miter, round | ✅ 完全支持 | 线条连接处样式 | |
| border-radius | 4px, 50% | ✅ 完全支持 | 边角圆润度 | |
| 文本样式 | font-family | Arial, "Times New Roman" | ✅ 完全支持 | 字体 |
| font-size | 16px, 1.2em | ✅ 完全支持 | 字体大小 | |
| font-weight | bold, normal, 500 | ✅ 完全支持 | 字体粗细 | |
| font-style | italic, normal | ✅ 完全支持 | 文字样式(如斜体) | |
| text-align | center, left, right | ✅ 完全支持 | 文本对齐方式 | |
| text-anchor | middle, start, end | ⚠️ 部分支持 | SVG文本锚点 | |
| dominant-baseline | middle | ⚠️ 部分支持 | 文本基线对齐 | |
| alignment-baseline | middle | ⚠️ 部分支持 | 文本基线对齐(替代属性) | |
| letter-spacing | 1px | ⚠️ 部分支持 | 字母间距 | |
| 尺寸与间距 | width | 120px, 80% | ✅ 完全支持 | 节点宽度 |
| height | 60px | ✅ 完全支持 | 节点高度 | |
| padding | 10px, 5px 10px | ✅ 完全支持 | 内部填充间距 | |
| margin | 5px | ⚠️ 有限支持 | 外部边距(部分场景有效) | |
| rx | 5 | ✅ 完全支持 | 水平圆角半径(SVG) | |
| ry | 5 | ✅ 完全支持 | 垂直圆角半径(SVG) | |
| 位置与布局 | x | 10 | ⚠️ 有限支持 | 在某些内部元素可用 |
| y | 20 | ⚠️ 有限支持 | 在某些内部元素可用 | |
| text-indent | 5px | ⚠️ 部分支持 | 文本缩进 | |
| SVG特效 | transform | scale(1.1) | ⚠️ 有限支持 | 变换(仅部分场景支持) |
| shape-rendering | crispEdges, geometricPrecision | ✅ 完全支持 | 形状渲染方式 | |
| text-rendering | optimizeLegibility | ✅ 完全支持 | 文本渲染方式 | |
| 内置扩展 | rounded | true | ✅ 完全支持 | Mermaid特有,设置为圆角 |
| bold | true | ✅ 完全支持 | Mermaid特有,设置为粗体 | |
| underline | true | ⚠️ 部分支持 | Mermaid特有,文本下划线 | |
| dashed | true | ✅ 完全支持 | Mermaid特有,设置为虚线 | |
| filled | true | ✅ 完全支持 | Mermaid特有,设置为填充 | |
| 不建议使用 | filter | blur(2px) | ❌ 几乎不支持 | SVG滤镜效果 |
| clip-path | circle(50%) | ❌ 不支持 | 裁剪路径 | |
| mask | url(#mask) | ❌ 不支持 | 蒙版效果 | |
| animation | fadeIn 1s | ❌ 不支持 | 动画属性 |
Mermaid样式中的大部分属性(如fill、stroke、color、font-weight等)直接对应于SVG/CSS中的同名属性。
底层渲染机制:
-
Mermaid首先将图表定义解析为内部数据结构
-
然后生成SVG或HTML元素
-
最后将样式属性应用为CSS样式
SVG与CSS结合:由于大多数Mermaid图表最终渲染为SVG,所以支持的属性也主要是SVG支持的CSS属性。
%% 应用类样式 class A,H objClass
class 节点ID,节点ID 类名
样式类应用
| 功能 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 样式类应用(单节点) | class 节点ID 类名 | class A important | 将样式应用到单个节点 |
| 样式类应用(多节点) | class 节点ID,节点ID 类名 | class A,B,C important | 将同一样式应用到多个节点 |
| 节点定义时应用 | 节点ID:::类名 | A[开始]:::important | 在定义节点的同时应用样式 |
title [标题文本]
标题设置
标题设置基础
| 功能 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 基本标题 | title [标题文本] | title [Java消息处理流程] | 在图表上方添加简单标题 |
| 使用变量 | title 节点ID | title titleNode["我的标题"] | 使用预定义节点作为标题 |
内置标题样式方法
| 方法 | 语法 | 示例 | 效果 |
|---|---|---|---|
| 标题节点样式 | style title 样式属性 | style title fill:none,stroke:none,color:#333 | 直接设置标题样式 |
| 标题样式类 | classDef titleClass 样式属性 class title titleClass | classDef titleClass fill:#f5f5f5 class title titleClass | 使用样式类定义标题样式 |
| 标题节点自定义 | title["标题文本"] class title 样式类 | title["项目流程"] class title myTitle | 定义标题节点并应用样式 |
具体节点与内容
节点ID与引用
| 功能 | 语法 | 示例 | 说明 |
|---|---|---|---|
| 基本ID | id[文本] | A[开始] | 使用字母作为简单ID |
| 数字ID | 数字id[文本] | 1[第一步] | 使用数字作为ID |
| 复合ID | 复合id[文本] | start_node[开始节点] | 使用下划线连接的复合ID |
| 节点重用 | 多次使用相同ID | A[开始] ... A | 重复使用相同ID表示同一节点 |
| 连接引用 | id1-->id2 | A-->B | 通过ID创建节点间连接 |
| 节点样式引用 | style id 样式 | style A fill:red | 通过ID应用样式 |
| 样式类引用 | class id 类名 | class A important | 通过ID应用预定义样式类 |
基本节点形状
| 节点形状 | 语法 | 示例 | 适用场景 |
|---|---|---|---|
| 方形 | id[文本] | A[方形节点] | 一般处理步骤、数据 |
| 圆角矩形 | id(文本) | B(圆角节点) | 开始/结束、友好界面 |
| 体育场形 | id([文本]) | C([体育场形]) | 开始/结束、触发器 |
| 子程序形 | id[[文本]] | D[[子程序]] | 函数、子流程 |
| 圆柱形 | id[(文本)] | E[(数据库)] | 数据库、永久存储 |
| 圆形 | id((文本)) | F((圆形)) | 连接点、事件 |
| 非对称形 | id>文本] | G>非对称] | 输入/输出、数据流 |
| 菱形 | id{文本} | H{判断} | 条件判断、决策点 |
| 六边形 | id{{文本}} | I{{预处理}} | 预处理、准备步骤 |
| 平行四边形 | id[/文本/] | J[/输入/] | 输入、数据录入 |
| 反向平行四边形 | id[\文本\] | K[\输出\] | 输出、结果展示 |
| 梯形 | id[/文本\] | L[/梯形\] | 手动操作、物理过程 |
| 反向梯形 | id[\文本/] | M[\反向梯形/] | 数据汇总、合并 |
节点间连接类型
| 连接类型 | 语法 | 示例 | 外观 | ||||
|---|---|---|---|---|---|---|---|
| 带箭头实线 | --> | A-->B | 有方向的实线 | ||||
| 无箭头实线 | --- | A---B | 无方向的实线 | ||||
| 带箭头虚线 | -.-> | A-.->B | 有方向的虚线 | ||||
| 无箭头虚线 | -.- | A-.-B | 无方向的虚线 | ||||
| 粗实线带箭头 | ==> | A==>B | 有方向的粗实线 | ||||
| 粗实线无箭头 | === | A===B | 无方向的粗实线 | ||||
| 带文本连接 | `--> | "文本" | ` | `A--> | "处理" | B` | 添加说明文字的连接 |
| 多段线 | 使用多个连接 | A-->C-->B | 经过多个节点的路径 |
节点文本内容格式化
| 格式特性 | 语法 | 示例 | 效果 |
|---|---|---|---|
| 多行文本 | 使用<br>标签 | A[第一行<br>第二行] | 在节点内显示多行文本 |
| 文本加粗 | 使用**文本** | B[普通文本**粗体文本**] | 部分文本加粗显示 |
| 斜体文本 | 使用*文本* | C[普通文本*斜体文本*] | 部分文本斜体显示 |
| 特殊字符 | 直接使用或转义 | D["特殊符号: &, #, (等"] | 在引号内使用特殊字符 |
| 使用表情符号 | 直接使用emoji | E[👍 成功] | 在文本中添加表情符号 |
| HTML标签 | 在双引号内使用 | F["<b>HTML</b>标签"] | 有限支持HTML格式化 |
| 使用空格 | 在文本中直接使用 | G[多个 空格] | 保留文本中的空格 |
实践,另一个复杂例子
graph LR
subgraph os
app -- ListenTCP --> conn
conn -- go func: accpet --> map_fd_conn
conn -- go func: accpet --> map_fd_conn
conn -- go func: accpet --> map_fd_conn
end
subgraph RPC_Server
map_fd_conn -- push --> channel_fd_fd_fd_fd
end
subgraph Work_Pool
channel_fd_fd_fd_fd -- mapping --> go_func_sub_accpect
channel_fd_fd_fd_fd -- mapping --> go_func_wati
go_func_sub_accpect -- fd --> epoller
go_func_wati -- conn --> ...
endpoint_fd -- rpc --> work_pool
work_pool -- conn_create_cancel --> ...
end
flowchart LR
%% 定义主题配色与样式
classDef osNodeClass fill:#d0f4de,stroke:#0b6e4f,stroke-width:2px,color:#0b6e4f,font-weight:bold,rounded
classDef rpcNodeClass fill:#e9c46a,stroke:#e76f51,stroke-width:2px,color:#e76f51,font-weight:bold,rounded
classDef workNodeClass fill:#caf0f8,stroke:#0077b6,stroke-width:2px,color:#03045e,font-weight:bold,rounded
classDef connectionClass stroke:#6c757d,stroke-width:2px,color:#495057
%% 子图样式
classDef osClass fill:#f1faee,stroke:#2a9d8f,stroke-width:3px,color:#264653,font-weight:bold
classDef rpcClass fill:#fff1e6,stroke:#f4a261,stroke-width:3px,color:#e76f51,font-weight:bold
classDef workClass fill:#f0f6ff,stroke:#457b9d,stroke-width:3px,color:#1d3557,font-weight:bold
%% 标题
title["Go网络服务架构流程图"]
style title fill:none,stroke:none,color:#264653,font-size:18px,font-weight:bold
%% 操作系统层
subgraph OS["操作系统网络处理层"]
direction TB
APP["应用程序<br>🖥️"] -->|"① 监听TCP端口<br>ListenTCP()"| CONN["网络连接管理器<br>🔌"]
CONN -->|"② 创建goroutine<br>处理新连接<br>go func: accept()"| MAP_FD["文件描述符映射表<br>map[fd]conn<br>📋"]
CONN -->|"② 创建goroutine<br>处理新连接<br>go func: accept()"| MAP_FD
CONN -->|"② 创建goroutine<br>处理新连接<br>go func: accept()"| MAP_FD
end
%% RPC服务层
subgraph RPC["RPC服务层"]
MAP_FD -->|"③ 推送连接信息<br>push(conn)"| CHANNEL["连接通道<br>channel<br>🚇"]
end
%% 工作池层
subgraph WORK["工作池处理层"]
direction TB
CHANNEL -->|"④ 映射到处理函数<br>mapping()"| FUNC_ACCEPT["连接接收处理协程<br>go func accept()<br>🔄"]
CHANNEL -->|"④ 映射到处理函数<br>mapping()"| FUNC_WAIT["连接等待处理协程<br>go func wait()<br>⏱️"]
FUNC_ACCEPT -->|"⑤ 提取文件描述符<br>fd"| EPOLLER["事件轮询器<br>epoller<br>🔍"]
FUNC_WAIT -->|"⑥ 处理连接<br>conn"| DOTS1["后续处理流程<br>...<br>⚙️"]
ENDPOINT["RPC端点<br>endpoint_fd<br>📡"] -->|"⑦ 远程调用<br>rpc()"| POOL["工作池管理器<br>work_pool<br>👥"]
POOL -->|"⑧ 创建/取消连接<br>conn_create_cancel()"| DOTS2["连接生命周期管理<br>...<br>🔄"]
end
%% 应用样式到节点
class APP,CONN,MAP_FD osNodeClass
class CHANNEL rpcNodeClass
class FUNC_ACCEPT,FUNC_WAIT,EPOLLER,DOTS1,ENDPOINT,POOL,DOTS2 workNodeClass
%% 应用样式到子图
class OS osClass
class RPC rpcClass
class WORK workClass
%% 设置连接线样式
linkStyle 0,1,2,3,4,5,6,7,8,9,10 stroke-width:2px
linkStyle 0 stroke:#2a9d8f,color:#2a9d8f
linkStyle 1,2,3 stroke:#2a9d8f,color:#2a9d8f
linkStyle 4 stroke:#f4a261,color:#f4a261
linkStyle 5,6 stroke:#457b9d,color:#457b9d
linkStyle 7,8 stroke:#457b9d,color:#457b9d
linkStyle 9,10 stroke:#457b9d,color:#457b9d
美化方案展示
方案一:分组优化版
flowchart LR
%% 样式定义 - 用更现代的配色方案
classDef objClass fill:#c8b6ff,stroke:#7b2cbf,stroke-width:2px,color:#240046,font-weight:bold,rounded
classDef dataClass fill:#ffb3c6,stroke:#fe6d73,stroke-width:2px,color:#9d0208,font-weight:bold,rounded
classDef netClass fill:#b8f2e6,stroke:#3d5a80,stroke-width:2px,color:#094074,font-weight:bold,rounded
classDef adapterClass fill:#ffd166,stroke:#ef8354,stroke-width:2px,color:#bc4749,font-weight:bold,rounded
classDef groupClass fill:#fafafa,stroke:#d3d3d3,stroke-width:1px,stroke-dasharray: 5 5,color:#333333
%% 标题
title["Java消息处理流程 - 分组优化版"]
%% 分组
subgraph SenderSide["发送端"]
A[/"业务对象"/] -->|"1. createPacket()"| B["Protobuf字节数组"]
B -->|"2. encode()"| C["带长度前缀字节数组"]
C -->|"3. writeAndFlush()"| D[("Netty Channel")]
end
subgraph Network["网络传输层"]
D -.->|"4. TCP传输"| E[("Netty Channel")]
end
subgraph ReceiverSide["接收端"]
E -->|"5. decode()"| F["解析后字节数组"]
F -->|"6. handleMessage()"| G{{"消息类型路由"}}
G -->|"7. parsePacket()"| H[/"业务对象"/]
end
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
class SenderSide,ReceiverSide,Network groupClass
%% 标题样式
class title fill:none,stroke:none
方案二:渐变色主题版
flowchart LR
%% 样式定义 - 渐变色主题
classDef objClass fill:#d8f3dc,stroke:#2d6a4f,stroke-width:2px,color:#1b4332,font-weight:bold,rounded
classDef dataClass fill:#b7e4c7,stroke:#40916c,stroke-width:2px,color:#081c15,font-weight:bold,rounded
classDef netClass fill:#95d5b2,stroke:#52b788,stroke-width:2px,color:#081c15,font-weight:bold,rounded
classDef adapterClass fill:#74c69d,stroke:#74c69d,stroke-width:2px,color:#081c15,font-weight:bold,rounded
%% 节点
A[/"发送端<br>业务对象"/] -->|"处理"| B["Protobuf<br>序列化"]
B -->|"编码"| C["网络<br>数据包"]
C -->|"发送"| D[("传输<br>通道")]
D ==>|"网络传输"| E[("接收<br>通道")]
E -->|"解码"| F["网络<br>数据包"]
F -->|"路由"| G{{"消息<br>分发器"}}
G -->|"反序列化"| H[/"接收端<br>业务对象"/]
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
方案三:专业图表版
flowchart TD
%% 专业图表样式
classDef objClass fill:#4ea8de,stroke:#1a759f,stroke-width:2px,color:white,font-weight:bold
classDef dataClass fill:#b8c0ff,stroke:#7371fc,stroke-width:2px,color:#1e1b4b,font-weight:bold
classDef netClass fill:#06d6a0,stroke:#0b8a7e,stroke-width:2px,color:white,font-weight:bold
classDef adapterClass fill:#ffd60a,stroke:#ffc300,stroke-width:2px,color:#613400,font-weight:bold
classDef edgeClass color:#364fc7,stroke-width:2px
%% 标题
title["Java消息处理流程 - 专业混合布局"]
%% 发送端子图
subgraph ClientSide["客户端处理"]
direction LR
S1[/"Client<br>业务对象"/]
S2["序列化数据"]
S3["网络包"]
S4[("发送通道")]
%% 创建边并添加序号
S1 -->|"① 对象序列化"| S2
S2 -->|"② 添加包头"| S3
S3 -->|"③ 写入通道"| S4
end
%% 网络传输连接
ClientSide ==>|"④ 网络传输"| ServerSide
%% 接收端子图
subgraph ServerSide["服务端处理"]
direction LR
R1[("接收通道")]
R2["原始数据"]
R3{{"消息路由"}}
R4[/"Server<br>业务对象"/]
%% 接收端流程
R1 -->|"⑤ 解析包头"| R2
R2 -->|"⑥ 识别消息类型"| R3
R3 -->|"⑦ 对象反序列化"| R4
end
%% 应用样式
class S1,R4 objClass
class S2,S3,R2 dataClass
class S4,R1 netClass
class R3 adapterClass
linkStyle 0,1,2,3,4,5,6 stroke:#364fc7,stroke-width:2px
linkStyle 3 stroke:#ff5a5f,stroke-width:3px,stroke-dasharray: 5 5
%% 标题样式
class title fill:none,stroke:none
方案四:极简风格版
flowchart LR
%% 极简样式定义
classDef default fill:#f9f9f9,stroke:#666,stroke-width:1px,color:#333
classDef objClass fill:#f8f9fa,stroke:#4361ee,stroke-width:2px,color:#3a0ca3
classDef dataClass fill:#f8f9fa,stroke:#4895ef,stroke-width:2px,color:#4361ee
classDef netClass fill:#f8f9fa,stroke:#4cc9f0,stroke-width:2px,color:#4895ef
classDef adapterClass fill:#f8f9fa,stroke:#560bad,stroke-width:2px,color:#7209b7
%% 简化节点
A(["业务对象"]) --> B(["序列化数据"])
B --> C(["网络数据包"])
C --> D(["网络传输"])
D -.-> E(["网络接收"])
E --> F(["原始数据"])
F --> G(["路由分发"])
G --> H(["业务对象"])
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
方案五:深色主题版
flowchart TD
%% 深色主题样式
classDef default fill:#2b2d42,stroke:#8d99ae,stroke-width:1px,color:#edf2f4
classDef objClass fill:#003049,stroke:#fcbf49,stroke-width:2px,color:#edf2f4,font-weight:bold
classDef dataClass fill:#1d3557,stroke:#a8dadc,stroke-width:2px,color:#f1faee,font-weight:bold
classDef netClass fill:#370617,stroke:#f48c06,stroke-width:2px,color:#ffba08,font-weight:bold
classDef adapterClass fill:#240046,stroke:#7b2cbf,stroke-width:2px,color:#c77dff,font-weight:bold
%% 背景设置
style title fill:#1d1e2c,color:#edf2f4
%% 标题
title["Java消息处理流程 - 深色混合布局"]
%% 发送端子图
subgraph Sender["发送端"]
direction LR
Client[/"Client<br>业务对象"/]
Serialize["序列化<br>数据处理"]
Packet["网络数据包<br>封装"]
SendChannel[("发送通道")]
%% 连接
Client ===>|"序列化"| Serialize
Serialize ===>|"编码"| Packet
Packet ===>|"发送"| SendChannel
end
%% 网络传输连接
Sender -.->|"网络传输"| Receiver
%% 接收端子图
subgraph Receiver["接收端"]
direction LR
RecvChannel[("接收通道")]
RawData["原始数据<br>解析"]
Router{{"消息路由<br>分发器"}}
Server[/"Server<br>业务对象"/]
%% 接收端连接
RecvChannel ===>|"接收"| RawData
RawData ===>|"识别"| Router
Router ===>|"反序列化"| Server
end
%% 应用样式
class Client,Server objClass
class Serialize,Packet,RawData dataClass
class SendChannel,RecvChannel netClass
class Router adapterClass
%% 自定义连接样式
linkStyle 0,1,2,4,5,6 stroke:#8d99ae,stroke-width:2px
linkStyle 3 stroke:#d90429,stroke-width:3px,stroke-dasharray: 5 5
方案六:立体风格版
flowchart TD
%% 立体风格样式
classDef objClass fill:#d8e2dc,stroke:#9d8189,stroke-width:4px,color:#4a4e69,font-weight:bold
classDef dataClass fill:#ffe5d9,stroke:#9d8189,stroke-width:4px,color:#4a4e69,font-weight:bold
classDef netClass fill:#ffcad4,stroke:#9d8189,stroke-width:4px,color:#4a4e69,font-weight:bold
classDef adapterClass fill:#f4acb7,stroke:#9d8189,stroke-width:4px,color:#4a4e69,font-weight:bold
classDef groupClass fill:none,stroke:#9d8189,stroke-width:2px,color:#4a4e69,stroke-dasharray: 5 5
%% 标题
title["消息处理流程 - 立体混合风格"]
%% 客户端子图
subgraph Client["客户端"]
direction LR
A[["业务<br>对象"]] -->|"序列化"| B[["协议<br>数据"]]
B -->|"编码"| C[["网络<br>包"]]
C -->|"发送"| D[("传输<br>通道")]
end
%% 网络连接
Client -.->|"网络传输"| Server
%% 服务端子图
subgraph Server["服务端"]
direction LR
E[("接收<br>通道")] -->|"解码"| F[["原始<br>数据"]]
F -->|"路由"| G[["消息<br>分发"]]
G -->|"反序列化"| H[["业务<br>对象"]]
end
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
class Client,Server groupClass
%% 标题样式
class title fill:none,stroke:none
%% 设置边框阴影效果
style A stroke-width:4px
style B stroke-width:4px
style C stroke-width:4px
style D stroke-width:4px
style E stroke-width:4px
style F stroke-width:4px
style G stroke-width:4px
style H stroke-width:4px
方案七:科技风格版
flowchart TD
%% 科技风格样式
classDef objClass fill:#0b132b,stroke:#5bc0be,stroke-width:2px,color:#5bc0be,font-weight:bold
classDef dataClass fill:#1c2541,stroke:#5bc0be,stroke-width:2px,color:#5bc0be,font-weight:bold
classDef netClass fill:#3a506b,stroke:#5bc0be,stroke-width:2px,color:#5bc0be,font-weight:bold
classDef adapterClass fill:#0b132b,stroke:#5bc0be,stroke-width:2px,color:#5bc0be,font-weight:bold
%% 标题
title["Java消息处理流程 - 科技混合风格"]
%% 发送端子图
subgraph SendGroup["发送处理"]
direction LR
A{{发送端业务对象}}
B{序列化数据}
C{网络封装}
D((发送))
%% 连接
A -- 1 --> B
B -- 2 --> C
C -- 3 --> D
end
%% 网络传输
SendGroup -. 4 网络传输 .-> ReceiveGroup
%% 接收端子图
subgraph ReceiveGroup["接收处理"]
direction LR
E((接收))
F{数据解析}
G{{消息路由}}
H{{接收端业务对象}}
%% 连接
E -- 5 --> F
F -- 6 --> G
G -- 7 --> H
end
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
%% 标题样式
class title fill:none,stroke:none,color:#5bc0be
方案八:新拟物风格结合版
flowchart TD
%% 新拟物风格样式
classDef objClass fill:#f8f9fa,stroke:#212529,stroke-width:2px,color:#212529,font-weight:bold,border-radius:10px
classDef dataClass fill:#f8f9fa,stroke:#212529,stroke-width:2px,color:#212529,font-weight:bold,border-radius:10px
classDef netClass fill:#f8f9fa,stroke:#212529,stroke-width:2px,color:#212529,font-weight:bold,border-radius:10px
classDef adapterClass fill:#f8f9fa,stroke:#212529,stroke-width:2px,color:#212529,font-weight:bold,border-radius:10px
classDef sectionClass fill:#f8f9fa,stroke:#e9ecef,stroke-width:1px,color:#212529,border-radius:4px
%% 标题和背景
title["Java消息处理流程 - 新拟物混合风格"]
%% 发送端处理
subgraph ClientSection["发送处理"]
direction LR
A["💼<br>业务对象"] --> B["📦<br>序列化"]
B --> C["📨<br>数据包"]
C --> D["📤<br>发送"]
end
%% 网络连接
ClientSection -.-> ServerSection
%% 接收端处理
subgraph ServerSection["接收处理"]
direction LR
E["📥<br>接收"] --> F["🔎<br>解析"]
F --> G["🔀<br>路由"]
G --> H["💼<br>业务对象"]
end
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
class ClientSection,ServerSection sectionClass
%% 标题样式
class title fill:none,stroke:none
%% 增强边框效果
style A stroke-width:3px
style B stroke-width:3px
style C stroke-width:3px
style D stroke-width:3px
style E stroke-width:3px
style F stroke-width:3px
style G stroke-width:3px
style H stroke-width:3px
方案九:优雅卡片风格
flowchart TD
%% 卡片风格样式
classDef default fill:#ffffff,stroke:#0077b6,stroke-width:1px,color:#023e8a
classDef objClass fill:#caf0f8,stroke:#0077b6,stroke-width:1px,color:#03045e,font-weight:bold
classDef dataClass fill:#ade8f4,stroke:#0077b6,stroke-width:1px,color:#03045e,font-weight:bold
classDef netClass fill:#90e0ef,stroke:#0077b6,stroke-width:1px,color:#03045e,font-weight:bold
classDef adapterClass fill:#48cae4,stroke:#0077b6,stroke-width:1px,color:#03045e,font-weight:bold
classDef groupClass fill:#ffffff,stroke:#0077b6,stroke-width:1px,color:#023e8a,stroke-dasharray: 5 5
%% 标题
title["Java消息处理流程 - 卡片混合风格"]
%% 客户端子图
subgraph ClientSide["发送端流程"]
direction LR
A["<div style='text-align:center'><b>业务对象</b><hr/>Client</div>"]
B["<div style='text-align:center'><b>序列化</b><hr/>Protobuf Data</div>"]
C["<div style='text-align:center'><b>网络封装</b><hr/>Network Packet</div>"]
D["<div style='text-align:center'><b>传输通道</b><hr/>Channel</div>"]
%% 连接
A --> B
B --> C
C --> D
end
%% 网络连接
ClientSide -.-> ServerSide
%% 服务端子图
subgraph ServerSide["接收端流程"]
direction LR
E["<div style='text-align:center'><b>接收通道</b><hr/>Channel</div>"]
F["<div style='text-align:center'><b>数据解析</b><hr/>Raw Data</div>"]
G["<div style='text-align:center'><b>消息路由</b><hr/>Router</div>"]
H["<div style='text-align:center'><b>业务对象</b><hr/>Server</div>"]
%% 连接
E --> F
F --> G
G --> H
end
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
class ClientSide,ServerSide groupClass
%% 标题样式
class title fill:none,stroke:none
方案十:蓝色专业图表增强版
flowchart TD
%% 渐变蓝色专业样式
classDef objClass fill:#caf0f8,stroke:#0077b6,stroke-width:2px,color:#03045e,font-weight:bold
classDef dataClass fill:#90e0ef,stroke:#0077b6,stroke-width:2px,color:#03045e,font-weight:bold
classDef netClass fill:#00b4d8,stroke:#0077b6,stroke-width:2px,color:white,font-weight:bold
classDef adapterClass fill:#0077b6,stroke:#023e8a,stroke-width:2px,color:white,font-weight:bold
%% 标题
title["Java消息处理流程 - 蓝色专业混合布局"]
%% 发送端子图
subgraph SendSide["发送端处理"]
direction LR
%% 发送端节点
S1[/"发送端业务对象"/]
S2["Protobuf字节数组"]
S3["带长度前缀的字节数组"]
S4[("Netty Channel")]
%% 发送端流程
S1 -->|"MessageAdapter.createPacket()"| S2
S2 -->|"NettyEncoder.encode()"| S3
S3 -->|"Channel.writeAndFlush()"| S4
end
%% 网络传输连接
SendSide -.->|"网络传输"| ReceiveSide
%% 接收端子图
subgraph ReceiveSide["接收端处理"]
direction LR
%% 接收端节点
R1[("Netty Channel")]
R2["解析后的字节数组"]
R3{{"消息类型识别与路由"}}
R4[/"接收端业务对象"/]
%% 接收端流程
R1 -->|"NettyDecoder.decode()"| R2
R2 -->|"MessageHandler.handleMessage()"| R3
R3 -->|"MessageAdapter.parsePacket()"| R4
end
%% 应用样式
class S1,R4 objClass
class S2,S3,R2 dataClass
class S4,R1 netClass
class R3 adapterClass
%% 设置连接线样式
linkStyle 0,1,2,4,5,6 stroke:#0077b6,stroke-width:2px
linkStyle 3 stroke:#ff4d6d,stroke-width:3px,stroke-dasharray: 5 5
%% 标题样式
class title fill:none,stroke:none
方案十一:渐变色强调专业版
flowchart TD
%% 紫色渐变专业样式
classDef objClass fill:#e0c3fc,stroke:#4c1d95,stroke-width:2px,color:#4c1d95,font-weight:bold
classDef dataClass fill:#d8bbff,stroke:#4c1d95,stroke-width:2px,color:#4c1d95,font-weight:bold
classDef netClass fill:#8e7cc3,stroke:#4c1d95,stroke-width:2px,color:white,font-weight:bold
classDef adapterClass fill:#7371fc,stroke:#4c1d95,stroke-width:2px,color:white,font-weight:bold
%% 标题
title["Java消息处理流程 - 渐变专业混合版"]
%% 发送端子图
subgraph SendPart["发送处理"]
direction LR
A[/"发送端业务对象"/]
B["Protobuf字节数组"]
C["带长度前缀的字节数组"]
D[("Netty Channel")]
%% 连接
A -->|"① MessageAdapter.createPacket()"| B
B -->|"② NettyEncoder.encode()"| C
C -->|"③ Channel.writeAndFlush()"| D
end
%% 网络传输连接
SendPart -. "④ 网络传输" .-> ReceivePart
%% 接收端子图
subgraph ReceivePart["接收处理"]
direction LR
E[("Netty Channel")]
F["解析后的字节数组"]
G{{"消息类型识别与路由"}}
H[/"接收端业务对象"/]
%% 连接
E -->|"⑤ NettyDecoder.decode()"| F
F -->|"⑥ MessageHandler.handleMessage()"| G
G -->|"⑦ MessageAdapter.parsePacket()"| H
end
%% 应用样式
class A,H objClass
class B,C,F dataClass
class D,E netClass
class G adapterClass
%% 设置连接线样式
linkStyle 0,1,2,4,5,6 stroke:#4c1d95,stroke-width:2px
linkStyle 3 stroke:#c77dff,stroke-width:3px,stroke-dasharray: 5 5
%% 标题样式
class title fill:none,stroke:none
方案十二:高对比度商业图表版
flowchart TD
%% 高对比度商业样式
classDef objClass fill:#d1d1e0,stroke:#2e4057,stroke-width:2px,color:#2e4057,font-weight:bold
classDef dataClass fill:#e1e5f2,stroke:#2e4057,stroke-width:2px,color:#2e4057,font-weight:bold
classDef netClass fill:#bfdbf7,stroke:#2e4057,stroke-width:2px,color:#2e4057,font-weight:bold
classDef adapterClass fill:#1f7a8c,stroke:#022b3a,stroke-width:2px,color:white,font-weight:bold
%% 标题
title["Java消息处理流程 - 商业图表混合版"]
%% 发送端子图
subgraph Client["客户端"]
direction LR
ClientObj[/"发送端业务对象"/]
Serial["Protobuf字节数组"]
Packet["带长度前缀的字节数组"]
SendChannel[("Netty Channel")]
%% 流程
ClientObj ====>|"MessageAdapter.createPacket()"| Serial
Serial ====>|"NettyEncoder.encode()"| Packet
Packet ====>|"Channel.writeAndFlush()"| SendChannel
end
%% 网络传输连接
Client -..->|"网络传输"| Server
%% 接收端子图
subgraph Server["服务端"]
direction LR
RecvChannel[("Netty Channel")]
RawData["解析后的字节数组"]
Router{{"消息类型识别与路由"}}
ServerObj[/"接收端业务对象"/]
%% 流程
RecvChannel ====>|"NettyDecoder.decode()"| RawData
RawData ====>|"MessageHandler.handleMessage()"| Router
Router ====>|"MessageAdapter.parsePacket()"| ServerObj
end
%% 样式应用
class ClientObj,ServerObj objClass
class Serial,Packet,RawData dataClass
class SendChannel,RecvChannel netClass
class Router adapterClass
%% 自定义连接线
linkStyle 0,1,2,4,5,6 stroke:#022b3a,stroke-width:2px
linkStyle 3 stroke:#ef476f,stroke-width:3px,stroke-dasharray: 5 5
%% 标题样式
class title fill:none,stroke:none