微服务实战系列之Dubbo(上)
前言
随着一年一度
冬至的到来,2023的步伐也将远去。而博主的系列文章,也将从今天起,越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面,无论使用什么框架、组件或工具,皆可拿来用之。
那么,今天博主将推出微服务开发框架系列文章,欢迎各位盆友继续跟着博主的步伐,快乐徜徉于微服务的世界。Let’s Go!
本期主题,博主将带着各位盆友,聚焦在经典的RPC框架:Dubbo,一个盛行于互联网平台的宠儿。

一、读懂RPC
我们提到Dubbo,那不得不提RPC(远程过程调用,Remote Procedure Call缩写)。首先了解一下什么是RPC:
RPC是一个通信协议,允许客户端通过网络调用非本地的服务,即像调用本地服务一样,调用一个“远程”的网络服务。一般用于构建分布式平台,实现跨网络访问通信。
1. 主要特点
- 经典3跨
无需关注“远程”服务如何实现,支持3跨(跨网络、跨平台、跨语言)。只要一个Client,根据RPC通信规范,即可叩开一个Remote Server的大门。此乃经典的C/S程序架构模式。 - 服务可重用性
既然满足3跨,那可了不起了。随时随地,任你“驰骋”。只要Server有,统统皆拿走。此刻,博主不禁暗然自喜中…
2. 核心组件
我们已知RPC是一个通信过程的协议,如使用它,必须遵循相应的“制度”,否则,乱了“江湖规矩”。满足RPC调用,必须具备以下四个模块:
| 模块名称 | 模块简介 |
|---|---|
| Client | 一个客户端,可发起远程调用的程序,一般称之为“消费者”。 |
| Client Stub | 一个客户端的请求存根,记录调用的服务信息,实现请求信息“编码”和服务端返回信息的“解码”。 |
| Server | 一个服务端,可提供服务的正在运行的程序,一般称之为“生产者”。 |
| Server Stub | 一个服务端的响应存根,记录接收的客户端信息,实现客户端数据“解码”;发起服务调用并向Client Stub返回经过“编码”的信息。 |
具体交互流程图,示意如下,请参考:

3. 关键技术
我们可能知道或至少了解,通信的基本原理:

首先需要通信的双方,其次需要一个通信的媒介或载体,最后是信息内容。当然该过程存在一定的干扰项(比如平台、网络、语言等等),因此一定程度上存在可能“失真”的风险。
那么RPC既然是一个通信协议,那也基本遵循该原理,核心技术包括:
–序列化和反序列化(Sequence)
将对象转换为二进制或逆向转换,即实现RPC过程中的编码和解码的过程。
–动态代理(Proxy)
动态代理是一种在运行时创建代理类的机制,动态代理可以在不修改源代码的情况下,在运行时为某个接口动态生成实现类,并且可以拦截接口中的方法调用,从而实现一些特殊的功能.。
比如AOP、日志、注解等皆使用了动态代理技术实现。而在RPC中,主要用它完成调用过程的核心处理逻辑(2个Stub皆采用该技术),包括封装请求信息、发起调用和返回响应信息等传输过程实现。
到此为止,我想各位盆友已对RPC有了深刻的认识和了解。那么接下来,博主顺势而为,继续带着大家走进人见人爱的Dubbo。
二、走进Dubbo
Apache Dubbo is a high-performance, Java-based open-source RPC framework.
翻译成大白话:Dubbo是一个基于JAVA的高性能开源RPC框架。
1. 架构图

通过Dubbo架构图(来自官网)观察,是不是很很高效很经典?一个标准的端到端的服务框架。
| 组件名称 | 组件含义 |
|---|---|
| Consumer | 服务消费者,用于使用服务 |
| Provider | 服务提供者,也叫生产者,用于提供服务 |
| ZooKeeper | 用于满足Dubbo服务治理的工具,称之为服务注册中心 |
当然,Dubbo 在微服务应用开发框架之上抽象了一套 RPC 服务定义、暴露、调用与治理的编程范式,所以实际上它的服务能力包含了服务治理内容,可参考下图(来自官网):

2. 关键特性
- Transparent interface based RPC
提供基于RPC的透明接口
- Intelligent load balancing
提供智能的负载均衡策略
- Automatic service registration and discovery
提供自动的服务注册和发现能力
- High extensibility
提供较高的扩展能力
- Runtime traffic routing
提供运行时的服务管理和路由能力
- Visualized service governance
提供可视化服务治理能力
3. 交互原理
通过1、2两方面总结,Dubbo可以说深刻体现了什么是发布、什么是订阅,进而探究为实现高性能分布式系统,Dubbo到底是如何工作的。

关键步骤:
3.1 注册服务
服务提供者Provider在启动时,向注册中心发布自己的服务。
3.2 订阅服务
服务消费者Consumer在启动时,从注册中心订阅自己的服务。
3.3 调用服务
订阅完成后,即可通过业务接口,进行服务调用。
3.4 服务治理
包括服务调用、服务运维、服务限流、熔断等。
结语
作为支持分布式开发的高性能JAVA框架,Dubbo显然具备很高的使用价值。不仅推动了微服务一时兴起的潮流,也帮助使用者快速构建自己微服务体系提供了很好的参考坐标。
好了,本期主题到此结束,欢迎订阅与交流!
历史回顾
- 微服务实战系列之ZooKeeper(实践篇)
- 微服务实战系列之ZooKeeper(下)
- 微服务实战系列之ZooKeeper(中)
- 微服务实战系列之ZooKeeper(上)
- 微服务实战系列之MQ
- 微服务实战系列之通信
- 微服务实战系列之J2Cache
- 微服务实战系列之Cache(技巧篇)
- 微服务实战系列之MemCache
- 微服务实战系列之EhCache
- 微服务实战系列之Redis
- 微服务实战系列之Cache
- 微服务实战系列之Nginx(技巧篇)
- 微服务实战系列之Nginx
- 微服务实战系列之Feign
- 微服务实战系列之Sentinel
- 微服务实战系列之Token
- 微服务实战系列之Nacos
- 微服务实战系列之Gateway
- 微服务实战系列之加密RSA
- 微服务实战系列之签名Sign

相关文章:
微服务实战系列之Dubbo(上)
前言 随着一年一度冬至的到来,2023的步伐也将远去。而博主的系列文章,也将从今天起,越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面,无论使用什么框架、组件或工具,皆可拿来用之。 那么…...
一篇讲透:箭头函数、普通函数有什么区别
前言 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步! 🍅 个人主页:南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…...
第40节: Vue3 注册生命周期钩子
在UniApp中使用Vue3框架时,你可以注册生命周期钩子来执行特定的逻辑。以下是一个示例,演示了如何在UniApp中使用Vue3框架注册生命周期钩子: <template> <view> <p>{{ message }}</p> </view> </templ…...
docker给容器分配固定ip
1.为 Docker 容器设置一个固定的 IP 地址 要为 Docker 容器设置一个固定的 IP 地址,有几种常见的方法: 使用自定义网络和静态 IP 地址: 你可以创建一个自定义的 Docker 网络,并在这个网络上为容器分配静态 IP 地址。首先&#x…...
Hadoop入门学习笔记——二、在虚拟机里部署HDFS集群
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 二、在虚拟机里部署HDFS集群2.1. 部署node1虚拟机2.2. 部…...
Spring之国际化:i18n
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...
Java读取类路径下的JSON文件并转换为实体列表
使用 Jackson 库来读取类路径下的 JSON 文件并将其转换为对应实体列表。 在实际开发中可能在本地环境中需要调用别人的接口,别人的接口如果还没开发好或者本地环境不支持外部接口调用的时候,可以读取json文件来造数据,方便调试。 以Student…...
复分析——第1章——复分析准备知识(E.M. Stein R. Shakarchi)
第一章 复分析准备知识 (Preliminaries to Complex Analysis) The sweeping development of mathematics during the last two centuries is due in large part to the introduction of complex numbers; paradoxically, this is based on the seemingly absurd no…...
C++ 继承方式
C++ 继承方式 实验介绍 本章节将学习权限关键字的使用,并将一一举例验证 public、protected、private 的使用,学完本小节实验后将彻底掌握权限关键字的使用。 知识点 权限关键字使用位置继承中的权限关键字public 继承protected 继承private 继承权限关键字使用位置 示例…...
华为云Windows Server服务器下,Node使用pm2-logrotate分割pm2日志,解决pm2日志内存占用过高的问题。
一、简介 PM2 是一个守护进程管理器,它将帮助您管理和保持您的应用程序在线。PM2 入门很简单,它以简单直观的 CLI 形式提供,可通过 NPM 安装。官网地址:https://pm2.keymetrics.io/ 二、问题:pm2日志内存占用过高&am…...
web3风险投资公司之Electric Capital
文章目录 什么是 Electric CapitalElectric团队 Electric Capital 开发者报告参考 什么是 Electric Capital 官网:https://www.electriccapital.com/ 官方github:https://github.com/electric-capital Electric Capital 是一家投资于加密货币、区块链企…...
为什么员工都非常抵触「绩效考核」,该怎么办呢?
员工抵制绩效考核的原因可能有很多,其中一些常见的原因包括: 考核方式不公正:如果考核方式不够客观、公正,或者与员工的实际工作情况不符,员工就会对绩效考核产生不信任感,从而产生抵触情绪。 工作压力增大…...
[node]Node.js 模块系统
[node]模块系统 Node.js中的模块系统模块的使用模块的导入模块的导出导出多个值导出默认值导出可传参的函数 文件查找策略从文件模块缓存中加载从原生模块加载从文件加载 Node.js中的模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 …...
【数据结构】什么是二叉树?
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌二叉树的定义 📌二叉树的特点 📌特殊二叉树 📌二叉树的性质 📌二叉树的存储结构 📌二叉树…...
C#教程(四):多态
1、介绍 1.1 什么是多态 在C#中,多态性(Polymorphism)是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息做出响应,即同一个方法可以在不同的对象上产生不同的行为。C#中的多态性可以通过以下几种方式实现…...
电力系统风储联合一次调频MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 简介: 同一电力系统在不同风电渗透率下遭受同一负荷扰动时,其频率变化规律所示: (1)随着电力系统中风电渗透率的不断提高,风电零惯性响…...
《PCI Express体系结构导读》随记 —— 内容与作者简介
本书内容介绍 本书讲述了PCI与PCI Express总线相关的最为基础的内容,并介绍了一些必要的、与PCI总线相关的处理器体系结构知识,这也是本书的重点所在。深入理解处理器体系结构是理解PCI与PCI Express总线的重要基础。 读者通过对本书的学习,…...
C#字典和列表转LuaTable
C#字典和列表转LuaTable 将C#Dictionary转成luaTable将C#List转成luaTable 将C#Dictionary转成luaTable function DicToLuaTable(Dic)--将C#的Dic转成Lua的Tablelocal dic {}if Dic thenlocal iter Dic:GetEnumerator()while iter:MoveNext() dolocal k iter.Current.Keylo…...
动态内存管理(1)
目录 1. 为什么存在动态内存分配 2. 动态内存函数的介绍 2.2 calloc 2.3 realloc 3. 常见的动态内存错误 3.1 对NULL指针的解引用操作 3.2 对动态开辟空间的越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态开辟内存的一部分 3.5 对同一块动…...
ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集
文章目录 ThunderSearch简介1 项目地址2 使用方式2.1 配置文件config.json说明2.2 构建和运行 3 使用式例 ThunderSearch简介 ThunderSearch(闪电搜索器)是一款使用多个(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake网络空间搜索引擎】网络空间搜索引…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
