Dubbo底层实现

Dubbo服务框架解析

1.Dubbo的底层实现
(1)协议支持

Dubbo支持多种协议,如下所示:
Dubbo协议 Hessian协议
HTTP协议 RMI协议
WebService协议
Thrift协议 Memcached协议 Redis协议
在通信过程中,不同的服务等级一般对应着不同的服务质量,那么选择合适的协议便是一件非常重要的事情。你可以根据你应用的创建来选择。例如,使用RMI协议,一般会受到防火墙的限制,所以对于外部与内部进行通信的场景,就不要使用RMI协议,而是基于HTTP协议或者Hessian协议。

(2)默认使用Dubbo协议

连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要使用dubbo协议传输大文件或超大字符串
使用场景:常规远程服务方法调用
从上面的适用范围总结,dubbo适合小数据量大并发的服务调用,以及消费者机器远大于生产者机器数的情况,不适合传输大数据量的服务比如文件、视频等,除非请求量很低。

(3)Dubbo源码模块图

Dubbo以包结构来组织各个模块,各个模块及其关系,如图所示:

可以通过Dubbo的代码(使用Maven管理)组织,与上面的模块进行比较。简单说明各个包的情况:
dubbo-common 公共逻辑模块,包括Util类和通用模型。
dubbo-remoting 远程通讯模块,相当于Dubbo协议的实现,如果RPC用RMI协议则不需要使用此包。
dubbo-rpc 远程调用模块,抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。
dubbo-cluster 集群模块,将多个服务提供方伪装为一个提供方,包括:负载均衡、容错、路由等,集群的地址列表可以是静态配置的,也可以是由注册中心下发。
dubbo-registry 注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册中心的抽象。
dubbo-monitor 监控模块,统计服务调用次数,调用时间的,调用链跟踪的服务。
dubbo-config 配置模块,是Dubbo对外的API,用户通过Config使用Dubbo,隐藏Dubbo所有细节。
dubbo-container 容器模块,是一个Standalone的容器,以简单的Main加载Spring启动,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务。

2.服务暴露和消费的详细过程
(1)服务提供者暴露一个服务的详细过程

服务提供者暴露服务的主过程:

首先ServiceConfig类拿到对外提供服务的实际类ref(如:HelloWorldImpl),然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,

到这一步就完成具体服务到Invoker的转化。接下来就是Invoker转换到Exporter的过程。

Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程(如上图中的红色部分),下面我们以Dubbo和RMI这两种典型协议的实现来进行说明:

Dubbo的实现

Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现。

RMI的实现

RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,
它通过Spring或Dubbo或JDK来实现RMI服务,通讯细节这一块由JDK底层来实现,这就省了不少工作量。

(2)服务消费者消费一个服务的详细过程

服务消费的主过程:

首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键。接下来把Invoker转换为客户端需要的接口(如:HelloWorld)。
 

### Dubbo 底层实现原理 Dubbo 是一款高性能的 Java RPC 框架,其设计目标是在 SOA 架构中简化应用间的调用过程。为了理解 Dubbo底层实现原理,可以从以下几个方面展开: #### 1. RPC 基本概念 远程过程调用 (Remote Procedure Call, RPC) 让开发者可以像调用本地方法一样轻松地调用其他服务器上的资源和服务[^3]。 #### 2. Dubbo 核心组件 - **注册中心**:用于管理服务提供者与消费者之间的关系,支持多种协议如 ZooKeeper、Redis 等。 - **代理模式**:客户端发起请求时会创建一个代理对象来代替实际的服务接口实例;当调用了该代理的方法后,则触发网络传输逻辑向远端发送消息并等待响应结果返回给调用方处理[^1]。 - **序列化/反序列化**:由于不同平台间的数据交换需要统一格式,因此 Dubbo 支持 Hessian、JSON、Kryo 多种编解码方式以适应不同的应用场景需求。 - **线程池配置**:考虑到高并发环境下的性能瓶颈问题,合理设置线程数量对于提升系统吞吐量至关重要。Dubbo 提供了灵活的线程模型选项让用户能够根据业务特性调整最优参数组合[^4]。 #### 3. SPI 扩展机制 Java 中 Service Provider Interface(SPI) 技术允许第三方模块动态加载指定类型的实现类而无需修改原有代码结构。Dubbo 则利用此特性实现了高度可定制化的功能扩展点,比如自定义过滤器链路、负载均衡策略以及集群容错算法等。 ```java // 定义SPI接口 public interface MyService { void sayHello(); } // 配置文件META-INF/services/com.example.MyService com.example.impl.HelloServiceImpl ``` #### 4. XML 解析与 Bean 初始化 在 Spring 上下文中集成 Dubbo 组件的过程中涉及到大量的元数据读取工作,这主要依赖于 `DubboNamespaceHandler` 和 `DubboBeanDefinitionParser` 来完成对 `<dubbo:...>` 名字空间内的标签解释,并最终映射成相应的 Java 对象参与后续操作流程[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值