当前位置: 首页 > news >正文

【Dubbo】高性能的 RPC

【Dubbo】高性能的 RPC

  • 【一】Dubbo 原理详解
    • 【1】核心架构组件
    • 【2】核心工作流程
    • 【3】关键特性
  • 【二】Dubbo 与 Spring Cloud OpenFeign 的区别
  • 【三】Dubbo 整合 Nacos 实战案例
    • 【1】服务提供者(Provider)实现
      • (1)引入依赖(Maven pom.xml)
      • (2)配置文件(application.yml)
      • (3)定义服务接口(需被消费者依赖)
      • (4)实现服务接口
      • (5)启动类
    • 【2】服务消费者(Consumer)实现
      • (1)引入依赖(同 Provider,需额外引入接口依赖)
      • (2)配置文件(application.yml)
      • (3)调用远程服务
      • (4)启动类
    • 【3】验证
    • 【4】总结

【一】Dubbo 原理详解

Dubbo 是阿里巴巴开源的分布式服务框架,专注于解决微服务架构中的服务治理问题,核心基于 RPC(远程过程调用) 实现跨服务通信,具有高性能、高扩展性的特点。其核心原理可从架构设计和工作流程两方面展开:

【1】核心架构组件

Dubbo 架构包含 5 个核心角色,协同实现服务的注册、发现、调用和监控:
(1)Provider(服务提供者):暴露服务的应用,启动时将服务信息(接口、地址、端口等)注册到注册中心。
(2)Consumer(服务消费者):调用远程服务的应用,启动时从注册中心订阅所需服务,获取服务提供者地址列表。
(3)Registry(注册中心):管理服务注册与发现的中间件(如 Nacos、Zookeeper),负责动态维护服务地址列表,并在服务上下线时推送变更通知给消费者。
(4)Monitor(监控中心):统计服务调用次数、耗时等指标,用于监控服务健康状态和性能分析。
(5)Container(容器):服务运行的载体(如 Spring 容器),负责服务的初始化和启动。

【2】核心工作流程

Dubbo 的服务调用流程可概括为以下步骤:
(1)服务注册:Provider 启动时,通过 Dubbo 框架将自身提供的服务接口、IP、端口等信息注册到 Registry。
(2)服务订阅:Consumer 启动时,向 Registry 订阅所需的服务,Registry 返回 Provider 地址列表。
(3)地址缓存:Consumer 将获取到的 Provider 地址列表缓存到本地,避免频繁依赖 Registry。
(4)负载均衡:Consumer 调用服务时,从本地缓存的地址列表中,通过 Dubbo 内置的负载均衡策略(如随机、轮询、一致性哈希等)选择一个 Provider。
(5)远程调用:Consumer 通过 RPC 协议(如 Dubbo 协议、HTTP 协议等)向选中的 Provider 发起请求,Provider 处理后返回结果。
(6)服务监控:Provider 和 Consumer 会定期将调用次数、耗时等数据上报到 Monitor。
(7)动态更新:当 Provider 上下线时,Registry 会主动推送地址变更通知给 Consumer,Consumer 更新本地缓存。

【3】关键特性

(1)高性能:基于 Netty 实现的长连接通信,采用自定义 Dubbo 协议(默认),序列化效率高(支持 Hessian、JSON、Protobuf 等),性能优于传统 HTTP 协议。
(2)服务治理:内置负载均衡、超时重试、熔断降级、服务路由等机制,简化微服务治理。
(3)扩展性:通过 SPI(Service Provider Interface)机制支持自定义扩展(如自定义负载均衡策略、协议等)。

【二】Dubbo 与 Spring Cloud OpenFeign 的区别

Dubbo 和 OpenFeign 均用于微服务间通信,但设计理念和实现方式差异显著,核心区别如下:

(1)通信协议
dubbo:基于 RPC(默认 Dubbo 协议,支持 HTTP、gRPC 等)
openfeign:基于 HTTP/HTTPS(RESTful API)
(2)接口定义
dubbo:需定义独立服务接口(如 UserService),Provider 实现接口,Consumer 引入接口依赖
openfeign:基于 Spring MVC 注解(如 @GetMapping),通过接口声明 HTTP 调用
(3)服务发现集成
dubbo:支持多种注册中心(Nacos、Zookeeper、Eureka 等),需单独配置
openfeign:依赖 Spring Cloud 生态,通常与 Nacos、Eureka 等注册中心无缝集成(自动关联)
(4)性能
dubbo:更高(RPC 协议序列化和传输效率优于 HTTP)
openfeign:较低(HTTP 协议封装冗余,序列化开销大)
(5)生态依赖
dubbo:独立框架,可与 Spring 整合,但不依赖 Spring Cloud
openfeign:强依赖 Spring Cloud 生态(需配合 Spring Boot、Spring Cloud 核心组件)
(6)服务治理能力
dubbo:内置丰富的治理功能(负载均衡、熔断、降级等)
openfeign:需依赖 Spring Cloud 其他组件(如 Resilience4j 实现熔断,Ribbon 实现负载均衡)
(7)适用场景
dubbo:高性能要求的内部服务通信(如金融、电商核心服务)
openfeign:简单的跨服务 HTTP 调用,适合前后端分离或轻量级微服务

【三】Dubbo 整合 Nacos 实战案例

前提:安装并启动 Nacos

【1】服务提供者(Provider)实现

(1)引入依赖(Maven pom.xml)

<!-- Spring Boot 基础依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><!-- Dubbo 核心依赖 -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.0</version>
</dependency><!-- Dubbo 整合 Nacos 注册中心 -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>3.2.0</version>
</dependency><!-- Nacos 客户端依赖 -->
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.2.3</version>
</dependency>

(2)配置文件(application.yml)

spring:application:name: dubbo-provider-demo  # 服务名称dubbo:application:name: dubbo-provider-demo  # Dubbo 应用名registry:address: nacos://localhost:8848  # Nacos 注册中心地址protocol:name: dubbo  # 通信协议port: 20880  # 服务暴露端口scan:base-packages: com.example.provider.service  # 扫描服务实现类的包路径

(3)定义服务接口(需被消费者依赖)

// 接口需单独打包,供消费者引入
package com.example.common.service;public interface UserService {String getUsername(Long id);
}

(4)实现服务接口

package com.example.provider.service;import com.example.common.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;// 标记为 Dubbo 服务,自动注册到 Nacos
@DubboService
public class UserServiceImpl implements UserService {@Overridepublic String getUsername(Long id) {return "User_" + id;  // 模拟返回用户名称}
}

(5)启动类

package com.example.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DubboProviderApplication {public static void main(String[] args) {SpringApplication.run(DubboProviderApplication.class, args);}
}

【2】服务消费者(Consumer)实现

(1)引入依赖(同 Provider,需额外引入接口依赖)

<!-- 引入服务接口依赖(本地或私服) -->
<dependency><groupId>com.example</groupId><artifactId>common-service</artifactId><version>1.0.0</version>
</dependency>

(2)配置文件(application.yml)

spring:application:name: dubbo-consumer-demodubbo:application:name: dubbo-consumer-demoregistry:address: nacos://localhost:8848  # 同 Provider 的 Nacos 地址

(3)调用远程服务

package com.example.consumer.controller;import com.example.common.service.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {// 引用 Dubbo 服务(自动从 Nacos 发现 Provider)@DubboReferenceprivate UserService userService;@GetMapping("/user/{id}")public String getUsername(@PathVariable Long id) {// 调用远程服务return userService.getUsername(id);}
}

(4)启动类

package com.example.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DubboConsumerApplication {public static void main(String[] args) {SpringApplication.run(DubboConsumerApplication.class, args);}
}

【3】验证

启动 Provider 和 Consumer 后,访问 Nacos 控制台,在「服务列表」中可看到 dubbo-provider-demo 已注册。
调用 Consumer 接口 http://localhost:8080/user/1,返回 User_1,说明调用成功。

【4】总结

(1)Dubbo 基于 RPC 协议,性能优异,适合对通信效率要求高的内部服务,需单独处理服务治理。
(2)OpenFeign 基于 HTTP 协议,依赖 Spring Cloud 生态,适合简单的跨服务调用,整合成本低。

两者均可通过 Nacos 实现服务注册与发现,Nacos 作为注册中心时,需在配置中指定其地址,并确保服务启动后成功注册。

http://www.dtcms.com/a/343895.html

相关文章:

  • 零基础从头教学Linux(Day 18)
  • Slither 审计自己写的智能合约
  • 《R for Data Science (2e)》免费中文翻译 (第5章) --- Data tidying
  • 园区 “一表多属” 电仪表能碳数据归集与编码实施文档
  • 《LINUX系统编程》笔记p3
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记与代码示例:XILINX UART控制器详解:特性与功能
  • 新手向:计算机视觉入门OpenCV实战项目
  • elasticsearch 7.x elasticsearch 使用scroll滚动查询一页,删除一页,影响后面滚动的查询吗
  • 【LeetCode热题100道笔记+动画】最大子数组和
  • 任务同步和锁
  • 基于django/python的服装销售系统平台/服装购物系统/基于django/python的服装商城
  • sqli-labs通关笔记-第61关 GET字符型报错注入(单引号双括号闭合 限制5次探测机会)
  • 基于Django的学校实验室预约管理系统/基于python的实验室管理系统的设计与实现#python#django#FLASK
  • JAVA基础-java虚拟机
  • uniapp googlepay支付 内购项目
  • 豆包AI PPT与秒出PPT对比评测:谁更适合你?
  • 计算机毕设选题推荐 基于Spark的家庭能源消耗智能分析与可视化系统 基于机器学习的家庭能源消耗预测与可视化系统源码
  • Python办公之Excel(openpyxl)、PPT(python-pptx)、Word(python-docx)
  • 2026年计算机毕设推荐:基于大数据的慢性肾病数据可视化分析系统技术选型指南【Hadoop、spark、python】
  • 使用PPT进行科研绘图过程中常用的快捷键
  • 日志logging学习(1)
  • Gemini 2.5 Flash-Lite与 DeepSeek-V3 深度对比:谁在性价比上更胜一筹?
  • 【typenum】 21 类型级别计算最大公约数(Gcd)
  • map和set的使⽤
  • 52 C++ 现代C++编程艺术1-禁止隐式转换关键字explicit
  • Qt中用于图像缩放的核⼼⽅法QPixmap::scaled
  • 编写Linux下设备驱动时两种方案:内核态驱动开发和用户态驱动开发
  • --- 使用OpenFeign来优雅的对服务进行调用 ---
  • vue2怎么修改el-table样式
  • 金融风控AI引擎:实时反欺诈系统的架构设计与实现