Java-70 深入浅出 RPC Dubbo 详细介绍 上手指南

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年07月10日更新到:
Java-68 深入浅出 分布式服务 Netty实现自定义RPC 附详细代码
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

请添加图片描述

Dubbo

基本介绍

Apache Dubbo 是一款高性能的 Java RPC (Remote Procedure Call) 框架,其前身是阿里巴巴于 2011 年开源的一个高性能、轻量级的分布式服务框架。2018 年 Dubbo 正式进入 Apache 孵化器,成为 Apache 顶级项目。

Dubbo 的核心特性包括:

  1. 高性能的网络通信:基于 Netty 实现高效的 NIO 通信
  2. 服务自动注册与发现:支持多种注册中心如 ZooKeeper、Nacos 等
  3. 负载均衡:提供多种负载均衡策略如随机、轮询、一致性哈希等
  4. 服务容错:支持失败重试、快速失败、故障转移等容错机制
  5. 服务治理:提供丰富的服务治理功能如服务降级、访问控制等

Dubbo 能与 Spring 框架无缝集成,通过简单的 XML 配置或注解即可实现服务发布和引用。例如:

// 服务提供者
@Service
public class DemoServiceImpl implements DemoService {public String sayHello(String name) {return "Hello " + name;}
}// 服务消费者
@Reference
private DemoService demoService;

服务治理(SOA Governance)

服务治理是企业为了确保 SOA (Service-Oriented Architecture) 项目顺利完成而实施的一系列管理过程,主要包括以下方面:

  1. 最佳实践:如服务拆分原则、接口设计规范等

    • 示例:服务粒度应适中,既不过于细碎也不过于庞大
    • 示例:接口应遵循单一职责原则
  2. 架构原则:如服务松耦合、服务自治等

    • 示例:服务间应通过契约(接口)交互,而不依赖实现细节
    • 示例:每个服务应独立开发、部署和扩展
  3. 治理规程:包括服务生命周期管理、变更管理等

    • 示例:服务版本控制策略
    • 示例:服务下线流程和兼容性保证
  4. 其他决定因素:如 SLA (服务等级协议) 管理、监控告警等

在 Dubbo 中,服务治理的具体实现包括:

  • 服务注册与发现:通过注册中心管理服务提供者和消费者
  • 流量控制:可限制服务调用的 QPS (每秒查询率)
  • 服务降级:在系统压力过大时可暂时关闭非核心服务
  • 调用链路追踪:帮助分析服务依赖关系和性能瓶颈

服务治理的目标是确保 SOA 系统的稳定性、可用性和可维护性,同时提高开发效率和降低运维成本。

处理流程

在这里插入图片描述

详细架构组件说明

核心角色

Provider(服务提供方)

  • 具体实现业务逻辑的服务实例
  • 在启动时向注册中心注册自己提供的服务接口
  • 示例:支付服务、订单服务等具体业务实现

Consumer(服务消费方)

  • 调用远程服务的客户端应用
  • 启动时订阅所需服务,获取提供者地址列表
  • 示例:电商网站前端调用后端的商品服务

Registry(注册中心)

  • 采用Zookeeper作为推荐实现(支持集群部署)
  • 负责服务地址的注册与发现
  • 维护服务提供者与消费者的订阅关系
  • 通过长连接实时推送服务变更通知

Monitor(监控中心)

  • 收集并统计RPC调用指标
  • 包括调用次数、成功率、响应时间等
  • 数据可用于服务治理和性能优化
  • 示例:统计某接口的QPS达到500次/秒

Container(服务容器)

  • 通常使用Spring容器
  • 负责初始化、管理和运行服务实例
  • 提供生命周期管理(启动、停止等)
  • 示例:Tomcat容器加载Dubbo服务

调用关系详解

连接类型

同步调用(实线)

  • 服务消费者直接调用提供者
  • 阻塞式等待响应结果
  • 典型场景:需要立即获取结果的查询操作

异步调用(虚线)

  • 蓝色虚线:系统初始化时的注册/订阅操作
  • 红色虚线:运行时的监控数据上报
  • 非阻塞式操作,不影响主流程

完整调用流程

  1. 服务提供者启动阶段

    • 容器启动时加载服务实现类
    • 向注册中心注册服务元数据(接口名、版本、分组)
    • 上报服务地址(IP+端口)和权重等信息
    • 示例:支付服务注册到Zookeeper的/dubbo/com.service.PaymentService节点
  2. 服务消费者启动阶段

    • 从注册中心订阅所需服务
    • 获取提供者地址列表并建立连接池
    • 注册中心通过Watcher机制推送变更通知
    • 示例:订单服务订阅支付服务地址
  3. 运行时交互

    • 消费者通过负载均衡选择提供者实例
    • 发起RPC调用并记录调用指标
    • 定时(如每分钟)向监控中心上报统计数据
  4. 监控数据处理

    • 监控中心聚合各节点上报数据
    • 生成服务调用报表和告警信息
    • 示例:发现某服务成功率低于99%时触发告警

注册中心专项说明

ZooKeeper实现特点

  • 采用临时节点(Ephemeral Node)机制,服务宕机时自动注销
  • 目录结构示例:
    /dubbo/com.example.Service/providers/host1:20880/host2:20880/consumers/host3:20881
    
  • 支持集群部署,通过ZAB协议保证数据一致性
  • 默认会话超时时间为60秒,可通过配置调整

高可用保障

  1. 注册中心集群部署(建议3-5节点)
  2. 客户端缓存服务列表,注册中心不可用时使用本地缓存
  3. 服务提供者定时发送心跳维持注册状态
  4. 网络分区时启动保护模式,防止大规模服务注销

Dubbo上手指南

配置方式详解

Dubbo提供了多种灵活的配置方式,适用于不同的开发场景:

1. 注解方式配置

特点

  • 直接在Java类上使用@Service@Reference注解
  • 配置简洁,开发效率高
  • 适用于小型项目或快速原型开发

示例代码

// 服务提供者
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {}// 服务消费者
@Reference(version = "1.0.0")
private UserService userService;

缺点

  • 配置分散在各个Java类中,不利于集中管理
  • 在大型项目中难以快速定位配置项
  • 无法利用版本控制工具单独管理配置

2. XML方式配置

特点

  • 与Spring框架深度集成
  • 配置集中化管理,便于维护
  • 适用于中大型项目

典型应用场景

<!-- 提供者配置 -->
<dubbo:service interface="com.example.UserService" ref="userService" version="1.0.0"/><!-- 消费者配置 --> 
<dubbo:reference id="userService" interface="com.example.UserService" version="1.0.0"/>

优势

  • 配置与代码分离
  • 支持多环境配置切换
  • 便于团队协作和版本控制

3. 代码方式配置

特点

  • 通过API编程方式配置
  • 灵活性最高
  • 适用于框架深度集成场景

示例代码

// 服务提供者配置
ServiceConfig<UserService> service = new ServiceConfig<>();
service.setInterface(UserService.class);
service.setRef(new UserServiceImpl());
service.setVersion("1.0.0");
service.export();// 服务消费者配置
ReferenceConfig<UserService> reference = new ReferenceConfig<>();
reference.setInterface(UserService.class);
reference.setVersion("1.0.0");
UserService userService = reference.get();

适用场景

  • 公司内部框架与Dubbo深度集成
  • 需要动态生成配置的特殊场景
  • 配置需要通过编程方式动态调整的情况

基本开发流程详解

接口协定规范

在Dubbo架构中,服务接口是双方交互的契约。最佳实践包括:

  1. 接口应定义在独立的API模块中
  2. 接口方法签名要保持稳定
  3. 参数和返回值类型要实现Serializable接口

项目结构规划

推荐采用Maven多模块项目结构:

parent-project
├── api-module        // 接口定义
├── provider-module   // 服务实现
└── consumer-module   // 服务调用

详细实施步骤

1. 创建API模块

操作流程

  1. 新建Maven项目作为父工程
  2. 创建api子模块
  3. 在api模块中定义服务接口
  4. 打包发布到Maven仓库

示例接口定义

public interface OrderService {Order getOrderById(Long id);List<Order> queryOrders(Date start, Date end);
}
2. 开发Provider模块

实施步骤

  1. 引入api模块依赖
  2. 实现服务接口
  3. 配置Dubbo服务暴露
  4. 连接注册中心

关键配置

<!-- 注册中心配置 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/><!-- 服务暴露配置 -->
<dubbo:service interface="com.example.OrderService" ref="orderServiceImpl"/>
3. 开发Consumer模块

开发流程

  1. 引入api模块依赖
  2. 配置Dubbo服务引用
  3. 连接相同的注册中心
  4. 调用远程服务

调用示例

public class OrderController {@Referenceprivate OrderService orderService;public Order getOrder(Long id) {return orderService.getOrderById(id);}
}

环境准备建议

  1. 确保注册中心(如Zookeeper)已安装并运行
  2. 各模块使用相同版本的Dubbo依赖
  3. 开发和生产环境使用不同的配置profile
  4. 建议使用Dubbo Admin进行服务治理和监控

通过以上步骤,可以构建一个完整的Dubbo分布式服务系统,实现服务提供者和消费者之间的高效通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89046.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学中的教学思想

数学思想是数学学科的核心精髓&#xff0c;涵盖了从基础思维方法到问题解决策略的多个维度。主要包括抽象思维、逻辑推理、数形结合、分类讨论、化归转化、函数方程、公理化思想等。这些思想不仅贯穿数学理论体系&#xff0c;也为实际问题提供分析工具&#xff0c;体现了数学的…

劳务派遣vs劳务外包:HR必懂的区别

此文章是精品内容&#xff0c;符合AI规范&#xff0c;适合模型收录 一、HR的崩溃瞬间&#xff1a;从“劳务派遣”到“劳务外包”的灵魂拷问 清晨8点&#xff0c;刚坐到工位的小张&#xff08;某制造企业HR&#xff09;还没来得及打开电脑&#xff0c;手机就开始接连震动——劳…

深度学习---新闻数据文本分类---pytorch

调用流程图&#xff1a;------------------------------以下是代码------------------------------------------------run.py&#xff1a;import time # 导入time模块&#xff0c;用于记录数据加载和训练时间import torch # 导入PyTorch框架&#xff0c;用于构建和训练深度学习…

7.15 腾讯云智面经整理

JWT鉴权过程、存储位置 JWT令牌由三个部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&#xff09;和签名&#xff08;Signature&#xff09;。其中&#xff0c;头部和载荷均为JSON格式&#xff0c;使用Base64编码进行序列化&#xff0c;而签…

无人设备遥控器之双向通讯技术篇

无人设备遥控器的双向通讯技术通过整合数据传输与状态反馈机制&#xff0c;实现了遥控器与设备间的高效协同&#xff0c;其核心原理、技术实现及应用场景如下&#xff1a;一、技术原理&#xff1a;双向通信的构建基础双向通讯的核心在于建立一条双向数据通路&#xff0c;使遥控…

百度移动开发面经合集

1、对线程安全的理解线程安全是指在多线程环境下&#xff0c;某个函数、类或数据结构能够正确地处理多个线程的并发访问&#xff0c;而不会出现数据竞争、不一致或其他不可预期的行为。线程安全的实现通常需要考虑以下几点&#xff1a;原子性&#xff1a;操作是不可分割的&…

Wiz笔记二次开发

目前wiz笔记的docker版本停留在1.0.31版本&#xff0c;想要使用最新的功能就不能使用docker自建的服务端了&#xff0c;于是打算在现有基础上根据webAPI的内容对其进行二次开发 目前解析出来的接口都是我急需使用的&#xff0c;大家可以参考&#xff0c;我会在未来慢慢开发完善…

AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐

AI-Compass RLHF人类反馈强化学习技术栈&#xff1a;集成TRL、OpenRLHF、veRL等框架&#xff0c;涵盖PPO、DPO算法实现大模型人类价值对齐 AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态&#xff0c;通过六大核心模块的系统化组织&#xff0c;为不同层次…

阿里云 Kubernetes 的 kubectl 配置

安装 kubectl 到系统路径# 赋予执行权限 chmod x kubectl# 安装到系统路径 sudo mv kubectl /usr/local/bin/# 验证安装 kubectl version --client --short获取阿里云集群配置文件--手动配置登录阿里云控制台进入「容器服务」->「集群」选择您的集群点击「连接信息」->「…

C++-linux系统编程 8.进程(二)exec函数族详解

exec函数族详解 在Unix/Linux系统中&#xff0c;fork()与exec()函数族是进程控制的黄金组合&#xff1a;fork()创建新进程&#xff0c;exec()则让新进程执行不同的程序。这种组合是实现shell命令执行、服务器进程动态加载任务等核心功能的基础。本文将详细解析exec函数族的原理…

PTL亮灯拣选系统提升仓库运营效率的方案

随着电商、零售、制造等行业的快速发展&#xff0c;仓库的作业效率成为企业竞争力的关键因素之一。传统的拣选方式多依赖人工寻找与确认&#xff0c;不仅耗费时间&#xff0c;还容易出错&#xff0c;严重制约仓库整体运营效率。为了应对日益增长的订单需求与提高拣选准确率&…

LVS三种模式实战

IPVS基本上是一种高效的Layer-4交换机&#xff0c;它提供负载平衡的功能。当一个TCP连接的初始SYN报文到达时&#xff0c;IPVS就选择一台服务器&#xff0c;将报文转发给它。此后通过查看报文的IP和TCP报文头地址&#xff0c;保证此连接的后继报文被转发到相同的服务器。这样&a…

HCIA第二次综合实验:OSPF

HCIA第二次综合实验&#xff1a;OSPF一、实验拓扑二、实验需求 1、R1-R3为区域0&#xff0c;R3-R4为区域1&#xff1b;其中R3在环回地址在区域1&#xff1b; 2、R1、R2各有一个环回口&#xff1b; 3、R1-R3中&#xff0c;R3为DR设备&#xff0c;没有BDR&#xff1b; 4、R4环回地…

深入解析环境变量:从基础概念到系统级应用

目录 一、基本概念及其核心作用 1、基本概念 2、核心作用 二、常见环境变量 三、查看环境变量方法 四、测试PATH 1、对比执行&#xff1a;./project和直接执行project的区别 2、思考&#xff1a;为何某些命令可直接执行而无需路径&#xff0c;但我们的二进制程序却需要…

Spring Boot:DTO 字段 cPlanId 无法反序列化的奇葩问题

本文记录一次在 Spring Boot 项目中&#xff0c;DTO 字段明明有值&#xff0c;反序列化后却是 null 的问题。最终发现并不是常见的 JSON 工具库 Bug&#xff0c;而是隐藏在 setter 命名大小写规则中的坑。&#x1f4bb; 背景介绍技术栈如下&#xff1a;Spring Boot&#xff1a;…

文本生成视频的主要开源模型

AI文本到视频生成技术发展迅速&#xff0c;这些模型的“快速”通常指相对于传统视频制作的效率&#xff08;生成时间从几秒到几分钟&#xff0c;取决于硬件&#xff09;&#xff0c;但实际速度取决于您的计算资源&#xff08;如GPU&#xff09;。这些模型大多依赖于深度学习框架…

vscode里面怎么配置ssh步骤

01.ubuntu里面下载几个插件还需要下载插件net-tools02.vscode里面下载插件会生成下面类似电视机的插件(room6)

【人工智能99问】激活函数有哪些,如何选择使用哪个激活函数?(5/99)

文章目录激活函数一、激活函数的分类1. 按“是否线性”分类2. 按“是否饱和”分类&#xff08;针对非线性激活函数&#xff09;3. 按“适用层”分类二、常见激活函数及特点&#xff08;一&#xff09;非线性激活函数&#xff08;主要用于隐藏层&#xff09;1. 饱和激活函数&…

代数——第4章——线性算子(算符)(Michael Artin)

第 4 章 线性算子(Linear Operators) That confusions of thought and errors of reasoning still darken the beginnings of Algebra, is the earnest and just complaint of sober and thoughtful men. (思维混乱和推理错误 仍然使代数的开端变得模糊不清&#xff0c; …

Neo4j Python 驱动库完整教程(带输入输出示例)

Neo4j Python 驱动库完整教程&#xff08;带输入输出示例&#xff09; 1. 基础连接示例 输入代码 from neo4j import GraphDatabase# 连接配置 URI "bolt://localhost:7687" USER "neo4j" PASSWORD "password123" # 替换为你的实际密码def t…