【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 数据传输通道,并且提供认证、鉴权策略,让开发者实现更细粒度的资源访问控制。
参考链接: