Dubbo基础知识小结 一、基础认知1. 什么是 DubboApache Dubbo 是一款高性能、轻量级开源 Java RPC 框架核心解决分布式服务调用问题提供透明化远程方法调用像调用本地接口一样调用跨机器服务内置完整微服务治理注册发现、负载均衡、容错重试、灰度、限流监控默认 TCP 二进制长连接内网微服务性能远高于 HTTP/Feign2. Dubbo 核心五大角色架构Provider 服务提供者实现业务接口注册服务到注册中心Consumer 服务消费者引用远程接口从注册中心订阅服务Registry 注册中心存储服务地址常用 Nacos/ZooKeeper/EurekaMonitor 监控中心采集调用次数、耗时、异常可视化面板Container 容器Dubbo 服务运行容器Spring 容器为主调用流程Provider 启动 → 注册服务到 RegistryConsumer 启动 → 从 Registry 拉取服务地址Consumer 直连 Provider 发起 TCP RPC 调用调用数据异步上报 Monitor3. Dubbo 核心能力RPC 通信多协议支持Dubbo/Triple/REST/gRPC服务注册发现动态上下线自动感知实例变更负载均衡随机、轮询、最小活跃、一致性哈希、加权轮询集群容错Failover/Failfast/Failsafe/Failback/Broadcast序列化Hessian2、Protobuf、Fastjson2、Kryo流量管控超时、重试、熔断、灰度发布、分组、版本隔离可观测链路追踪、调用监控、日志埋点二、使用1. 核心依赖!-- Dubbo SpringBoot Starter -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version3.3.0/version /dependency !-- Nacos 注册中心 -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-registry-nacos/artifactId version3.3.0/version /dependency2. 配置服务类(1) 提供者--yaml dubbo: application: name: dubbo-provider-user # 服务名 registry: address: nacos://127.0.0.1:8848 # nacos地址 protocol: name: dubbo # 默认tcp dubbo协议 port: 20880 # rpc端口多服务自动递增 scan: base-packages: com.xxx.provider.service # DubboService扫描包(2) 消费者--yaml dubbo: application: name: dubbo-consumer-order registry: address: nacos://127.0.0.1:88483. 核心注解(Dubbo3)1)DubboService标记服务实现类暴露 RPC 接口version版本号灰度多版本兼容group服务分组隔离测试 / 生产timeout接口全局超时毫秒retries失败重试次数2)DubboReference消费者引用远程服务loadbalance指定负载均衡策略cluster集群容错策略check启动是否校验服务存在开发关闭 checkfalse3)DubboMethod单独配置方法级超时、重试4)DubboParam参数隐式传参标记4.和XML dubbo:service区别① 绑定方式不同注解实现类自描述框架扫描带DubboService的类自动读取接口、生成 ServiceBean必须在启动类开启EnableDubbo包扫描。XML手动关联接口与实现通过interface指定 API 全类名、ref指向 Spring Bean无需包扫描配置。② 硬编码参数的灵活性差异注解上直接写死数字timeout1000写死在 class 文件改数值必须改代码打包XML 标签写死属性timeout1000写死在 xml改完只需重启服务不用重新编译 Java统一最优方案不在注解 / XML 写死参数全部放到 yml/Apollo 配置中心二者都支持${dubbo.service.timeout}占位符读取外部配置支持热刷新。③ 多服务、多协议场景适配XML 优势同一个实现类可以定义多个dubbo:service分别指定 dubbo/triple/rest 不同协议、不同版本分组配置集中管理。!-- 同一实现Dubbo TCP协议 -- dubbo:service refuserService protocoldubbo/ !-- 同一实现Triple HTTP2跨语言协议 -- dubbo:service refuserService protocoltriple/注解劣势一个实现类只能打一个DubboService多协议需要额外代码处理可读性差。④ SpringBoot 项目兼容性SpringBoot 微服务行业统一使用DubboService注解无 XML符合零配置自动化思想老旧 SSM/SpringMVC 项目无注解扫描体系大量遗留代码使用dubbo:serviceXML 配置。5. 代码示例1) Provider实现import org.apache.dubbo.config.annotation.DubboService; DubboService public class UserDubboServiceImpl implements UserDubboService { Override public UserDTO getUserById(Long userId) { // 查询数据库 return new UserDTO(); } }2) Consumer实现import org.apache.dubbo.config.annotation.DubboReference; Service public class OrderService { DubboReference private UserDubboService userDubboService; public void createOrder(){ // 像本地方法调用远程服务 UserDTO user userDubboService.getUserById(1001L); } }三、核心知识点1.协议协议底层适用场景dubboTCP 二进制 Hessian2内网微服务调用性能最优默认tripleHTTP2Protobuf云原生、跨语言、网关兼容restHTTP JSON对外兼容前端 / 第三方系统2.集群容错策略Failover默认失败自动切换其他节点重试 n 次读接口首选Failfast只发起一次调用失败直接抛异常写操作避免重复入库Failsafe失败忽略返回空不重要日志 / 统计接口Failback失败后台异步重试消息通知类业务Broadcast广播所有节点全部调用缓存刷新场景3.负载均衡random 随机默认roundrobin 轮询leastactive 最小活跃数慢机器少分配请求生产推荐consistenthash 一致性哈希会话粘滞购物车weightedrandom/weightedroundrobin 加权区分机器配置4.序列化选型Hessian2默认Java 对象友好性能均衡Protobuf跨语言、体积最小Triple 协议标配Fastjson2JSON 序列化易调试Kryo高性能二进制需引入依赖5.隐式参数传递(上下文透传)消费者传递租户 ID、token、链路 traceId// 消费者设置 RpcContext.getClientAttachment().setAttachment(traceId, xxx); // 提供者获取 String traceId RpcContext.getServerAttachment().getAttachment(traceId);四、Dubbo vs HTTP (Feign) 核心区别1. 底层基础对比1) 传输协议Dubbo默认Dubbo 私有 TCP 协议基于长连接、二进制序列化也支持 HTTP/REST、gRPC 等扩展协议。HTTP基于 TCP 的应用层文本协议短连接为主HTTP1.1 支持长连接明文文本传输HTTP1/22) 连接模型① DubboTCP 长连接服务启动时消费者与提供者建立一条持久 TCP 长连接复用连接收发所有请求连接池复用少量连接无频繁三次握手 / 四次挥手单连接多路复用异步 IONetty高并发性能极强。② HTTPHTTP/1.1默认短连接每次请求新建连接开启 Keep-Alive 可短暂复用但并发高时大量连接HTTP/2支持单连接多路复用但上层仍是 HTTP 语义网关、Nginx 中转场景多多一层网络转发损耗。2.序列化方式(性能差距核心)① Dubbo默认Hessian2可选 Fastjson2、Protobuf、Kryo 等二进制序列化二进制紧凑报文体积小无需解析文本标签JSON/XML序列化 / 反序列化速度快支持复杂 Java 对象、循环引用、泛型、日期精准转换。② HTTP主流JSON/XML 文本序列化文本冗余大数字、引号、括号占用额外字节解析字符串开销高大数据量下 CPU 损耗明显跨语言友好但 Java 复杂对象转换容易丢失类型。3. IO与通讯模型Dubbo全异步非阻塞 Netty NIO单线程处理大量连接请求异步响应支持回调、批量、超时熔断HTTPHTTP1.1阻塞 IO 居多并发受连接数限制HTTP2/3 异步优化但受 HTTP 协议头部、文本解析拖累。4. 协议头部与开销Dubbo 协议头极简固定少量字节魔数、版本、序列化 ID、长度协议开销极低HTTP 必须携带大量 HeaderCookie、User-Agent、Content-Type、Host 等每次请求重复携带头部冗余严重。5. 功能生态① Dubbo 原生内置完整微服务能力面向内部服务调用注册中心Nacos/Zookeeper/Eureka自动服务发现、负载均衡随机 / 轮询 / 一致性哈希 / 最小活跃熔断降级、限流、重试、超时、失败容错、本地缓存隐式传参、上下文透传、接口签名、权限校验直连、分组、版本灰度、多注册中心隔离内置监控、链路追踪埋点。② HTTP通用开放接口无原生服务治理需额外集成网关Spring Cloud Gateway、Sentinel、Feign负载均衡依赖网关或客户端组件灰度、限流、熔断都需要中间层额外实现优势通用标准任意语言、浏览器、第三方系统均可调用。6. 适用场景差异① Dubbo 适合内网微服务之间调用服务集群内部高并发、高吞吐接口对延迟敏感、QPS 极高场景订单、库存、支付内部 RPC 调用Java 技术栈为主追求极致性能、完善服务治理。② HTTP 适合对外开放接口、跨异构系统前端浏览器、APP、第三方外部系统对接多语言异构服务互通Java ↔ Python ↔ Go简单低并发接口快速调试Postman、curl 直接调用跨公司、对外 API 平台。7. 开发使用区别① Dubbo基于 Java 接口定义强类型编译校验面向方法调用userService.getUserById(1001)像本地方法一样编程调试麻烦需要 telnet、dubbo-admin不能直接 curl 调用依赖 Dubbo 框架脱离框架无法独立调用。② HTTP基于 URL 请求体弱类型运行时才发现参数错误面向资源 URLGET /user/1001调试便捷curl、Postman、浏览器直接访问无框架绑定标准通用。8. 小结内部微服务高并发交互选 Dubbo性能、治理能力碾压 HTTP对外提供接口、前端 / 第三方调用选 HTTP标准通用、调试简单架构分层标准方案HTTP 做接入层Dubbo 做内部服务通信。