后端之路:微服务基础
本篇详细介绍微服务架构的核心概念、拆分原则、服务化架构、以及微服务与单体架构的对比。
1. 微服务概述
单体架构 vs 微服务架构
#mermaid-svg-JgauvprTbSDJa4VT{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JgauvprTbSDJa4VT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JgauvprTbSDJa4VT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JgauvprTbSDJa4VT .error-icon{fill:#552222;}#mermaid-svg-JgauvprTbSDJa4VT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JgauvprTbSDJa4VT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JgauvprTbSDJa4VT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JgauvprTbSDJa4VT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JgauvprTbSDJa4VT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JgauvprTbSDJa4VT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JgauvprTbSDJa4VT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JgauvprTbSDJa4VT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JgauvprTbSDJa4VT .marker.cross{stroke:#333333;}#mermaid-svg-JgauvprTbSDJa4VT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JgauvprTbSDJa4VT p{margin:0;}#mermaid-svg-JgauvprTbSDJa4VT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JgauvprTbSDJa4VT .cluster-label text{fill:#333;}#mermaid-svg-JgauvprTbSDJa4VT .cluster-label span{color:#333;}#mermaid-svg-JgauvprTbSDJa4VT .cluster-label span p{background-color:transparent;}#mermaid-svg-JgauvprTbSDJa4VT .label text,#mermaid-svg-JgauvprTbSDJa4VT span{fill:#333;color:#333;}#mermaid-svg-JgauvprTbSDJa4VT .node rect,#mermaid-svg-JgauvprTbSDJa4VT .node circle,#mermaid-svg-JgauvprTbSDJa4VT .node ellipse,#mermaid-svg-JgauvprTbSDJa4VT .node polygon,#mermaid-svg-JgauvprTbSDJa4VT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JgauvprTbSDJa4VT .rough-node .label text,#mermaid-svg-JgauvprTbSDJa4VT .node .label text,#mermaid-svg-JgauvprTbSDJa4VT .image-shape .label,#mermaid-svg-JgauvprTbSDJa4VT .icon-shape .label{text-anchor:middle;}#mermaid-svg-JgauvprTbSDJa4VT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JgauvprTbSDJa4VT .rough-node .label,#mermaid-svg-JgauvprTbSDJa4VT .node .label,#mermaid-svg-JgauvprTbSDJa4VT .image-shape .label,#mermaid-svg-JgauvprTbSDJa4VT .icon-shape .label{text-align:center;}#mermaid-svg-JgauvprTbSDJa4VT .node.clickable{cursor:pointer;}#mermaid-svg-JgauvprTbSDJa4VT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JgauvprTbSDJa4VT .arrowheadPath{fill:#333333;}#mermaid-svg-JgauvprTbSDJa4VT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JgauvprTbSDJa4VT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JgauvprTbSDJa4VT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JgauvprTbSDJa4VT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JgauvprTbSDJa4VT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JgauvprTbSDJa4VT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JgauvprTbSDJa4VT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JgauvprTbSDJa4VT .cluster text{fill:#333;}#mermaid-svg-JgauvprTbSDJa4VT .cluster span{color:#333;}#mermaid-svg-JgauvprTbSDJa4VT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JgauvprTbSDJa4VT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JgauvprTbSDJa4VT rect.text{fill:none;stroke-width:0;}#mermaid-svg-JgauvprTbSDJa4VT .icon-shape,#mermaid-svg-JgauvprTbSDJa4VT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JgauvprTbSDJa4VT .icon-shape p,#mermaid-svg-JgauvprTbSDJa4VT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JgauvprTbSDJa4VT .icon-shape .label rect,#mermaid-svg-JgauvprTbSDJa4VT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JgauvprTbSDJa4VT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JgauvprTbSDJa4VT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JgauvprTbSDJa4VT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 微服务架构
用户服务
:8001
用户DB
订单服务
:8002
订单DB
商品服务
:8003
商品DB
单体架构
应用
用户模块
订单模块
商品模块
支付模块
数据库
| 特点 | 单体架构 | 微服务架构 |
|---|---|---|
| 部署 | 简单,统一部署 | 服务独立部署 |
| 扩展 | 扩展困难,整体扩展 | 独立扩展,按需伸缩 |
| 技术栈 | 技术栈统一 | 技术栈可异构 |
| 复杂度 | 简单,适合小型项目 | 复杂度高 |
| 容错 | 单点故障影响全局 | 故障隔离 |
微服务定义
| 特性 | 说明 |
|---|---|
| 单一职责 | 每个服务只负责一个业务领域 |
| 独立部署 | 服务可独立部署,不影响其他服务 |
| 进程隔离 | 每个服务运行在独立进程中 |
| 技术异构 | 服务可根据需求选择不同技术栈 |
| 去中心化 | 无统一技术标准,数据管理也去中心化 |
微服务优势与挑战
#mermaid-svg-3cYhyzNVyUpc8xFx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3cYhyzNVyUpc8xFx .error-icon{fill:#552222;}#mermaid-svg-3cYhyzNVyUpc8xFx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3cYhyzNVyUpc8xFx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3cYhyzNVyUpc8xFx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3cYhyzNVyUpc8xFx .marker.cross{stroke:#333333;}#mermaid-svg-3cYhyzNVyUpc8xFx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3cYhyzNVyUpc8xFx p{margin:0;}#mermaid-svg-3cYhyzNVyUpc8xFx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx .cluster-label text{fill:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx .cluster-label span{color:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx .cluster-label span p{background-color:transparent;}#mermaid-svg-3cYhyzNVyUpc8xFx .label text,#mermaid-svg-3cYhyzNVyUpc8xFx span{fill:#333;color:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx .node rect,#mermaid-svg-3cYhyzNVyUpc8xFx .node circle,#mermaid-svg-3cYhyzNVyUpc8xFx .node ellipse,#mermaid-svg-3cYhyzNVyUpc8xFx .node polygon,#mermaid-svg-3cYhyzNVyUpc8xFx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3cYhyzNVyUpc8xFx .rough-node .label text,#mermaid-svg-3cYhyzNVyUpc8xFx .node .label text,#mermaid-svg-3cYhyzNVyUpc8xFx .image-shape .label,#mermaid-svg-3cYhyzNVyUpc8xFx .icon-shape .label{text-anchor:middle;}#mermaid-svg-3cYhyzNVyUpc8xFx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3cYhyzNVyUpc8xFx .rough-node .label,#mermaid-svg-3cYhyzNVyUpc8xFx .node .label,#mermaid-svg-3cYhyzNVyUpc8xFx .image-shape .label,#mermaid-svg-3cYhyzNVyUpc8xFx .icon-shape .label{text-align:center;}#mermaid-svg-3cYhyzNVyUpc8xFx .node.clickable{cursor:pointer;}#mermaid-svg-3cYhyzNVyUpc8xFx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3cYhyzNVyUpc8xFx .arrowheadPath{fill:#333333;}#mermaid-svg-3cYhyzNVyUpc8xFx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3cYhyzNVyUpc8xFx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3cYhyzNVyUpc8xFx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3cYhyzNVyUpc8xFx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3cYhyzNVyUpc8xFx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3cYhyzNVyUpc8xFx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3cYhyzNVyUpc8xFx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3cYhyzNVyUpc8xFx .cluster text{fill:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx .cluster span{color:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3cYhyzNVyUpc8xFx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3cYhyzNVyUpc8xFx rect.text{fill:none;stroke-width:0;}#mermaid-svg-3cYhyzNVyUpc8xFx .icon-shape,#mermaid-svg-3cYhyzNVyUpc8xFx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3cYhyzNVyUpc8xFx .icon-shape p,#mermaid-svg-3cYhyzNVyUpc8xFx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3cYhyzNVyUpc8xFx .icon-shape .label rect,#mermaid-svg-3cYhyzNVyUpc8xFx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3cYhyzNVyUpc8xFx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3cYhyzNVyUpc8xFx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3cYhyzNVyUpc8xFx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 挑战
分布式复杂性
网络延迟 / 分布式事务 / 故障处理
服务治理
服务发现 / 负载均衡 / 限流熔断
数据一致性
CAP 理论 / 最终一致性
运维复杂度
监控告警 / 日志聚合 / 部署管理
优势
独立部署
加快交付 / 减少风险 / 独立回滚
独立扩展
按需扩展 / 节省成本
技术异构
新技术试点 / 针对性选型
容错隔离
单服务故障不影响全局
微服务适用场景决策
#mermaid-svg-TDt9tb37rGUK9GZK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TDt9tb37rGUK9GZK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TDt9tb37rGUK9GZK .error-icon{fill:#552222;}#mermaid-svg-TDt9tb37rGUK9GZK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TDt9tb37rGUK9GZK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TDt9tb37rGUK9GZK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TDt9tb37rGUK9GZK .marker.cross{stroke:#333333;}#mermaid-svg-TDt9tb37rGUK9GZK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TDt9tb37rGUK9GZK p{margin:0;}#mermaid-svg-TDt9tb37rGUK9GZK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TDt9tb37rGUK9GZK .cluster-label text{fill:#333;}#mermaid-svg-TDt9tb37rGUK9GZK .cluster-label span{color:#333;}#mermaid-svg-TDt9tb37rGUK9GZK .cluster-label span p{background-color:transparent;}#mermaid-svg-TDt9tb37rGUK9GZK .label text,#mermaid-svg-TDt9tb37rGUK9GZK span{fill:#333;color:#333;}#mermaid-svg-TDt9tb37rGUK9GZK .node rect,#mermaid-svg-TDt9tb37rGUK9GZK .node circle,#mermaid-svg-TDt9tb37rGUK9GZK .node ellipse,#mermaid-svg-TDt9tb37rGUK9GZK .node polygon,#mermaid-svg-TDt9tb37rGUK9GZK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TDt9tb37rGUK9GZK .rough-node .label text,#mermaid-svg-TDt9tb37rGUK9GZK .node .label text,#mermaid-svg-TDt9tb37rGUK9GZK .image-shape .label,#mermaid-svg-TDt9tb37rGUK9GZK .icon-shape .label{text-anchor:middle;}#mermaid-svg-TDt9tb37rGUK9GZK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TDt9tb37rGUK9GZK .rough-node .label,#mermaid-svg-TDt9tb37rGUK9GZK .node .label,#mermaid-svg-TDt9tb37rGUK9GZK .image-shape .label,#mermaid-svg-TDt9tb37rGUK9GZK .icon-shape .label{text-align:center;}#mermaid-svg-TDt9tb37rGUK9GZK .node.clickable{cursor:pointer;}#mermaid-svg-TDt9tb37rGUK9GZK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TDt9tb37rGUK9GZK .arrowheadPath{fill:#333333;}#mermaid-svg-TDt9tb37rGUK9GZK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TDt9tb37rGUK9GZK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TDt9tb37rGUK9GZK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TDt9tb37rGUK9GZK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TDt9tb37rGUK9GZK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TDt9tb37rGUK9GZK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TDt9tb37rGUK9GZK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TDt9tb37rGUK9GZK .cluster text{fill:#333;}#mermaid-svg-TDt9tb37rGUK9GZK .cluster span{color:#333;}#mermaid-svg-TDt9tb37rGUK9GZK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TDt9tb37rGUK9GZK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TDt9tb37rGUK9GZK rect.text{fill:none;stroke-width:0;}#mermaid-svg-TDt9tb37rGUK9GZK .icon-shape,#mermaid-svg-TDt9tb37rGUK9GZK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TDt9tb37rGUK9GZK .icon-shape p,#mermaid-svg-TDt9tb37rGUK9GZK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TDt9tb37rGUK9GZK .icon-shape .label rect,#mermaid-svg-TDt9tb37rGUK9GZK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TDt9tb37rGUK9GZK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TDt9tb37rGUK9GZK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TDt9tb37rGUK9GZK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
否
是
否
是
开始:是否需要微服务?
团队规模 > 10人?
推荐单体架构
快速迭代
业务复杂度高?
多业务域
需要独立扩展?
SOA 架构
服务化但共享数据库
技术栈需要异构?
微服务架构
2. 微服务拆分
拆分原则
#mermaid-svg-PmtzNlDJqPgybMZ7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PmtzNlDJqPgybMZ7 .error-icon{fill:#552222;}#mermaid-svg-PmtzNlDJqPgybMZ7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PmtzNlDJqPgybMZ7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .marker.cross{stroke:#333333;}#mermaid-svg-PmtzNlDJqPgybMZ7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PmtzNlDJqPgybMZ7 p{margin:0;}#mermaid-svg-PmtzNlDJqPgybMZ7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .cluster-label text{fill:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .cluster-label span{color:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .cluster-label span p{background-color:transparent;}#mermaid-svg-PmtzNlDJqPgybMZ7 .label text,#mermaid-svg-PmtzNlDJqPgybMZ7 span{fill:#333;color:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .node rect,#mermaid-svg-PmtzNlDJqPgybMZ7 .node circle,#mermaid-svg-PmtzNlDJqPgybMZ7 .node ellipse,#mermaid-svg-PmtzNlDJqPgybMZ7 .node polygon,#mermaid-svg-PmtzNlDJqPgybMZ7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .rough-node .label text,#mermaid-svg-PmtzNlDJqPgybMZ7 .node .label text,#mermaid-svg-PmtzNlDJqPgybMZ7 .image-shape .label,#mermaid-svg-PmtzNlDJqPgybMZ7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-PmtzNlDJqPgybMZ7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .rough-node .label,#mermaid-svg-PmtzNlDJqPgybMZ7 .node .label,#mermaid-svg-PmtzNlDJqPgybMZ7 .image-shape .label,#mermaid-svg-PmtzNlDJqPgybMZ7 .icon-shape .label{text-align:center;}#mermaid-svg-PmtzNlDJqPgybMZ7 .node.clickable{cursor:pointer;}#mermaid-svg-PmtzNlDJqPgybMZ7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .arrowheadPath{fill:#333333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PmtzNlDJqPgybMZ7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PmtzNlDJqPgybMZ7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PmtzNlDJqPgybMZ7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PmtzNlDJqPgybMZ7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .cluster text{fill:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 .cluster span{color:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PmtzNlDJqPgybMZ7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PmtzNlDJqPgybMZ7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-PmtzNlDJqPgybMZ7 .icon-shape,#mermaid-svg-PmtzNlDJqPgybMZ7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PmtzNlDJqPgybMZ7 .icon-shape p,#mermaid-svg-PmtzNlDJqPgybMZ7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PmtzNlDJqPgybMZ7 .icon-shape .label rect,#mermaid-svg-PmtzNlDJqPgybMZ7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PmtzNlDJqPgybMZ7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PmtzNlDJqPgybMZ7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PmtzNlDJqPgybMZ7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 高内聚低耦合
同业务域放一起,跨域调用最小化
2. 单一职责原则
每个服务只负责一块业务能力
3. 独立数据管理
每个服务有自己的数据库
4. 演进式拆分
从单体开始,逐步拆分
5. 康威定律
组织结构决定系统结构
拆分维度
| 拆分维度 | 说明 | 示例 |
|---|---|---|
| 业务维度 | 按业务领域拆分 | 用户服务、订单服务 |
| 读写维度 | 按读/写拆分 | 查询服务、写入服务 |
| 粒度维度 | 按数据量/压力拆分 | 大表拆分 |
| 团队维度 | 按团队职责拆分 | 支付中台、物流中台 |
拆分策略
yaml
# 示例:电商系统拆分
# 业务边界分析
# 用户域
microservices:
- user-service: 用户注册、登录、认证
- user-profile-service: 用户信息管理
- address-service: 收货地址管理
# 商品域
microservices:
- product-service: 商品信息管理
- price-service: 价格服务
- inventory-service: 库存服务
- category-service: 分类服务
# 订单域
microservices:
- order-service: 订单创建、查询
- order-search-service: 订单搜索
- payment-service: 支付服务
- refund-service: 退款服务
# 营销域
microservices:
- promotion-service: 促销活动
- coupon-service: 优惠券服务
- seckill-service: 秒杀服务
# 物流域
microservices:
- shipping-service: 物流服务
- tracking-service: 物流跟踪
电商系统微服务拆分架构
#mermaid-svg-N0Yt3wop876Y7aj4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N0Yt3wop876Y7aj4 .error-icon{fill:#552222;}#mermaid-svg-N0Yt3wop876Y7aj4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N0Yt3wop876Y7aj4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N0Yt3wop876Y7aj4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N0Yt3wop876Y7aj4 .marker.cross{stroke:#333333;}#mermaid-svg-N0Yt3wop876Y7aj4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N0Yt3wop876Y7aj4 p{margin:0;}#mermaid-svg-N0Yt3wop876Y7aj4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 .cluster-label text{fill:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 .cluster-label span{color:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 .cluster-label span p{background-color:transparent;}#mermaid-svg-N0Yt3wop876Y7aj4 .label text,#mermaid-svg-N0Yt3wop876Y7aj4 span{fill:#333;color:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 .node rect,#mermaid-svg-N0Yt3wop876Y7aj4 .node circle,#mermaid-svg-N0Yt3wop876Y7aj4 .node ellipse,#mermaid-svg-N0Yt3wop876Y7aj4 .node polygon,#mermaid-svg-N0Yt3wop876Y7aj4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N0Yt3wop876Y7aj4 .rough-node .label text,#mermaid-svg-N0Yt3wop876Y7aj4 .node .label text,#mermaid-svg-N0Yt3wop876Y7aj4 .image-shape .label,#mermaid-svg-N0Yt3wop876Y7aj4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-N0Yt3wop876Y7aj4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N0Yt3wop876Y7aj4 .rough-node .label,#mermaid-svg-N0Yt3wop876Y7aj4 .node .label,#mermaid-svg-N0Yt3wop876Y7aj4 .image-shape .label,#mermaid-svg-N0Yt3wop876Y7aj4 .icon-shape .label{text-align:center;}#mermaid-svg-N0Yt3wop876Y7aj4 .node.clickable{cursor:pointer;}#mermaid-svg-N0Yt3wop876Y7aj4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N0Yt3wop876Y7aj4 .arrowheadPath{fill:#333333;}#mermaid-svg-N0Yt3wop876Y7aj4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N0Yt3wop876Y7aj4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N0Yt3wop876Y7aj4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N0Yt3wop876Y7aj4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N0Yt3wop876Y7aj4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N0Yt3wop876Y7aj4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N0Yt3wop876Y7aj4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N0Yt3wop876Y7aj4 .cluster text{fill:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 .cluster span{color:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N0Yt3wop876Y7aj4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N0Yt3wop876Y7aj4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-N0Yt3wop876Y7aj4 .icon-shape,#mermaid-svg-N0Yt3wop876Y7aj4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N0Yt3wop876Y7aj4 .icon-shape p,#mermaid-svg-N0Yt3wop876Y7aj4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N0Yt3wop876Y7aj4 .icon-shape .label rect,#mermaid-svg-N0Yt3wop876Y7aj4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N0Yt3wop876Y7aj4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N0Yt3wop876Y7aj4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N0Yt3wop876Y7aj4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物流域
营销域
订单域
商品域
用户域
网关层
API Gateway
用户服务
注册/登录/认证
用户信息服务
个人信息管理
地址服务
收货地址管理
商品服务
商品信息管理
价格服务
价格管理
库存服务
库存管理
分类服务
分类管理
订单服务
订单创建/查询
订单搜索服务
订单搜索
支付服务
支付处理
退款服务
退款处理
促销服务
促销活动
优惠券服务
优惠券管理
秒杀服务
秒杀活动
物流服务
物流配送
物流跟踪服务
物流跟踪
3. 服务化架构
服务化架构演进
#mermaid-svg-ReaB7KWFb3xHIXg7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ReaB7KWFb3xHIXg7 .error-icon{fill:#552222;}#mermaid-svg-ReaB7KWFb3xHIXg7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ReaB7KWFb3xHIXg7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .marker.cross{stroke:#333333;}#mermaid-svg-ReaB7KWFb3xHIXg7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ReaB7KWFb3xHIXg7 p{margin:0;}#mermaid-svg-ReaB7KWFb3xHIXg7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .cluster-label text{fill:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .cluster-label span{color:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .cluster-label span p{background-color:transparent;}#mermaid-svg-ReaB7KWFb3xHIXg7 .label text,#mermaid-svg-ReaB7KWFb3xHIXg7 span{fill:#333;color:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .node rect,#mermaid-svg-ReaB7KWFb3xHIXg7 .node circle,#mermaid-svg-ReaB7KWFb3xHIXg7 .node ellipse,#mermaid-svg-ReaB7KWFb3xHIXg7 .node polygon,#mermaid-svg-ReaB7KWFb3xHIXg7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .rough-node .label text,#mermaid-svg-ReaB7KWFb3xHIXg7 .node .label text,#mermaid-svg-ReaB7KWFb3xHIXg7 .image-shape .label,#mermaid-svg-ReaB7KWFb3xHIXg7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-ReaB7KWFb3xHIXg7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .rough-node .label,#mermaid-svg-ReaB7KWFb3xHIXg7 .node .label,#mermaid-svg-ReaB7KWFb3xHIXg7 .image-shape .label,#mermaid-svg-ReaB7KWFb3xHIXg7 .icon-shape .label{text-align:center;}#mermaid-svg-ReaB7KWFb3xHIXg7 .node.clickable{cursor:pointer;}#mermaid-svg-ReaB7KWFb3xHIXg7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .arrowheadPath{fill:#333333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ReaB7KWFb3xHIXg7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ReaB7KWFb3xHIXg7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ReaB7KWFb3xHIXg7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ReaB7KWFb3xHIXg7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .cluster text{fill:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 .cluster span{color:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ReaB7KWFb3xHIXg7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ReaB7KWFb3xHIXg7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-ReaB7KWFb3xHIXg7 .icon-shape,#mermaid-svg-ReaB7KWFb3xHIXg7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ReaB7KWFb3xHIXg7 .icon-shape p,#mermaid-svg-ReaB7KWFb3xHIXg7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ReaB7KWFb3xHIXg7 .icon-shape .label rect,#mermaid-svg-ReaB7KWFb3xHIXg7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ReaB7KWFb3xHIXg7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ReaB7KWFb3xHIXg7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ReaB7KWFb3xHIXg7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第四阶段: 微服务 + 容器化 + DevOps
第三阶段: 服务化 SOA
第二阶段: 应用与服务分离
第一阶段: 单体应用
应用
数据库
用户应用
订单应用
商品应用
共享数据库
用户服务
:8001
用户DB
订单服务
:8002
订单DB
商品服务
:8003
商品DB
API Gateway
服务化组件
| 组件 | 功能 | 常见实现 |
|---|---|---|
| 服务注册中心 | 服务注册与发现 | Eureka, Consul, Nacos |
| 配置中心 | 集中配置管理 | Apollo, Nacos, Spring Cloud Config |
| 网关 | 统一入口,路由转发 | Spring Cloud Gateway, Kong |
| 熔断器 | 故障隔离,防止雪崩 | Hystrix, Sentinel, Resilience4j |
| 负载均衡 | 请求分发 | Ribbon, Spring Cloud LoadBalancer |
| 认证授权 | 身份认证,权限控制 | OAuth2, JWT, Spring Security |
| 分布式事务 | 跨服务事务一致性 | Seata, Saga |
| 链路追踪 | 请求链路追踪 | Zipkin, Jaeger, SkyWalking |
| 日志中心 | 日志聚合 | ELK, Loki |
| 监控中心 | 指标收集与告警 | Prometheus, Grafana |
服务调用流程
"API 网关" 注册中心 订单服务 用户服务 "API 网关" 注册中心 订单服务 用户服务 #mermaid-svg-PewQetwV0QQm4Mki{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PewQetwV0QQm4Mki .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PewQetwV0QQm4Mki .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PewQetwV0QQm4Mki .error-icon{fill:#552222;}#mermaid-svg-PewQetwV0QQm4Mki .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PewQetwV0QQm4Mki .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PewQetwV0QQm4Mki .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PewQetwV0QQm4Mki .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PewQetwV0QQm4Mki .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PewQetwV0QQm4Mki .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PewQetwV0QQm4Mki .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PewQetwV0QQm4Mki .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PewQetwV0QQm4Mki .marker.cross{stroke:#333333;}#mermaid-svg-PewQetwV0QQm4Mki svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PewQetwV0QQm4Mki p{margin:0;}#mermaid-svg-PewQetwV0QQm4Mki .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PewQetwV0QQm4Mki text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-PewQetwV0QQm4Mki .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-PewQetwV0QQm4Mki .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-PewQetwV0QQm4Mki .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-PewQetwV0QQm4Mki .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-PewQetwV0QQm4Mki #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-PewQetwV0QQm4Mki .sequenceNumber{fill:white;}#mermaid-svg-PewQetwV0QQm4Mki #sequencenumber{fill:#333;}#mermaid-svg-PewQetwV0QQm4Mki #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-PewQetwV0QQm4Mki .messageText{fill:#333;stroke:none;}#mermaid-svg-PewQetwV0QQm4Mki .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PewQetwV0QQm4Mki .labelText,#mermaid-svg-PewQetwV0QQm4Mki .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-PewQetwV0QQm4Mki .loopText,#mermaid-svg-PewQetwV0QQm4Mki .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-PewQetwV0QQm4Mki .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-PewQetwV0QQm4Mki .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-PewQetwV0QQm4Mki .noteText,#mermaid-svg-PewQetwV0QQm4Mki .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-PewQetwV0QQm4Mki .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PewQetwV0QQm4Mki .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PewQetwV0QQm4Mki .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PewQetwV0QQm4Mki .actorPopupMenu{position:absolute;}#mermaid-svg-PewQetwV0QQm4Mki .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-PewQetwV0QQm4Mki .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PewQetwV0QQm4Mki .actor-man circle,#mermaid-svg-PewQetwV0QQm4Mki line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-PewQetwV0QQm4Mki :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 服务注册 2. 服务发现 3. 请求调用 注册服务实例注册服务实例注册网关实例获取服务列表返回可用服务列表路由到订单服务发现用户服务返回用户服务地址远程调用获取用户信息返回用户数据返回订单数据返回最终结果
4. 微服务基础设施
完整微服务架构
#mermaid-svg-xn5DMUPODAqHdCPl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xn5DMUPODAqHdCPl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xn5DMUPODAqHdCPl .error-icon{fill:#552222;}#mermaid-svg-xn5DMUPODAqHdCPl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xn5DMUPODAqHdCPl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xn5DMUPODAqHdCPl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xn5DMUPODAqHdCPl .marker.cross{stroke:#333333;}#mermaid-svg-xn5DMUPODAqHdCPl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xn5DMUPODAqHdCPl p{margin:0;}#mermaid-svg-xn5DMUPODAqHdCPl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xn5DMUPODAqHdCPl .cluster-label text{fill:#333;}#mermaid-svg-xn5DMUPODAqHdCPl .cluster-label span{color:#333;}#mermaid-svg-xn5DMUPODAqHdCPl .cluster-label span p{background-color:transparent;}#mermaid-svg-xn5DMUPODAqHdCPl .label text,#mermaid-svg-xn5DMUPODAqHdCPl span{fill:#333;color:#333;}#mermaid-svg-xn5DMUPODAqHdCPl .node rect,#mermaid-svg-xn5DMUPODAqHdCPl .node circle,#mermaid-svg-xn5DMUPODAqHdCPl .node ellipse,#mermaid-svg-xn5DMUPODAqHdCPl .node polygon,#mermaid-svg-xn5DMUPODAqHdCPl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xn5DMUPODAqHdCPl .rough-node .label text,#mermaid-svg-xn5DMUPODAqHdCPl .node .label text,#mermaid-svg-xn5DMUPODAqHdCPl .image-shape .label,#mermaid-svg-xn5DMUPODAqHdCPl .icon-shape .label{text-anchor:middle;}#mermaid-svg-xn5DMUPODAqHdCPl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xn5DMUPODAqHdCPl .rough-node .label,#mermaid-svg-xn5DMUPODAqHdCPl .node .label,#mermaid-svg-xn5DMUPODAqHdCPl .image-shape .label,#mermaid-svg-xn5DMUPODAqHdCPl .icon-shape .label{text-align:center;}#mermaid-svg-xn5DMUPODAqHdCPl .node.clickable{cursor:pointer;}#mermaid-svg-xn5DMUPODAqHdCPl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xn5DMUPODAqHdCPl .arrowheadPath{fill:#333333;}#mermaid-svg-xn5DMUPODAqHdCPl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xn5DMUPODAqHdCPl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xn5DMUPODAqHdCPl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xn5DMUPODAqHdCPl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xn5DMUPODAqHdCPl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xn5DMUPODAqHdCPl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xn5DMUPODAqHdCPl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xn5DMUPODAqHdCPl .cluster text{fill:#333;}#mermaid-svg-xn5DMUPODAqHdCPl .cluster span{color:#333;}#mermaid-svg-xn5DMUPODAqHdCPl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xn5DMUPODAqHdCPl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xn5DMUPODAqHdCPl rect.text{fill:none;stroke-width:0;}#mermaid-svg-xn5DMUPODAqHdCPl .icon-shape,#mermaid-svg-xn5DMUPODAqHdCPl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xn5DMUPODAqHdCPl .icon-shape p,#mermaid-svg-xn5DMUPODAqHdCPl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xn5DMUPODAqHdCPl .icon-shape .label rect,#mermaid-svg-xn5DMUPODAqHdCPl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xn5DMUPODAqHdCPl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xn5DMUPODAqHdCPl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xn5DMUPODAqHdCPl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础设施层
外部请求
API Gateway
Spring Cloud Gateway / Kong
路由转发 / 认证授权 / 限流熔断 / 日志记录
用户服务
:8001
订单服务
:8002
商品服务
:8003
用户DB
订单DB
商品DB
Nacos
注册中心 + 配置中心
Sentinel
熔断器 / 限流
Seata
事务中心
SkyWalking
链路追踪
ELK
日志中心
Prometheus + Grafana
监控
熔断器状态机
#mermaid-svg-kuhz7bGESXmKvNxy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kuhz7bGESXmKvNxy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kuhz7bGESXmKvNxy .error-icon{fill:#552222;}#mermaid-svg-kuhz7bGESXmKvNxy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kuhz7bGESXmKvNxy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kuhz7bGESXmKvNxy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kuhz7bGESXmKvNxy .marker.cross{stroke:#333333;}#mermaid-svg-kuhz7bGESXmKvNxy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kuhz7bGESXmKvNxy p{margin:0;}#mermaid-svg-kuhz7bGESXmKvNxy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kuhz7bGESXmKvNxy .cluster-label text{fill:#333;}#mermaid-svg-kuhz7bGESXmKvNxy .cluster-label span{color:#333;}#mermaid-svg-kuhz7bGESXmKvNxy .cluster-label span p{background-color:transparent;}#mermaid-svg-kuhz7bGESXmKvNxy .label text,#mermaid-svg-kuhz7bGESXmKvNxy span{fill:#333;color:#333;}#mermaid-svg-kuhz7bGESXmKvNxy .node rect,#mermaid-svg-kuhz7bGESXmKvNxy .node circle,#mermaid-svg-kuhz7bGESXmKvNxy .node ellipse,#mermaid-svg-kuhz7bGESXmKvNxy .node polygon,#mermaid-svg-kuhz7bGESXmKvNxy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kuhz7bGESXmKvNxy .rough-node .label text,#mermaid-svg-kuhz7bGESXmKvNxy .node .label text,#mermaid-svg-kuhz7bGESXmKvNxy .image-shape .label,#mermaid-svg-kuhz7bGESXmKvNxy .icon-shape .label{text-anchor:middle;}#mermaid-svg-kuhz7bGESXmKvNxy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kuhz7bGESXmKvNxy .rough-node .label,#mermaid-svg-kuhz7bGESXmKvNxy .node .label,#mermaid-svg-kuhz7bGESXmKvNxy .image-shape .label,#mermaid-svg-kuhz7bGESXmKvNxy .icon-shape .label{text-align:center;}#mermaid-svg-kuhz7bGESXmKvNxy .node.clickable{cursor:pointer;}#mermaid-svg-kuhz7bGESXmKvNxy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kuhz7bGESXmKvNxy .arrowheadPath{fill:#333333;}#mermaid-svg-kuhz7bGESXmKvNxy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kuhz7bGESXmKvNxy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kuhz7bGESXmKvNxy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kuhz7bGESXmKvNxy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kuhz7bGESXmKvNxy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kuhz7bGESXmKvNxy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kuhz7bGESXmKvNxy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kuhz7bGESXmKvNxy .cluster text{fill:#333;}#mermaid-svg-kuhz7bGESXmKvNxy .cluster span{color:#333;}#mermaid-svg-kuhz7bGESXmKvNxy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kuhz7bGESXmKvNxy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kuhz7bGESXmKvNxy rect.text{fill:none;stroke-width:0;}#mermaid-svg-kuhz7bGESXmKvNxy .icon-shape,#mermaid-svg-kuhz7bGESXmKvNxy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kuhz7bGESXmKvNxy .icon-shape p,#mermaid-svg-kuhz7bGESXmKvNxy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kuhz7bGESXmKvNxy .icon-shape .label rect,#mermaid-svg-kuhz7bGESXmKvNxy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kuhz7bGESXmKvNxy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kuhz7bGESXmKvNxy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kuhz7bGESXmKvNxy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败率达到阈值
超时时间到
请求成功
请求失败
CLOSED
闭合状态
OPEN
断开状态
HALF-OPEN
半开状态
服务注册与发现
yaml
# Spring Cloud 服务注册
# application.yml
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev
group: DEFAULT_GROUP
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
java
// 服务发现
@Service
public class ServiceDiscovery {
@Autowired
private NamingService namingService;
public List<Instance> getAllInstances(String serviceName) {
try {
return namingService.selectInstances(serviceName, true);
} catch (NacosException e) {
throw new RuntimeException("Failed to get instances", e);
}
}
public Instance selectOneHealthyInstance(String serviceName) {
try {
return namingService.selectOneHealthyInstance(serviceName);
} catch (NacosException e) {
throw new RuntimeException("Failed to select instance", e);
}
}
}
// Ribbon 负载均衡
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
// 随机策略
return new RandomRule();
// 轮询策略
// return new RoundRobinRule();
// 加权策略
// return new WeightedResponseTimeRule();
}
}
@Service
public class UserClient {
@Autowired
private RestTemplate restTemplate;
// 使用服务名调用
public User getUser(Long userId) {
return restTemplate.getForObject(
"http://user-service/user/{id}",
User.class,
userId
);
}
}
// OpenFeign 声明式调用
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
@PostMapping("/user")
User createUser(@RequestBody UserDTO userDTO);
}
@Component
public class UserClientFallback implements UserClient {
@Override
public User getUser(Long id) {
return User.defaultUser();
}
@Override
public User createUser(UserDTO userDTO) {
throw new RuntimeException("User service unavailable");
}
}
配置中心
java
// Nacos 配置中心
@RestController
@RequestMapping("/config")
@RefreshScope // 自动刷新配置
public class ConfigController {
@Value("${app.name:default}")
private String appName;
@Value("${app.version:1.0.0}")
private String appVersion;
@GetMapping("/info")
public Map<String, String> getConfig() {
Map<String, String> config = new HashMap<>();
config.put("name", appName);
config.put("version", appVersion);
return config;
}
}
配置中心动态刷新流程
数据库 应用服务 "Nacos 配置中心" 开发人员 数据库 应用服务 "Nacos 配置中心" 开发人员 #mermaid-svg-bLQQu3jwdltJTngy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bLQQu3jwdltJTngy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bLQQu3jwdltJTngy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bLQQu3jwdltJTngy .error-icon{fill:#552222;}#mermaid-svg-bLQQu3jwdltJTngy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bLQQu3jwdltJTngy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bLQQu3jwdltJTngy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bLQQu3jwdltJTngy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bLQQu3jwdltJTngy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bLQQu3jwdltJTngy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bLQQu3jwdltJTngy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bLQQu3jwdltJTngy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bLQQu3jwdltJTngy .marker.cross{stroke:#333333;}#mermaid-svg-bLQQu3jwdltJTngy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bLQQu3jwdltJTngy p{margin:0;}#mermaid-svg-bLQQu3jwdltJTngy .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bLQQu3jwdltJTngy text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-bLQQu3jwdltJTngy .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bLQQu3jwdltJTngy .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-bLQQu3jwdltJTngy .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-bLQQu3jwdltJTngy .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-bLQQu3jwdltJTngy #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-bLQQu3jwdltJTngy .sequenceNumber{fill:white;}#mermaid-svg-bLQQu3jwdltJTngy #sequencenumber{fill:#333;}#mermaid-svg-bLQQu3jwdltJTngy #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-bLQQu3jwdltJTngy .messageText{fill:#333;stroke:none;}#mermaid-svg-bLQQu3jwdltJTngy .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bLQQu3jwdltJTngy .labelText,#mermaid-svg-bLQQu3jwdltJTngy .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-bLQQu3jwdltJTngy .loopText,#mermaid-svg-bLQQu3jwdltJTngy .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-bLQQu3jwdltJTngy .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-bLQQu3jwdltJTngy .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-bLQQu3jwdltJTngy .noteText,#mermaid-svg-bLQQu3jwdltJTngy .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-bLQQu3jwdltJTngy .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bLQQu3jwdltJTngy .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bLQQu3jwdltJTngy .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-bLQQu3jwdltJTngy .actorPopupMenu{position:absolute;}#mermaid-svg-bLQQu3jwdltJTngy .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-bLQQu3jwdltJTngy .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-bLQQu3jwdltJTngy .actor-man circle,#mermaid-svg-bLQQu3jwdltJTngy line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-bLQQu3jwdltJTngy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} @RefreshScope 触发刷新 配置热加载完成 修改配置配置版本更新WebSocket 推送配置变更拉取最新配置返回新配置使用新配置重新连接
API 网关
yaml
# Spring Cloud Gateway 配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
# 全局跨域配置
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
allowedHeaders: "*"
java
// Gateway 全局过滤器
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Autowired
private AuthService authService;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (StringUtils.isBlank(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
try {
Claims claims = authService.verifyToken(token);
exchange.getAttributes().put("userId", claims.getSubject());
} catch (Exception e) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100; // 优先级
}
}
分布式事务 Saga 补偿流程
#mermaid-svg-1VKdf20La9fEiyZ9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1VKdf20La9fEiyZ9 .error-icon{fill:#552222;}#mermaid-svg-1VKdf20La9fEiyZ9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1VKdf20La9fEiyZ9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1VKdf20La9fEiyZ9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1VKdf20La9fEiyZ9 .marker.cross{stroke:#333333;}#mermaid-svg-1VKdf20La9fEiyZ9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1VKdf20La9fEiyZ9 p{margin:0;}#mermaid-svg-1VKdf20La9fEiyZ9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 .cluster-label text{fill:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 .cluster-label span{color:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 .cluster-label span p{background-color:transparent;}#mermaid-svg-1VKdf20La9fEiyZ9 .label text,#mermaid-svg-1VKdf20La9fEiyZ9 span{fill:#333;color:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 .node rect,#mermaid-svg-1VKdf20La9fEiyZ9 .node circle,#mermaid-svg-1VKdf20La9fEiyZ9 .node ellipse,#mermaid-svg-1VKdf20La9fEiyZ9 .node polygon,#mermaid-svg-1VKdf20La9fEiyZ9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1VKdf20La9fEiyZ9 .rough-node .label text,#mermaid-svg-1VKdf20La9fEiyZ9 .node .label text,#mermaid-svg-1VKdf20La9fEiyZ9 .image-shape .label,#mermaid-svg-1VKdf20La9fEiyZ9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-1VKdf20La9fEiyZ9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1VKdf20La9fEiyZ9 .rough-node .label,#mermaid-svg-1VKdf20La9fEiyZ9 .node .label,#mermaid-svg-1VKdf20La9fEiyZ9 .image-shape .label,#mermaid-svg-1VKdf20La9fEiyZ9 .icon-shape .label{text-align:center;}#mermaid-svg-1VKdf20La9fEiyZ9 .node.clickable{cursor:pointer;}#mermaid-svg-1VKdf20La9fEiyZ9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1VKdf20La9fEiyZ9 .arrowheadPath{fill:#333333;}#mermaid-svg-1VKdf20La9fEiyZ9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1VKdf20La9fEiyZ9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1VKdf20La9fEiyZ9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1VKdf20La9fEiyZ9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1VKdf20La9fEiyZ9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1VKdf20La9fEiyZ9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1VKdf20La9fEiyZ9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1VKdf20La9fEiyZ9 .cluster text{fill:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 .cluster span{color:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1VKdf20La9fEiyZ9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1VKdf20La9fEiyZ9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-1VKdf20La9fEiyZ9 .icon-shape,#mermaid-svg-1VKdf20La9fEiyZ9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1VKdf20La9fEiyZ9 .icon-shape p,#mermaid-svg-1VKdf20La9fEiyZ9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1VKdf20La9fEiyZ9 .icon-shape .label rect,#mermaid-svg-1VKdf20La9fEiyZ9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1VKdf20La9fEiyZ9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1VKdf20La9fEiyZ9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1VKdf20La9fEiyZ9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 成功
成功
成功
成功
失败
失败
失败
订单创建
订单服务
创建订单
库存服务
扣减库存
支付服务
扣减余额
物流服务
创建物流单
完成
订单服务
取消订单
库存服务
恢复库存
支付服务
退款
事务回滚
微服务学习路线图
#mermaid-svg-ME6KRjuSqULURdps{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ME6KRjuSqULURdps .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ME6KRjuSqULURdps .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ME6KRjuSqULURdps .error-icon{fill:#552222;}#mermaid-svg-ME6KRjuSqULURdps .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ME6KRjuSqULURdps .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ME6KRjuSqULURdps .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ME6KRjuSqULURdps .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ME6KRjuSqULURdps .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ME6KRjuSqULURdps .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ME6KRjuSqULURdps .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ME6KRjuSqULURdps .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ME6KRjuSqULURdps .marker.cross{stroke:#333333;}#mermaid-svg-ME6KRjuSqULURdps svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ME6KRjuSqULURdps p{margin:0;}#mermaid-svg-ME6KRjuSqULURdps .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ME6KRjuSqULURdps .cluster-label text{fill:#333;}#mermaid-svg-ME6KRjuSqULURdps .cluster-label span{color:#333;}#mermaid-svg-ME6KRjuSqULURdps .cluster-label span p{background-color:transparent;}#mermaid-svg-ME6KRjuSqULURdps .label text,#mermaid-svg-ME6KRjuSqULURdps span{fill:#333;color:#333;}#mermaid-svg-ME6KRjuSqULURdps .node rect,#mermaid-svg-ME6KRjuSqULURdps .node circle,#mermaid-svg-ME6KRjuSqULURdps .node ellipse,#mermaid-svg-ME6KRjuSqULURdps .node polygon,#mermaid-svg-ME6KRjuSqULURdps .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ME6KRjuSqULURdps .rough-node .label text,#mermaid-svg-ME6KRjuSqULURdps .node .label text,#mermaid-svg-ME6KRjuSqULURdps .image-shape .label,#mermaid-svg-ME6KRjuSqULURdps .icon-shape .label{text-anchor:middle;}#mermaid-svg-ME6KRjuSqULURdps .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ME6KRjuSqULURdps .rough-node .label,#mermaid-svg-ME6KRjuSqULURdps .node .label,#mermaid-svg-ME6KRjuSqULURdps .image-shape .label,#mermaid-svg-ME6KRjuSqULURdps .icon-shape .label{text-align:center;}#mermaid-svg-ME6KRjuSqULURdps .node.clickable{cursor:pointer;}#mermaid-svg-ME6KRjuSqULURdps .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ME6KRjuSqULURdps .arrowheadPath{fill:#333333;}#mermaid-svg-ME6KRjuSqULURdps .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ME6KRjuSqULURdps .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ME6KRjuSqULURdps .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ME6KRjuSqULURdps .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ME6KRjuSqULURdps .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ME6KRjuSqULURdps .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ME6KRjuSqULURdps .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ME6KRjuSqULURdps .cluster text{fill:#333;}#mermaid-svg-ME6KRjuSqULURdps .cluster span{color:#333;}#mermaid-svg-ME6KRjuSqULURdps div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ME6KRjuSqULURdps .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ME6KRjuSqULURdps rect.text{fill:none;stroke-width:0;}#mermaid-svg-ME6KRjuSqULURdps .icon-shape,#mermaid-svg-ME6KRjuSqULURdps .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ME6KRjuSqULURdps .icon-shape p,#mermaid-svg-ME6KRjuSqULURdps .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ME6KRjuSqULURdps .icon-shape .label rect,#mermaid-svg-ME6KRjuSqULURdps .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ME6KRjuSqULURdps .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ME6KRjuSqULURdps .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ME6KRjuSqULURdps :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础阶段
Spring Boot / DevOps
通信阶段
REST / gRPC / 消息队列
注册发现
Nacos / Consul
配置中心
Apollo / Nacos
网关
Spring Cloud Gateway
容错
Sentinel / Hystrix
链路追踪
SkyWalking / Jaeger
日志
ELK / Loki
监控
Prometheus / Grafana
分布式事务
Seata / Saga
容器化
Docker / K8s
CI/CD
Jenkins / GitLab CI