写点什么

Dubbo 源码浅析(一)—RPC 框架与 Dubbo

  • 2024-08-16
    北京
  • 本文字数:1909 字

    阅读完需:约 6 分钟

一、什么是 RPC

1.1 RPC 概念

RPC,Remote Procedure Call 即远程过程调用,与之相对的是本地服务调用,即 LPC(Local Procedure Call)。本地服务调用比较常用,像我们应用内部程序**(注意此处是程序而不是方法,程序包含方法)**互相调用即为本地过程调用,而远程过程调用是指在本地调取远程过程进行使用。


RPC 框架就是为了帮助我们在本地调用远程过程时,就像调用本地过程一样方便。

1.2 RPC 与 Http 的关系

用一句话来总结就是:


RPC 是一种概念,http 是一种协议,可以认为 http 是 Rpc 的一种实现,或者 Rpc 包含了 http。为什么说包含而不是相等,是因为 Rpc 还有很多基于自定义的 Tcp 的协议,例如 Dubbo 等,而我们常说的 rpc 即指的除 Http 之外的基于 tcp 自定义的协议。

1.3 关于 Rpc 的思考

网上关于 Rpc 与 Http 的相关文章并不少,很多人在解释 RPC 概念时会提到其是执行远程的方法,然后直接得出 rpc 包含 http 的结论。其实如果按照此概念去思考的话,其实并不能得出 Http 是 Rpc 的一种实现。因为 http 调用的方式,从使用者的角度来说,并不是直接调用其方法,而是按照一定的方式,完善出了一条 http 请求,然后交由本地客户端进行数据传输。


而相对比的,如果用过相关 Rpc 框架,例如 Dubbo,是可以像调用本地方法一样直接调用远程方法。而 http 的调用方式可以认为是一种服务调用,而不是一种方法。


感觉文章博主应该是有过 rpc 相关的使用经验,有点先入为主了。那么到底 rpc 与 http 的关系如何呢,我也思考了很久,后面发现应该从定义上入手,我们既然在讨论 Rpc 是什么,怎么能忽略最简单的定义呢。


Remote Procedure Call ,其中"Procedure"按照谷歌翻译有以下几种解释:程序、过程、步骤,并不是 方法(Method)。而程序是包含方法的,同时也包含服务。因此上文中才强调了是一种程序或过程,而不是方法。

1.4 Rpc 框架

Rpc 框架是为了帮助我们在本地服务调用远程服务时像调用本地服务一样简单,我们不需要关心其底层实现,只需要配置好相应的信息,rpc 框架就会帮我们做这些事。例如在 dubbo 中,我们只需要配置好相应的注册中心与想要调用的方法,我们就可以按照本地调用的方式调用远程服务。

1.5 总结

按照我们上文的梳理过程,可以认为 Rpc 是一种概念,主要有两种实现,一种是以 http 方式的服务调用,另一种是以自定义 Tcp 协议实现的方法调用方式,例如 dubbo 协议,当然一般 rpc 框架也都支持 http 协议。当然,无论是那种方式,最终都是以 Tcp/Udp 的方式进行传输。



二、Rpc 框架

2.1 dubbo 是什么

我们上文说到 Rpc 框架就是帮助我们在调用远程服务时像调用本地服务一样简单,dubbo 就是由阿里巴巴开源的一块 rpc 框架。


例如,在我们想调用某个远程方法时,只需要配置好相关配置,然后直接调用即可,dubbo 会帮助我们将处理中间的过程。


/*省略相关配置*/
//将配置注册到spring@Resourceprivate QueryPinService queryPinService;
//直接使用远程方法,像调用本地服务一样简单ueryPinService.getPinWithConfig(paramMap, null);
复制代码


dubbo 整体架构图如下:




作用流程大致如下:


首先服务提供者 Provider 启动然后向注册中心注册自己所能提供的服务。

服务消费者 Consumer 启动向注册中心订阅自己所需的服务。然后注册中心将提供者元信息通知给 Consumer, 之后 Consumer 因为已经从注册中心获取提供者的地址,因此可以通过负载均衡选择一个 Provider 直接调用

之后服务提供方元数据变更的话注册中心会把变更推送给服务消费者

服务提供者和消费者都会在内存中记录着调用的次数和时间,然后定时的发送统计数据到监控中心

2.2 dubbo 和 spring cloud 的区别

首先两者都是当前主流的微服务框架,不过两者也存在很多差异:


  1. 初始定位不同:SpringCloud 定位为微服务架构下的一站式解决方案,主要有网关、注册中心、配置中心、监控中心等;Dubbo 是 它的关注点主要在于服务的调用和治理,其中服务调用更时其核心。

  2. 生态环境不同:SpringCloud 依托于 Spring 平台,具备更加完善的生态体系;而 Dubbo 一开始只是做 RPC 远程调用,生态相对匮乏,现在逐渐丰富起来。

  3. 调用方式:SpringCloud 是采用 Http 协议做远程调用,接口一般是 Rest 风格,比较灵活;Dubbo 是采用 Dubbo 协议,接口一般是 Java 的 Service 接口,格式固定。但调用时采用 Netty 的 NIO 方式,性能较好。


两者组件配置:



很明显 SpringCloud 拥有比 dubbo 更完善的配置,支持的功能性也更强。


相比来说,SpringCloud 像一台品牌机,内部所有配置都已经帮我们装配好了,我们只需要开箱即用即可。而 dubbo 则更像是组装机,需要我们自己选择配置,只提供了核心的计算能力,而显示器、电源等需要我们自己装配调试使用。


从使用者来说,新手小白更适合品牌机,傻瓜式一键操作,就能完成我们想要的效果。而 dubbo 更适合电脑高手,自己装配自己想要的组件,使用起来更顺手。

发布于: 刚刚阅读数: 5
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
Dubbo源码浅析(一)—RPC框架与Dubbo_京东科技开发者_InfoQ写作社区