当前位置: 首页 > 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.xdnf.cn/news/1347229.html

相关文章:

  • RK3506 开发板:重塑嵌入式系统领域的新标杆
  • 整数规划学习总结
  • 靶机 - SAR
  • 【学习记录】c完整线程池实现
  • 集成算法学习笔记
  • C++ OpenGL中几个常见库及其区别
  • Python实现从Parquet文件生成Redshift表并存储SQL语句
  • Eigen 中Sparse 模块的简单介绍和实战使用示例
  • (纯新手教学)计算机视觉(opencv)实战八——四种边缘检测详解:Sobel、Scharr、Laplacian、Canny
  • Day11 数据统计 图形报表
  • RKLLM 模型转换从0开始
  • vagrant怎么在宿主机操作虚拟机里面的系统管理和软件安装
  • 2025软件供应链安全技术路线未来趋势预测
  • vim的使用
  • Retrieval-Augmented Generation(RAG)
  • 为什么访问HTTPS站点时,会发生SSL证书错误
  • Trie 树(字典树)
  • 8月22号打卡
  • FFmpeg及 RTSP、RTMP
  • GitGithub相关(自用,持续更新update 8/23)
  • 文件下载和文件上传漏洞
  • LeetCode第1695题 - 删除子数组的最大得分
  • CSS自定义属性(CSS变量)
  • Jenkins发布spring项目踩坑——nohup java -jar发布后显示成功,但实际jps查询并未运行
  • kubernetes中pod的管理及优化
  • Python打卡Day49 CBAM注意力
  • Apache Ozone 2.0.0集群部署
  • 微信原生下载互联网oss资源保存到本地
  • CCleaner v1.2.3.4 中文解锁注册版,系统优化,隐私保护,极速清理
  • Unreal Engine Class System