【Dubbo】Rpc与HTTP的区别、Dubbo调用过程

【Dubbo】Rpc与HTTP的区别、Dubbo调用过程

  • 1、什么是RPC,和HTTP有什么区别?
    • [1.1 什么场景只能用HTTP,不能用RPC?](#1.1 什么场景只能用HTTP,不能用RPC?)
    • [1.2 RPC有什么好处?](#1.2 RPC有什么好处?)
    • [1.3 为什么RPC要比HTTP更快一些?](#1.3 为什么RPC要比HTTP更快一些?)
  • 2、Dubbo调用过程
    • [2.1 Dubbo如何实现像本地方法一样调用远程方法的?](#2.1 Dubbo如何实现像本地方法一样调用远程方法的?)
    • [2.2 Dubbo的服务调用的过程是什么样的?](#2.2 Dubbo的服务调用的过程是什么样的?)
  • 3、Dubbo支持哪些负载均衡策略?
  • [4、Dubbo 支持哪些服务治理?](#4、Dubbo 支持哪些服务治理?)

1、什么是RPC,和HTTP有什么区别?

RPC 是Remote Procedure Call的缩写,译为远程过程调用。要想实现RPC通常需要包含传输协议和序列化协议的实现

而熟知的HTTP,他的中文名叫超文本传输协议,所以他就是一种传输协议。所以,我们可以认为RPC和HTTP并不是同一个维度的两个概念。只不过他们都是可以作为远程调用的,所以经常拿来对比。

RPC的具体实现上,可以像HTTP一样,基于TCP协议来实现,也可以直接基于HTTP协议实现。

RPC主要用于公司内部服务之间的互相调用,所以他性能消耗低,传输效率高,服务治理方便。

而HTTP主要用于对外的异构环境,浏览器调用,APP接口调用,第三方接口调用等等。

1.1 什么场景只能用HTTP,不能用RPC?

1、在异构系统(跨语言和跨平台),HTTP具有更好的兼容性,因为HTTP是一种通用的协议,几乎所有的编程语言和操作系统都支持HTTP协议,而不是所有的编程语言和操作系统都支持相同的RPC协议。

2、RPC适合用在企业内部,要求使用同一套注册中心进行服务治理,如果是跨组织,或者跨公司,这种情况只能用更加通用的HTTP进行通信。

1.2 RPC有什么好处?

性能好:RPC在传输效率上通常比HTTP更高,此外,RPC可以使用更紧凑的数据格式,如Protocol Buffers和Thrift,可以更有效地利用网络带宽和存储空间。

安全性:目前,Dubbo等RPC框架主要应用在企业内部之间的系统调用,而内部系统之间调用的话安全性就更有保障一些。

调用简单:RPC可以帮我们像调用本地方法一样调用远程代码,而HTTP调用需要拼接Body、Header等等,过于复杂。

1.3 为什么RPC要比HTTP更快一些?

RPC的设计目的就是用于高效的内部服务通信,他通常优化了数据传输和序列化过程,目的是减少网络延迟和提高性能。而HTTP的设计是一种更通用的协议,用于Web文档传输,它在灵活性和可访问性上进行了优化,而不是仅仅专注于性能。

轻量级序列化协议,RPC通常使用更高效的数据序列化格式(如Protocol Buffers、Thrift等),这些格式专门为性能和效率设计,它们比HTTP标准使用的文本格式(如JSON、XML)更紧凑、解析更快。

网络协议更优,RPC的网络通信协议通常被设计的更轻量(如Netty),他一般不需要像HTTP那样有很复杂的Header信息,从而不需要传输太多的数据。

长连接,虽然RPC和HTTP都是基于TCP的,但是RPC可以使用长连接和更有效的连接管理策略,如gRPC还是基于HTTP/2实现,这可以减少建立连接的开销,并允许多个请求在同一连接上有效地复用。虽然HTTP/1.1也有keep-alive机制,HTTP/2也有很多优化。但是RPC只在企业内部用,所以兼容性更好,而HTTP新版的普及程度并不太高。

定制优化,RPC框架通常允许更深层次的定制和优化,比如调整底层传输细节、序列化方式和错误处理机制。而HTTP作为一个标准化的Web协议,其灵活性和定制能力可能较低,特别是在面向性能的场景中。

内部网络,RPC通常应用于企业内部,内部网络交互链路更短,而HTTP在公网上进行通信,一次交互需要经过多个中间节点的转换。

2、Dubbo调用过程

2.1 Dubbo如何实现像本地方法一样调用远程方法的?

Dubbo 实现像本地方法一样调用远程方法的核心技术是动态代理。Dubbo 使用 JDK 动态代理或者字节码增强技术,生成一个代理类,该代理类实现了本地接口,具有本地接口的所有方法。在调用本地接口方法时,会通过代理类的 invoke 方法将请求转发到远程服务提供者上。

生成代理类,:Dubbo 在启动时会扫描配置文件(注解)中指定的服务接口,并根据服务接口生成一个代理类。这个代理类实现了服务接口,并且在调用服务接口的方法时,会将参数封装成请求消息,然后通过网络传输给服务提供方。

序列化与反序列化,为了在网络上发送和接收数据,Dubbo将方法调用的参数和返回值进行序列化(转换成字节序列)和反序列化(从字节序列还原数据)。Dubbo目前支持多种序列化协议:Dubbo支持多种序列化协议,如Hessian、Java自带的序列化、JSON等,以适应不同的性能和兼容性需求。

网络通信,Dubbo 支持多种通信协议,包括 Dubbo 协议、HTTP 协议、Hessian 协议等。在配置文件中指定了要使用的通信协议后,Dubbo 会根据协议的不同,选择不同的序列化方式,将请求消息序列化成二进制流并发送给服务提供方。

服务注册与发现,Dubbo使用注册中心(如Zookeeper、Nacos等)管理服务的提供者和消费者信息。服务提供者在启动时将自己提供的服务注册到注册中心,服务消费者通过注册中心查找所需的服务并获取服务提供者的地址。

负载均衡,Dubbo 支持多种负载均衡算法,包括轮询、随机、加权随机、最小活跃数等。在客户端发起调用时,Dubbo 会根据负载均衡算法选择一台服务提供方进行调用。

远程服务执行,当客户端发起远程调用后,服务提供方接收到请求后,会根据请求中的服务接口名和方法名,找到对应的实现类和方法,并将请求消息反序列化成参数列表,最终调用服务实现类的方法,并将执行结果序列化成响应消息返回给客户端。

2.2 Dubbo的服务调用的过程是什么样的?

下图,是Dubbo的官网中给出的一张关于Dubbo的完整调用链:


首先,一次调用从Proxy开始,这里主要是借助JDK、javaassist等实现的动态代理,然后在开始执行之前,会经过一个filter,判断一下本地是否存在接口的缓存以及mock等,如果都没有,开始通过invoker进行服务调用。

服务调用者在启动时会从注册中心拉取和订阅对应的服务列表, Cluster会把拉取的服务列表聚合成一个Invoker列表。

在Invoker执行过程中,会先通过Directory获取所有可以调用的服务提供者的列表。接下来在根据一些负载均衡的规则进行负载均衡来选出一个具体的Invoker。

在开始调用Invoker的invoke方法前,需要再进行一些过滤规则,如上下文处理、限流、以及计数等。

接下来就通过Invoker进行调用,在调用时会使用具体的客户端进行网络通信,如Netty,在这个过程中当然还需要做协议封装、数据的序列化等动作。

同时,客户端在收到请求后,同样需要进行反序列化,然后把请求交给线程池来进行调度执行。

再根据请求查找对应的Exporter,然后开始执行Invoker,这里就要调用具体的服务实现方法了。

然后再按照原路把结果返回。

3、Dubbo支持哪些负载均衡策略?

Dubbo 支持多种负载均衡策略,允许服务消费者根据不同的场景和需求选择适合的策略。在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

Dubbo 提供的是客户端负载均衡,即由 Consumer 通过负载均衡算法得出需要将请求提交到哪个 Provider 实例。

目前支持的负载均衡算法如下:

4、Dubbo 支持哪些服务治理?

Dubbo 的服务治理是所有的RPC框架中做的最好的之一:

注册中心 :Dubbo 支持多种注册中心,例如 ZooKeeper、Consul、Etcd 等。注册中心用于服务的注册与发现,使得服务提供者和消费者可以动态地发现和通信。

负载均衡 :Dubbo 提供多种负载均衡策略,如随机、轮询、一致性哈希、最少活跃调用等,用于在服务提供者之间分发请求,保证负载均衡。

集群容错 :Dubbo 支持多种集群容错策略,包括 Failover、Failfast、Failsafe、Failback 等,用于处理服务提供者发生故障时的处理逻辑。

服务路由 :Dubbo 提供路由规则,可以根据条件对服务进行路由,例如基于 IP、标签、版本等条件。

流量管控 :Dubbo 支持非常多的流量管控的规则配置,基于这些规则可以实现在运行期动态的调整服务行为如超时时间、重试次数、限流参数等,通过控制流量分布可以实现 A/B 测试、金丝雀发布、多版本按比例流量分配、条件匹配路由、黑白名单等,提高系统稳定性。

● 配置管理:Dubbo 支持动态的配置管理,可以通过配置中心实时管理服务的配置信息,例如超时时间、重试次数等。

● 服务降级:Dubbo 提供服务降级功能,当服务提供者出现异常或性能下降时,可以通过降级策略保证服务的可用性和稳定性。

● 调用过滤器:Dubbo 提供了调用过滤器机制,可以在服务调用的前后执行一些操作,例如权限控制、日志记录等。

● 安全体系:Dubbo 支持基于 TLS 的 HTTP、HTTP/2、TCP 数据传输通道,并且提供认证、鉴权策略,让开发者实现更细粒度的资源访问控制。

参考链接:

1、https://www.yuque.com/hollis666/wk6won/cr3y3t

2、https://www.yuque.com/hollis666/wk6won/nn5fo1yz2b2f9lgy

相关推荐
杨杨杨大侠4 小时前
手把手教你写 httpclient 框架(八)- 实战案例集锦
java·http·github
玛卡巴卡016 小时前
HTTPS工作过程
网络协议·http·https
小王努力学编程13 小时前
brpc远程过程调用
linux·服务器·c++·分布式·rpc·protobuf·brpc
郝学胜-神的一滴14 小时前
QT与Spring Boot通信:实现HTTP请求的完整指南
开发语言·c++·spring boot·后端·qt·程序人生·http
云游17 小时前
Zabbix7.4.8(二):通过http监控Nginx相关指标
服务器·nginx·http
考虑考虑21 小时前
dubbo3超时时间延长
java·后端·dubbo
会开花的二叉树21 小时前
实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现
网络·数据库·c++·rpc·etcd
敲上瘾21 小时前
HTTP协议工作原理与生产环境服务器搭建实战
服务器·网络·c++·网络协议·http
Zfox_1 天前
【C++项目】微服务即时通讯系统:服务端
数据库·c++·微服务·中间件·rpc·架构·即时通讯