> 技术文档 > Java面试必备:Feign 与 Dubbo 的区别:微服务通信框架对比_dubbo和feign的区别

Java面试必备:Feign 与 Dubbo 的区别:微服务通信框架对比_dubbo和feign的区别


SpringCloud面试题 - Feign 和 Dubbo 的区别?


1. 概述

Feign 和 Dubbo 都是 Java 生态中广泛使用的微服务通信框架,但它们在设计理念和使用场景上有显著差异。

#mermaid-svg-jkfBoLKsGPOK7FHz {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz .error-icon{fill:#552222;}#mermaid-svg-jkfBoLKsGPOK7FHz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jkfBoLKsGPOK7FHz .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jkfBoLKsGPOK7FHz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jkfBoLKsGPOK7FHz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jkfBoLKsGPOK7FHz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jkfBoLKsGPOK7FHz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jkfBoLKsGPOK7FHz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jkfBoLKsGPOK7FHz .marker.cross{stroke:#333333;}#mermaid-svg-jkfBoLKsGPOK7FHz svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jkfBoLKsGPOK7FHz .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz .cluster-label text{fill:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz .cluster-label span{color:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz .label text,#mermaid-svg-jkfBoLKsGPOK7FHz span{fill:#333;color:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz .node rect,#mermaid-svg-jkfBoLKsGPOK7FHz .node circle,#mermaid-svg-jkfBoLKsGPOK7FHz .node ellipse,#mermaid-svg-jkfBoLKsGPOK7FHz .node polygon,#mermaid-svg-jkfBoLKsGPOK7FHz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jkfBoLKsGPOK7FHz .node .label{text-align:center;}#mermaid-svg-jkfBoLKsGPOK7FHz .node.clickable{cursor:pointer;}#mermaid-svg-jkfBoLKsGPOK7FHz .arrowheadPath{fill:#333333;}#mermaid-svg-jkfBoLKsGPOK7FHz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jkfBoLKsGPOK7FHz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jkfBoLKsGPOK7FHz .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-jkfBoLKsGPOK7FHz .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-jkfBoLKsGPOK7FHz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jkfBoLKsGPOK7FHz .cluster text{fill:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz .cluster span{color:#333;}#mermaid-svg-jkfBoLKsGPOK7FHz 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-jkfBoLKsGPOK7FHz :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}微服务通信框架FeignDubboHTTP/RESTRPC

2. 核心区别

特性 Feign Dubbo 通信协议 HTTP/REST 自定义RPC协议 服务发现 依赖Eureka/Consul等 内置服务发现机制 负载均衡 Ribbon客户端负载均衡 客户端负载均衡 调用方式 声明式接口 接口代理 适用场景 Spring Cloud生态 高性能RPC场景

3. 架构对比

Feign 架构

#mermaid-svg-LSC6Rmy2V4cYvOQP {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP .error-icon{fill:#552222;}#mermaid-svg-LSC6Rmy2V4cYvOQP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LSC6Rmy2V4cYvOQP .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-LSC6Rmy2V4cYvOQP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LSC6Rmy2V4cYvOQP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LSC6Rmy2V4cYvOQP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LSC6Rmy2V4cYvOQP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LSC6Rmy2V4cYvOQP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LSC6Rmy2V4cYvOQP .marker.cross{stroke:#333333;}#mermaid-svg-LSC6Rmy2V4cYvOQP svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LSC6Rmy2V4cYvOQP .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LSC6Rmy2V4cYvOQP text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-LSC6Rmy2V4cYvOQP .actor-line{stroke:grey;}#mermaid-svg-LSC6Rmy2V4cYvOQP .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP .sequenceNumber{fill:white;}#mermaid-svg-LSC6Rmy2V4cYvOQP #sequencenumber{fill:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP .messageText{fill:#333;stroke:#333;}#mermaid-svg-LSC6Rmy2V4cYvOQP .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LSC6Rmy2V4cYvOQP .labelText,#mermaid-svg-LSC6Rmy2V4cYvOQP .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-LSC6Rmy2V4cYvOQP .loopText,#mermaid-svg-LSC6Rmy2V4cYvOQP .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-LSC6Rmy2V4cYvOQP .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-LSC6Rmy2V4cYvOQP .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-LSC6Rmy2V4cYvOQP .noteText,#mermaid-svg-LSC6Rmy2V4cYvOQP .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-LSC6Rmy2V4cYvOQP .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LSC6Rmy2V4cYvOQP .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LSC6Rmy2V4cYvOQP .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-LSC6Rmy2V4cYvOQP .actorPopupMenu{position:absolute;}#mermaid-svg-LSC6Rmy2V4cYvOQP .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-LSC6Rmy2V4cYvOQP .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-LSC6Rmy2V4cYvOQP .actor-man circle,#mermaid-svg-LSC6Rmy2V4cYvOQP line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-LSC6Rmy2V4cYvOQP :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}客户端FeignRibbon服务端调用接口方法获取服务实例返回实例列表HTTP请求HTTP响应返回结果客户端FeignRibbon服务端

Dubbo 架构

#mermaid-svg-Qx1dQnaxFIsEmCfe {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe .error-icon{fill:#552222;}#mermaid-svg-Qx1dQnaxFIsEmCfe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Qx1dQnaxFIsEmCfe .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Qx1dQnaxFIsEmCfe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Qx1dQnaxFIsEmCfe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Qx1dQnaxFIsEmCfe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Qx1dQnaxFIsEmCfe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Qx1dQnaxFIsEmCfe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Qx1dQnaxFIsEmCfe .marker.cross{stroke:#333333;}#mermaid-svg-Qx1dQnaxFIsEmCfe svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Qx1dQnaxFIsEmCfe .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Qx1dQnaxFIsEmCfe text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Qx1dQnaxFIsEmCfe .actor-line{stroke:grey;}#mermaid-svg-Qx1dQnaxFIsEmCfe .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe .sequenceNumber{fill:white;}#mermaid-svg-Qx1dQnaxFIsEmCfe #sequencenumber{fill:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe .messageText{fill:#333;stroke:#333;}#mermaid-svg-Qx1dQnaxFIsEmCfe .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Qx1dQnaxFIsEmCfe .labelText,#mermaid-svg-Qx1dQnaxFIsEmCfe .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Qx1dQnaxFIsEmCfe .loopText,#mermaid-svg-Qx1dQnaxFIsEmCfe .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Qx1dQnaxFIsEmCfe .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-Qx1dQnaxFIsEmCfe .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Qx1dQnaxFIsEmCfe .noteText,#mermaid-svg-Qx1dQnaxFIsEmCfe .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Qx1dQnaxFIsEmCfe .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Qx1dQnaxFIsEmCfe .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Qx1dQnaxFIsEmCfe .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Qx1dQnaxFIsEmCfe .actorPopupMenu{position:absolute;}#mermaid-svg-Qx1dQnaxFIsEmCfe .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-Qx1dQnaxFIsEmCfe .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Qx1dQnaxFIsEmCfe .actor-man circle,#mermaid-svg-Qx1dQnaxFIsEmCfe line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Qx1dQnaxFIsEmCfe :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}消费者提供者注册中心注册服务订阅服务返回提供者列表RPC调用返回结果消费者提供者注册中心

4. 代码示例对比

Feign 示例

// 1. 定义Feign客户端接口@FeignClient(name = \"user-service\", url = \"${user.service.url}\")public interface UserServiceClient { @GetMapping(\"/users/{id}\") User getUserById(@PathVariable(\"id\") Long id); @PostMapping(\"/users\") User createUser(@RequestBody User user);}// 2. 使用Feign客户端@Servicepublic class UserService { @Autowired private UserServiceClient userServiceClient; public User getUser(Long id) { return userServiceClient.getUserById(id); }}

Dubbo 示例

// 1. 服务提供者接口public interface UserService { User getUserById(Long id); User createUser(User user);}// 2. 服务提供者实现@Servicepublic class UserServiceImpl implements UserService { @Override public User getUserById(Long id) { // 实现逻辑 }}// 3. 服务消费者@Servicepublic class ConsumerService { @Reference private UserService userService; public User getUser(Long id) { return userService.getUserById(id); }}

5. 详细对比分析

5.1 通信协议

  • Feign: 基于HTTP协议,通常是RESTful风格

    • 优点:通用性强,跨语言支持好
    • 缺点:性能开销较大
  • Dubbo: 自定义二进制RPC协议

    • 优点:高性能,低延迟
    • 缺点:跨语言支持需要额外工作

#mermaid-svg-7kbpwmDJXsDtK480 {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7kbpwmDJXsDtK480 .error-icon{fill:#552222;}#mermaid-svg-7kbpwmDJXsDtK480 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7kbpwmDJXsDtK480 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-7kbpwmDJXsDtK480 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7kbpwmDJXsDtK480 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7kbpwmDJXsDtK480 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7kbpwmDJXsDtK480 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7kbpwmDJXsDtK480 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7kbpwmDJXsDtK480 .marker.cross{stroke:#333333;}#mermaid-svg-7kbpwmDJXsDtK480 svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7kbpwmDJXsDtK480 .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7kbpwmDJXsDtK480 .cluster-label text{fill:#333;}#mermaid-svg-7kbpwmDJXsDtK480 .cluster-label span{color:#333;}#mermaid-svg-7kbpwmDJXsDtK480 .label text,#mermaid-svg-7kbpwmDJXsDtK480 span{fill:#333;color:#333;}#mermaid-svg-7kbpwmDJXsDtK480 .node rect,#mermaid-svg-7kbpwmDJXsDtK480 .node circle,#mermaid-svg-7kbpwmDJXsDtK480 .node ellipse,#mermaid-svg-7kbpwmDJXsDtK480 .node polygon,#mermaid-svg-7kbpwmDJXsDtK480 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7kbpwmDJXsDtK480 .node .label{text-align:center;}#mermaid-svg-7kbpwmDJXsDtK480 .node.clickable{cursor:pointer;}#mermaid-svg-7kbpwmDJXsDtK480 .arrowheadPath{fill:#333333;}#mermaid-svg-7kbpwmDJXsDtK480 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7kbpwmDJXsDtK480 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7kbpwmDJXsDtK480 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-7kbpwmDJXsDtK480 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-7kbpwmDJXsDtK480 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7kbpwmDJXsDtK480 .cluster text{fill:#333;}#mermaid-svg-7kbpwmDJXsDtK480 .cluster span{color:#333;}#mermaid-svg-7kbpwmDJXsDtK480 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-7kbpwmDJXsDtK480 :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}HTTP/文本二进制Feign网络传输Dubbo

5.2 服务发现

  • Feign: 依赖外部服务发现组件(Eureka, Consul等)

    @FeignClient(name = \"user-service\") // 通过服务名发现
  • Dubbo: 内置服务发现机制,支持多种注册中心

    @Reference(url = \"dubbo://localhost:20880\") // 直连或注册中心

5.3 负载均衡

  • Feign: 集成Ribbon实现客户端负载均衡

    • 策略:轮询、随机、响应时间加权等
  • Dubbo: 内置多种负载均衡策略

    • 策略:随机、轮询、最少活跃调用等

6. 性能对比

指标 Feign Dubbo 序列化速度 较慢(JSON) 快(Hessian2) 网络开销 较大 较小 吞吐量 中等 高 延迟 较高 低

7. 适用场景

Feign 适用场景

  • Spring Cloud生态系统项目
  • 需要与多种语言服务通信
  • 简单的RESTful服务调用
  • 快速原型开发

Dubbo 适用场景

  • 高性能要求的内部服务调用
  • 复杂参数类型的调用
  • 需要多种RPC特性的场景(如隐式传参)
  • 已有Dubbo基础设施的项目

8. 总结

Feign和Dubbo各有优劣,选择取决于项目需求:

  • 如果需要简单、通用的HTTP通信,选择Feign
  • 如果需要高性能、低延迟的RPC,选择Dubbo
  • 在Spring Cloud生态中,Feign集成更顺畅
  • 在传统分布式系统中,Dubbo可能更合适

#mermaid-svg-GDBT42Vy1im6EdR7 {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 .error-icon{fill:#552222;}#mermaid-svg-GDBT42Vy1im6EdR7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GDBT42Vy1im6EdR7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GDBT42Vy1im6EdR7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GDBT42Vy1im6EdR7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GDBT42Vy1im6EdR7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GDBT42Vy1im6EdR7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GDBT42Vy1im6EdR7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GDBT42Vy1im6EdR7 .marker.cross{stroke:#333333;}#mermaid-svg-GDBT42Vy1im6EdR7 svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GDBT42Vy1im6EdR7 .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 .cluster-label text{fill:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 .cluster-label span{color:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 .label text,#mermaid-svg-GDBT42Vy1im6EdR7 span{fill:#333;color:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 .node rect,#mermaid-svg-GDBT42Vy1im6EdR7 .node circle,#mermaid-svg-GDBT42Vy1im6EdR7 .node ellipse,#mermaid-svg-GDBT42Vy1im6EdR7 .node polygon,#mermaid-svg-GDBT42Vy1im6EdR7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GDBT42Vy1im6EdR7 .node .label{text-align:center;}#mermaid-svg-GDBT42Vy1im6EdR7 .node.clickable{cursor:pointer;}#mermaid-svg-GDBT42Vy1im6EdR7 .arrowheadPath{fill:#333333;}#mermaid-svg-GDBT42Vy1im6EdR7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GDBT42Vy1im6EdR7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GDBT42Vy1im6EdR7 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-GDBT42Vy1im6EdR7 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-GDBT42Vy1im6EdR7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GDBT42Vy1im6EdR7 .cluster text{fill:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 .cluster span{color:#333;}#mermaid-svg-GDBT42Vy1im6EdR7 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-GDBT42Vy1im6EdR7 :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}REST/HTTP高性能RPC选择通信框架需求类型FeignDubboSpring Cloud生态传统分布式系统