前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、什么是RPC

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。比较关键的一些方面包括:通讯协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。

RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

二、dubbo 协议

1、Dubbo 协议

协议描述:基于 TCP 的二进制协议,性能高,适合 Dubbo 之间的 RPC 调用。

优点:

  • 高性能,低延迟。
  • 支持长连接,减少连接开销。
  • 序列化效率高,适合大数据量传输。

缺点:

  • 仅适合 Dubbo 应用之间的通信,跨语言支持较差。

适用场景:

  • 内部服务之间的高性能 RPC 调用。
  • 服务提供者和消费者都是基于 Dubbo 的应用。

2、HTTP 协议

协议描述:基于 HTTP/HTTPS 的文本协议,兼容性强。

优点:

  • 跨语言支持,兼容性强。
  • 易于与外部系统集成。
  • 调试方便,支持浏览器访问。

缺点:

  • 性能较低,不适合高频调用。
  • 文本协议,序列化效率低。

适用场景:

  • 跨语言调用。
  • 与外部系统集成。
  • 对协议兼容性要求高的场景。

3、RMI 协议

协议描述:基于 Java RMI 的协议,适合 Java 应用之间的调用。

优点:

  • 适合 Java 应用之间的通信。
  • 与现有 RMI 系统集成方便。

缺点:

  • 依赖 ` Java` 序列化,性能较低。
  • 跨语言支持较差。

适用场景:

  • Java 应用之间的通信。
  • 需要与现有 RMI 系统集成的场景。

4、Hessian 协议

协议描述:基于 Hessian 的二进制协议,跨语言支持较好。

优点:

  • 跨语言支持较好。
  • 序列化效率较高,性能优于 HTTP。

缺点:

  • 性能低于 Dubbo 协议。
  • 依赖 Hessian 库,集成复杂度较高。

适用场景:

  • 需要跨语言调用。
  • 对性能要求较高,但不需要极致性能的场景。

5、Thrift 协议

协议描述:基于 Apache Thrift 的协议,支持多种语言,性能较高。

优点:

  • 支持多种语言,跨语言支持好。
  • 性能优异,适合大规模分布式系统。

缺点:

  • 需要额外依赖 Thrift 库,集成复杂度较高。

适用场景:

  • 多语言环境下的 RPC 调用。
  • 对性能要求较高的场景。

6. gRPC 协议

协议描述:基于 gRPC 的协议,支持多种语言,性能高。

优点:

  • 基于 HTTP/2,性能极高。
  • 支持流式传输,适合实时通信。
  • 跨语言支持好。

缺点:

  • 需要额外依赖 gRPC 库,集成复杂度较高。

适用场景:

  • 多语言环境下的 RPC 调用。
  • 对性能要求极高的场景。
  • 实时通信场景。

7. WebService 协议

协议描述:基于 SOAP 的协议,适合与遗留系统集成。

优点:

  • 兼容性强,适合与旧系统集成。
  • 支持 SOAP 标准,易于与 Web 服务集成。

缺点:

  • 性能较低,不适合高频调用。
  • 文本协议,序列化效率低。

适用场景:

  • 需要与 SOAP 服务集成。
  • 对协议兼容性要求高的场景。

8. Redis 协议

协议描述:基于 Redis 的协议,适合简单的服务调用。

优点:

  • 轻量级,适合小规模应用。
  • 易于与 Redis 集成。

缺点:

  • 性能较低,不适合复杂 RPC 场景。
  • 功能有限,仅适合简单调用。

适用场景:

  • 简单的服务调用场景。
  • 需要与 Redis 集成的场景。

9. Memcached 协议

协议描述:基于 Memcached 的协议,适合简单的服务调用。

优点:

  • 轻量级,适合小规模应用。
  • 易于与 Memcached 集成。

缺点:

  • 性能较低,不适合复杂 RPC 场景。
  • 功能有限,仅适合简单调用。

适用场景:

  • 简单的服务调用场景。
  • 需要与 Memcached 集成的场景。

三、Dubbo 集群容错方案

方案名称 描述 适用场景
Failover 默认策略,调用失败后自动切换到其他提供者并重试。 适合读操作或幂等操作(如查询、读取数据)。
Failfast 调用失败后立即抛出异常,不进行重试。 适合非幂等操作(如写操作),避免重复执行。
Failsafe 调用失败后忽略错误,记录日志并返回空结果。 适合非核心业务,允许调用失败不影响主流程。
Failback 调用失败后记录失败请求,并定时重试。 适合异步操作或最终一致性场景。
Forking 并行调用多个提供者,只要有一个成功就返回结果。 适合对实时性要求高的场景(如实时计算、实时推荐)。
Broadcast 向所有提供者发送请求,任意一个失败则抛出异常。 适合需要通知所有提供者的场景(如缓存更新、配置同步)。
Available 只调用当前可用的提供者,忽略不可用的提供者。 适合核心业务,保证调用成功。
Mergeable 调用多个提供者,并将结果合并后返回。 适合需要从多个提供者获取数据的场景(如数据聚合、分片查询)。

2、Dubbo 核心的配置有哪些

image-20201111185926110

3、Dubbo 服务暴露的过程

Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicationEvent 事件方法,Dubbo 会在这个方法中调用 ServiceBean 父类 ServiceConfig 的 export 方法,而该方法真正实现了服务的(异步或者非异步)发布。

8、Dubbo里面有哪几种节点角色

  1. dubbo是一个分布式开发框架
  2. Provider: 暴露服务的服务提供方。
  3. Consumer: 调用远程服务的服务消费方。
  4. Registry: 服务注册与发现的注册中心。
  5. Monitor: 统计服务的调用次调和调用时间的监控中心。
  6. Container: 服务运行容器。

9、服务注册与发现的流程图

image-20201111191419465

流程说明:

1.Provider(提供者)绑定指定端口并启动服务

2.指供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储

3.Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心

4.注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。

5.Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。

6.Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer

设计的原因:

1.Consumer 与Provider 解偶,双方都可以横向增减节点数。

2.注册中心对本身可做对等集群,可动态增减节点,并且任意一台宕掉后,将自动切换到另一台

3.去中心化,双方不直接依懒注册中心,即使注册中心全部宕机短时间内也不会影响服务的调用

4.服务提供者无状态,任意一台宕掉后,不影响使用 ———————————————

ContactAuthor