高性能RPC框架—----------------------Dubbo一站式快速入门
一、Web应用架构的演变随着互联网的发展网站应用的规模不断扩大Web应用架构也在不断的演变主要经历了四个阶段1. 单一应用架构当网站访问量很小时只需要一个应用程序将所有的功能都部署在一起以减少部署节点和成本。关键问题简化数据库操作数据访问框架ORM是核心。适用场景小型网站、管理系统、简易办公系统。局限扩展性差不便于协同开发不利于升级维护2. 垂直应用架构当访问量逐渐增大单一应用单机负载太大此时可以增加服务器来进行负载均衡提高响应速度即集群。但是当增加的服务器到达一定数量时所带来的加速度会越来越小此时单纯的增加服务器已无法明显提升响应速度。此时需要将系统业务拆分成多个互不相关的系统分别部署在独立的服务器上以提升效率称为垂直应用。关键问题加速前端页面开发MVC框架MVVM。优点通过拆分项目的业务实现业务上的独立降低了开发和维护的难度便于协同开发提高了扩展性。局限每个垂直模块中都有相同的内容entity、dao、service、web公共资源无法复用且业务逻辑与界面无法分离。3. 分布式服务架构当垂直应用越来越多应用之间的交互无法避免有些业务系统无法完全拆分为独立系统。此时可以将核心业务抽取出来作为独立的服务Service逐渐的形成稳定的服务中心使前端应用能够更好的适应市场需要的变化。关键问题提高业务的利用以及整合分布式服务框架RPCRemote Procedure Call 远程过程调用。4. 流动计算架构当服务越来越多服务之间的调用和依赖关系也越来越复杂诞生了面向服务的架构体系SOAService-Oriented Architecture。容量的评估小服务资源的浪费等问题开始出现此时需要增加一个调度中心基于访问压力实时的管理集群容量提高集群利用率。关键问题资源调度和治理中心使用dubbozookeeper。二、RPC简介1. RPC是什么RPCRemote Procedure Call 远程过程调用。是一种进程间的通信方式它允许应用程序调用网络上的另一个应用程序中的方法对于服务的消费者而言无需了解远程调用的底层细节透明的2. 执行流程客户端发起调用请求客户端存根对请求参数接口、方法、参数等进行序列化封装客户端存根向服务器存根发送消息服务端存根对接收到的消息进行反序列化服务端存根发送请求调用本地方法服务器执行业务处理服务器返回处理结果服务端存根对处理结果进行序列化服务端存根将结果返回给客户端存根客户端存根对接收到的结果进行反序列化客户端存根将结果返回给客户端三、Dubbo简介1. Dubbo是什么Apache Dubbo是一款高性能的Java RPC框架由阿里巴巴开发开源贡献给Apache。提供了三个核心功能面向接口的远程方法调用智能容错和负载均衡服务自动注册和发现参考官网 http://dubbo.apache.org2. Dubbo体系结构执行流程Provider服务的提供者负责对外提供服务提供者在启动的时候需要向Registry注册自己能够提供的服务Consumer服务的消费者消费者在启动的时候需要向Registry订阅自己需要的服务Registry注册中心接受注册和订阅会异步的通知订阅者向消费者提供服务列表Monitor监控中心统计服务的调用次数和调用时间服务消费者和提供者会在内存中累计调用次数和调用时间定时每分钟向监控中心发送一次统计数据当消费者需要执行远程过程调用时会从Registry获取到服务地址列表基于负载均衡算法进行调用如果调用失败会重新选择新的提供者再次调用。四、使用Dubbo1. Spring版1.1 创建common工程创建entity和service接口。1.2 创建provider工程步骤添加依赖!--依赖于dubbo-common-- dependency groupIdcom.itany/groupId artifactIddubbo-common/artifactId version1.0-SNAPSHOT/version /dependency !--spring-- dependency groupIdorg.springframework/groupId artifactIdspring-core/artifactId version${springversion}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-beans/artifactId version${springversion}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${springversion}/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-expression/artifactId version${springversion}/version /dependency !--dubbo核心包-- dependency groupIdcom.alibaba/groupId artifactIddubbo/artifactId version2.6.2/version /dependency !--使用zookeeper作为注册中心在dubbo中会访问zookeeper-- dependency groupIdorg.apache.zookeeper/groupId artifactIdzookeeper/artifactId version3.4.13/version /dependency !--zookeeper的客户端实现-- dependency groupIdorg.apache.curator/groupId artifactIdcurator-framework/artifactId version4.0.1/version /dependency编写实现类public class UserServiceImpl implements UserService { Override public User findById(int id) { System.out.println(UserServiceImpl.findById); User user new User(); user.setId(id); user.setUsername(tom); user.setPassword(123); return user; } }配置dubbo!--配置当前dubbo应用程序的名称可自定义但必须唯一一般使用项目名-- dubbo:application namedubbo-provider/ !--指定注册中心地址-- dubbo:registry addresszookeeper://127.0.0.1:2181/ !--配置dubbo协议和端口通过该端口来提供服务-- dubbo:protocol namedubbo port8888/ !--指定要暴露的服务接口-- dubbo:service interfacecom.itany.service.UserService refuserService/ bean iduserService classcom.itany.service.impl.UserServiceImpl/1.3 创建consumer工程步骤添加依赖同1.2编写使用类Controller public class UserController { private UserService userService; public void setUserService(UserService userService) { this.userService userService; } public void findUser(){ User user userService.findById(1001); System.out.println(user); } }配置Dubbodubbo:application namedubbo-consumer/ dubbo:registry addresszookeeper://127.0.0.1:2181/ !--指定要引用的服务-- dubbo:reference iduserService interfacecom.itany.service.UserService/ bean classcom.itany.controller.UserController property nameuserService refuserService / /bean1.4 测试启动zookeeper编写并运行providerpublic static void main(String[] args) { ApplicationContext ac new ClassPathXmlApplicationContext(classpath:provider.xml); //阻塞线程 new Scanner(System.in).next(); }编写并运行consumerpublic static void main(String[] args) { ApplicationContext ac new ClassPathXmlApplicationContext(classpath:consumer.xml); UserController userController ac.getBean(UserController.class); userController.findUser(); //阻塞线程 new Scanner(System.in).next(); }2. Spring注解版2.1 改写provider!--dubbo组件的扫包-- dubbo:annotation packagecom.itany.service.impl/ !--spring组件的扫包-- context:component-scan base-packagecom.itany.service.impl/// 方式1 // Service // com.alibaba.dubbo.config.annotation.Service // 方式2 Component Service public class UserServiceImpl implements UserService { // 实现代码 }2.2 改写consumerdubbo:annotation packagecom.itany.controller/ context:component-scan base-packagecom.itany.controller/Controller public class UserController { // 使用dubbo的Reference注入远程服务对象 Reference private UserService userService; // 方法实现 }3. SpringBoot版3.1 创建provider工程步骤添加依赖!--依赖于dubbo-common-- dependency groupIdcom.itany/groupId artifactIddubbo-common/artifactId version1.0-SNAPSHOT/version /dependency !--dubbo的starter-- dependency groupIdcom.alibaba.boot/groupId artifactIddubbo-spring-boot-starter/artifactId version0.2.0/version /dependency编写实现类Component Service public class UserServiceImpl implements UserService { Override public User findById(int id) { User user new User(); user.setId(id); user.setUsername(alice); user.setPassword(123); return user; } }配置dubboserver: port: 8881 dubbo: application: name: boot-provider registry: address: zookeeper://127.0.0.1:2181 protocol: name: dubbo port: 8888启用dubboSpringBootApplication EnableDubbo //启用dubbo public class BootProviderApplication { public static void main(String[] args) { SpringApplication.run(BootProviderApplication.class, args); } }3.2 创建consumer步骤添加依赖同3.1编写使用类Controller RequestMapping(/user) public class UserController { Reference private UserService userService; RequestMapping(/findUser) public String findUser(int id, Model model) { User user userService.findById(id); model.addAttribute(user, user); return success; } }配置dubboserver: port: 8882 dubbo: application: name: boot-consumer registry: address: zookeeper://127.0.0.1:2181 spring: thymeleaf: cache: false五、配置dubbo1. 配置的覆盖关系dubbo属性可以配置在如下六个位置消费者引用方法处提供者暴露方法处消费者引用接口处提供者暴露接口处消费者全局配置处提供者全局配置处优先顺序方法级优先接口级次之全局配置再次之。如果级别一样则消费方优先提供方次之注建议由服务提供者设置超时时间。2. 常用配置配置项作用timeout超时时间单位为毫秒默认1000msretries重试次数不包括第一次调用默认为20表示不重试check启动时检查提供者是否存在true表示不存在时报错false表示启动时不检查默认为trueurl点对点直连服务提供者绕过注册中心以服务接口为单位六、监控中心1. dubbo-adminDubbo的管理控制台可以对提供者和消费者进行管理便于调试发现问题解决问题。1.1 下载dubbo-admin方式一从GitHub下载推荐访问Dubbo官方GitHub仓库GitHub - apache/dubbo-admin: The ops and reference implementation for Apache Dubbo. · GitHub点击页面右侧的Code按钮选择Download ZIP下载最新源码或者使用Git命令克隆git clone https://github.com/apache/dubbo-admin.git方式二从Apache官网下载访问Apache Dubbo官网Apache Dubbo在下载页面找到dubbo-admin的发布版本选择适合的版本下载通常为.zip或.tar.gz格式1.2 环境准备在部署dubbo-admin之前需要确保以下环境已就绪Java环境JDK 1.8或更高版本Maven3.5或更高版本用于源码编译ZooKeeper已安装并运行Dubbo的注册中心Node.js14.x或更高版本前端部分需要1.3 部署与启动步骤步骤1解压并进入项目目录# 解压下载的文件 unzip dubbo-admin-master.zip # 或 tar -zxvf dubbo-admin-xxx.tar.gz 进入项目目录 cd dubbo-admin步骤2修改配置文件找到配置文件dubbo-admin-server/src/main/resources/application.properties或application.yml修改以下关键配置# 注册中心地址根据实际情况修改 dubbo.registry.addresszookeeper://127.0.0.1:2181 管理控制台端口 server.port8080 数据库配置如果需要持久化 spring.datasource.urljdbc:mysql://localhost:3306/dubbo_admin?useUnicodetruecharacterEncodingutf-8 spring.datasource.usernameroot spring.datasource.password123456步骤3编译打包# 使用Maven进行编译打包 mvn clean package -Dmaven.test.skiptrue 编译成功后在target目录下会生成dubbo-admin-server-xxx.jar文件步骤4启动dubbo-admin# 方式一直接运行jar包 java -jar dubbo-admin-server/target/dubbo-admin-server-xxx.jar 方式二使用Spring Boot Maven插件启动 mvn spring-boot:run -pl dubbo-admin-server步骤5访问管理控制台启动成功后在浏览器中访问http://localhost:8080默认登录账号root默认登录密码root1.4 Docker方式部署可选如果使用Docker可以更快速地部署dubbo-admin# 拉取官方镜像 docker pull apache/dubbo-admin 运行容器 docker run -d --name dubbo-admin -p 8080:8080 -e admin.registry.addresszookeeper://宿主机IP:2181 -e admin.config-centerzookeeper://宿主机IP:2181 -e admin.metadata-report.addresszookeeper://宿主机IP:2181 apache/dubbo-admin1.5 主要功能说明登录dubbo-admin后可以查看以下主要功能服务治理查看所有注册的服务提供者和消费者服务测试在线测试Dubbo服务接口配置管理动态修改服务配置流量管理进行流量控制和服务降级监控统计查看服务调用统计和性能指标注意事项确保ZooKeeper服务已启动且dubbo-admin能正常连接生产环境建议修改默认账号密码根据实际网络环境调整配置文件中的IP和端口定期查看日志文件监控dubbo-admin运行状态七、总结与参考资料1. 总结本文系统性地介绍了Web应用架构的演变历程从单一应用架构到流动计算架构展示了随着业务规模扩大和技术发展架构模式如何逐步演进以满足更高的性能、可扩展性和可维护性需求。RPC远程过程调用作为分布式系统的核心技术通过客户端存根和服务端存根的协作实现了跨网络的方法调用透明化为分布式服务架构提供了基础通信机制。Apache Dubbo作为一款高性能的Java RPC框架在RPC基础上提供了完整的服务治理能力服务注册与发现通过注册中心实现服务的自动注册和发现负载均衡智能分配请求到多个服务提供者容错机制提供多种容错策略保证系统稳定性监控管理通过dubbo-admin实现服务的可视化管理和监控通过Spring、Spring注解和SpringBoot三种集成方式Dubbo能够灵活适应不同的开发场景为微服务架构提供了可靠的技术支撑。2. 参考资料Dubbo官方文档Apache Dubbo - Apache Dubbo官方网站包含完整的使用文档、API参考和最佳实践ZooKeeper官网Apache ZooKeeper - Apache ZooKeeper官方网站Dubbo常用的注册中心实现Dubbo GitHub仓库GitHub - apache/dubbo: The java implementation of Apache Dubbo. An RPC and microservice framework. · GitHub - Dubbo开源代码仓库包含最新源码和问题反馈Dubbo-admin GitHub仓库GitHub - apache/dubbo-admin: The ops and reference implementation for Apache Dubbo. · GitHub - Dubbo管理控制台源码技术博客Dubbo官方博客 - 包含Dubbo最新特性、版本更新和技术分享建议读者在实际项目中根据业务需求选择合适的架构模式并结合Dubbo的丰富功能构建稳定、高效的分布式系统。

相关新闻

构建个人项目脚手架:告别一次性脚本,打造可持续开发工作流

构建个人项目脚手架:告别一次性脚本,打造可持续开发工作流

最近在整理本地项目时,发现一个挺有意思的现象:很多开发者,包括我自己,都习惯性地把一些临时性的、探索性的代码脚本随手扔在某个文件夹里,然后……就没有然后了。这些脚本可能是一次性的数据处理、一个临时的API测试、…

2026/10/5 3:48:22 阅读更多 →
AI治理技术化实践:从公平性评估到可解释性分析的工程落地

AI治理技术化实践:从公平性评估到可解释性分析的工程落地

AI治理,到底应该写在代码里,还是写在纸面上?这是一个看似宏大、抽象,却与每一位开发者、产品经理和算法工程师都息息相关的问题。当我们在讨论AI治理时,很多人会立刻想到伦理委员会、白皮书、行业公约这些“纸面政策”…

2026/10/15 1:55:40 阅读更多 →
7/8螺纹气体防爆vs7/8-16unf粉尘防爆:连接器选型一张表讲透不踩坑

7/8螺纹气体防爆vs7/8-16unf粉尘防爆:连接器选型一张表讲透不踩坑

在石油化工、煤矿、粮食加工等爆炸性环境中,7/8螺纹连接器是常见的大电流接口。但在选型时,很多人分不清气体防爆(如Ex db、Ex eb)与粉尘防爆(如Ex tb、Ex tc)的差异,甚至误以为“防爆就是防爆&…

2026/10/17 5:33:32 阅读更多 →

最新新闻

大文件分片上传:原理、源码与断点续传实战指南

大文件分片上传:原理、源码与断点续传实战指南

一个2GB的视频文件,上传进度走到87%,手机切了个Wi-Fi,上传失败,用户回来发现进度条归零,气得直接在工单里开骂。这个场景我接手的内容管理后台里几乎每周都要上演一次。后来我把组件改成了大文件分片上传,配…

2026/10/18 5:20:39 阅读更多 →
1B参数如何减半压缩?Llama-3.2-1B-Instruct_rai_1.8.0_npu_16K的AWQ+UINT4量化原理

1B参数如何减半压缩?Llama-3.2-1B-Instruct_rai_1.8.0_npu_16K的AWQ+UINT4量化原理

【免费下载链接】Llama-3.2-1B-Instruct_rai_1.8.0_npu_16K 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Llama-3.2-1B-Instruct_rai_1.8.0_npu_16K 点击查看 免费下载 Llama-3.2-1B-Instruct_rai_1.8.0_npu_16K 是 AMD 面向 Ryzen AI 硬件发布的 Llama-3.2-…

2026/10/18 5:20:39 阅读更多 →
从构思到打磨:我的第五个网页完整开发流程解析

从构思到打磨:我的第五个网页完整开发流程解析

把"我的第五个网页"这个标题挖开来讲,其实挺有意思。一个人能从第一个网页写到第五个,说明已经度过了最初的摸索期,开始真正把做网页当成一件有章法的事来对待。我记得很清楚,自己写到第五个页面的时候,最大…

2026/10/18 5:20:39 阅读更多 →
YOLO推理全流程实战:从模型转换到部署提速与踩坑指南

YOLO推理全流程实战:从模型转换到部署提速与踩坑指南

做目标检测落地,YOLO推理这一环往往最容易被看轻,却也是坑最多的环节。很多人模型训练得好好的,一放到推理环境里就各种掉点、报错、帧率上不去,最后项目卡在部署这一步。这篇就专门把“yolo推理”这件事掰开揉碎讲一遍&#xff0…

2026/10/18 5:20:39 阅读更多 →
ICE流程拆解:candidate属性详解与实战避坑指南

ICE流程拆解:candidate属性详解与实战避坑指南

1. 从一次线上事故说起:为什么 candidate 属性值得单独拎出来讲去年冬天,团队里一个刚接手 ICE 流程的同学在联调时遇到一个诡异现象:两端明明都拿到了对方的地址,连接却始终卡在 checking 状态,日志里看不到任何报错。…

2026/10/18 5:20:39 阅读更多 →
JavaWeb大文件上传:敏感数据流式加密与信封密钥管理

JavaWeb大文件上传:敏感数据流式加密与信封密钥管理

看到这个标题,我脑子里先冒出来的是某次在银行类JavaWeb项目里被大文件上传“放倒”的场景:客户经理传了一个40多MB的客户资料压缩包,后端用byte[]一口气读进内存,Tomcat 直接内存溢出,页面咔一下白屏。后来问题修好了…

2026/10/18 5:19:39 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →