Dubbo介绍
Dubbo介绍
概要
Dubbo由阿里巴巴最早于 2011 年发布,是一款高性能的 RPC 框架,专注于服务调用和服务治理。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
简单来说 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
一、面向接口的远程方法调用(RPC)
1. 什么是RPC?
RPC是远程过程调用(Remote Procedure Call)。RPC的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制,让使用者不必显式的区分本地调用和远程调用。
2. RPC框架的特点
1) RPC框架一般使用长链接,不必每次通信都要3次握手,减少网络开销。
2) RPC框架一般都有注册中心,有丰富的监控管理。发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作协议私密,安全性较高
3) RPC 协议更简单内容更小,效率更高,服务化架构、服务化治理,RPC框架是一个强力的支撑。
3. Dubbo提供的RPC
Dubbo提供高性能的基于代理的远程调用能力,服务以接口为粒度,屏蔽了远程调用底层细节。
在 Dubbo 的服务架构中,服务提供方(Provider)和服务消费方(Consumer)通过接口来约定服务调用的逻辑,而不依赖于具体的实现。也就是说,Provider 提供一个接口,Consumer 仅需引用这个接口便可以调用远程服务,而无需了解具体的实现类。这种方式带来了两个好处:
1)解耦性
Provider 和 Consumer 通过接口进行调用,不直接耦合在一起,即使服务实现发生改变,Consumer 端也无需做任何修改。
2)易于扩展
服务提供方可以灵活地扩展或更换服务实现,只需确保接口不变,服务调用就不会受到影响。
4. Dubbo默认使用什么协议
Dubbo缺省协议是Dubbo协议。
Dubbo 协议基于 Netty 传输,采用单一长连接和 NIO 异步通信方式,适用于小数据量和高并发场景,尤其适合消费者数量远大于提供者的调用需求。该协议使用 TCP 作为传输层协议,具备异步特性,并默认使用高效的 Hessian 序列化方式,能够显著提升序列化与反序列化效率,是 Dubbo 在高性能分布式系统中的推荐协议。
二、服务注册和发现
1. 服务提供者和服务消费者
Dubbo的服务提供者是指提供服务的主体,通常会暴露自己的服务接口,并通过某种协议提供服务。而服务消费者是使用服务的主体,通常会引用提供者的服务接口,并通过某种协议调用服务。如下图:
服务提供者向 Zookeeper 注册服务,服务消费者向 Zookeeper 订阅服务;
服务消费者通过 Zookeeper 获取服务提供者的地址信息,然后调用服务提供者的服务
2. 注册中心
Dubbo 自身并没有实现独立的注册中心,但它支持多种主流的注册中心(如 Zookeeper、Nacos、Redis 等),从而使服务治理更灵活和适应不同的分布式环境。其中Zookeeper是Dubbo默认的注册中心。
如下图:
注册中心: 提供服务的注册和发现功能,即实现服务的治理。
服务提供者: Service Provider。 它将自身服务注册到注册中心当中,以便"服务消费者"能够通过服务器端提供的服务清单(注册服务列表)来调用它。
服务消费者: Service Consumer。服务消费者。它从注册中心获取"已注册的服务列表",从而消费服务。
三、Dubbo的负载均衡策略
Dubbo内置多种负载均衡策略:
1. 轮询
2. 随机
3. 最小活跃调用数
4. 一致性哈希
但是,这些负载均衡策略并不一定适用于所有的场景,因此Dubbo也允许我们自定义负载均衡策略。
自定义负载均衡策略需要实现LoadBalance接口,然后通过SPI机制进行扩展。自定义负载均衡策略可以根据不同场景的需求,实现不同的算法和逻辑,从而更好地满足业务需求。
四、Dubbo架构
1. 十层架构
Dubbo 的十层架构是对整个框架的详细分层,将 Dubbo 的各个模块和功能进行清晰的职责划分。每一层都独立运作,相互协作,主要用于详细描述 Dubbo 框架内部的技术实现。具体的十层包括:
1)服务接口层(Service):定义服务接口,供 Consumer 和 Provider 双方使用。
2)配置层(Config):负责配置解析,将服务、注册中心、协议、接口等进行配置。
3)服务代理层(Proxy):对服务接口生成代理类,使得服务消费端可以透明调用。
4)服务注册层(Registry):负责服务的注册与发现,Consumer 从注册中心获取 Provider 的地址。
5)集群层(Cluster):提供负载均衡、容错、路由等功能,实现集群调用的高可用性。
6)监控层(Monitor):记录服务调用次数和调用时间等数据,用于监控服务性能和健康状况。
7)远程调用层(Protocol):定义调用协议(如 Dubbo、HTTP、REST),负责序列化、反序列化和数据传输。
8)信息交换层(Exchange):负责信息的请求和响应,包括异步调用和事件通知机制。
9)网络传输层(Transport):底层的网络通信支持,负责基于 TCP 或其他协议的网络传输。
10)数据序列化层(Serialize):将数据序列化成字节流,以便通过网络传输。
2. 三层架构
根据Dubbo 在服务治理和配置方面的模块进行划分,可以分为三层架构。如下图:
Dubbo的三层架构包括:
1)接口层
接口层是Dubbo的核心,它定义了服务提供者和服务消费者之间的通信接口。在Dubbo中,接口默认使用Java接口实现,具有很强的可扩展性。
2)配置层
配置层的作用是通过配置文件或代码来配置Dubbo的各种参数,包括连接参数、超时时间、重试次数等等。Dubbo支持多种配置方式,包括XML配置、注解配置和属性配置。
3)基础设施层
基础设施层是Dubbo的底层架构,包括了Dubbo的RPC框架、网络通信、序列化和反序列化等实现细节。Dubbo的基础设施层具有较高的性能和可定制性。
五、Dubbo的RPC与OpenFeign的区别
Dubbo 的 RPC 和 OpenFeign 都可以用于服务间通信,但它们的设计目标、工作原理以及使用场景有较大的差异。以下是两者的主要区别:
1. 定位与协议
Dubbo:是高性能 RPC 框架,使用 Dubbo 二进制协议,相比 HTTP 协议更高效。支持 TCP 传输,更适合高并发和低延迟场景。
OpenFeign:基于 HTTP 协议的声明式 REST 客户端,使用 JSON 格式,适合 REST API 调用。
2. 调用方式
Dubbo:面向接口调用,Consumer 通过动态代理调用远程服务,类似调用本地方法,方法透明度高。
OpenFeign:通过注解声明 HTTP 请求,更显式地配置 API 路径和请求参数,符合 RESTful 风格。
3. 性能与序列化
Dubbo:使用二进制序列化,效率高,占用带宽少,适合数据密集、实时性要求高的内部调用。
OpenFeign:使用 JSON 序列化,易于调试,适合跨系统或对性能要求不高的场景。
4. 生态集成
Dubbo:在 Spring Cloud Alibaba 生态中集成,适合构建高性能的分布式系统。
OpenFeign:Spring Cloud 原生支持,与 Eureka、Ribbon、Hystrix 等组件联动性好,使用便捷。
六、Dubbo和Spring Cloud的区别
1. 架构定位
Dubbo:专注于高性能的 RPC 调用和服务治理,主要关注分布式服务间的通信和管理。
Spring Cloud:微服务全家桶,涵盖服务发现、配置管理、网关、监控等多个微服务组件,提供完整的微服务解决方案。
2. 协议和调用模式
Dubbo:采用 TCP 和自定义协议,支持多种序列化方式,性能更优。
Spring Cloud:默认基于 HTTP/REST 通信,遵循 RESTful 风格,更适合对外服务。
3. 适用场景
Dubbo:适合企业内部高并发、低延迟的服务调用,常用于电商、金融等高性能系统。
Spring Cloud:适合 REST 风格的微服务架构,广泛应用于中小型分布式系统,对接外部系统方便。
4. 生态扩展
Dubbo:与 Spring Cloud Alibaba 集成后,可以使用 Spring Cloud 的服务治理和配置管理功能。
Spring Cloud:原生集成 Spring 生态,组件丰富,方便开发快速搭建微服务系统。
参考链接:
https://juejin.cn/post/7264829808008511499
https://juejin.cn/post/7298682235975548968