Dubbo之_2_基础知识
前言
Github:https://github.com/HealerJean
一、什么是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 核心的配置有哪些
3、Dubbo 服务暴露的过程
Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicationEvent 事件方法,Dubbo 会在这个方法中调用 ServiceBean 父类 ServiceConfig 的 export 方法,而该方法真正实现了服务的(异步或者非异步)发布。
8、Dubbo里面有哪几种节点角色
- dubbo是一个分布式开发框架
- Provider: 暴露服务的服务提供方。
- Consumer: 调用远程服务的服务消费方。
- Registry: 服务注册与发现的注册中心。
- Monitor: 统计服务的调用次调和调用时间的监控中心。
- Container: 服务运行容器。
9、服务注册与发现的流程图
流程说明:
1.Provider(提供者)绑定指定端口并启动服务
2.指供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储
3.Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心
4.注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。
5.Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。
6.Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer
设计的原因:
1.Consumer 与Provider 解偶,双方都可以横向增减节点数。
2.注册中心对本身可做对等集群,可动态增减节点,并且任意一台宕掉后,将自动切换到另一台
3.去中心化,双方不直接依懒注册中心,即使注册中心全部宕机短时间内也不会影响服务的调用
4.服务提供者无状态,任意一台宕掉后,不影响使用 ———————————————