dubbo主流程原理

一、简易交互图

二、原理简介

调用整体流程

启动服务提供者

服务提供者注册主要流程:
1、将本身的服务通过注册中心的方法,发布至注册中心上去

2、开启服务端口,监听信息,并处理

3、生成invoker并等待调用

how to1:
1、ServiceConfig.doExportUrl(注册方法入口)
2、通过字节码代理获取invoker数据。其中会携带url参数. 然后利用dubbospi去获取对应的protocol
3、通过RegistryProtocol 进行获取注册中心然后注册

注:dubbo spi参考下述demo

how to2:
其主要做了两件事在openServer里面
1、开启netty服务
2、生成对应的handler进行方法处理
3、本质上请求过来的message处理器是Dubboprotocol中的requestHandler(在调用的时候会用到)

注:netty demo: https://www.cnblogs.com/xfeiyun/p/15953139.html

how to3:

动态代理,生成的invoker见demo中的invoker截图

dubbo spi 原理

参考demo

获取消费者

生成远程的invoker

invoker 为 InvokerInvocationHandler

内部属性包含directory,在生成invoker的时候会生成多个(根据服务提供者数量决定)DubboInvoker,其dubboInvoker包含每个服务提供者对应的nettyClient

生成代理类

handler为 InvokerInvocationHandler持有生成的代理类

服务端获取invoker调用

1、获取directory(invoker集合)。后续操作均是通过此对象基础

集群

FailoverCluster失败转移: 当出现失败时,重试其他服务器,通常用于读操作,但重试会带来更长延迟,该策略是dubbo默认策略。 默认重试两次

注: 进入org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke,发现其使用for循环在遇到异常的时候进行多次调用。

FailfastCluster快速失败: 只发起一次调用,失败立即报错,通常用于非幂等的请求。

FailbackCluster失败自动恢复: 对于Invoker调用失败,后台记录失败请求,任务定时重发,通常用于通知。

BroadcastCluster广播调用: 遍历调用所有Invoker,如果调用某个invoker异常了,直接捕获异常,不影响调用其他的invoker。

AvailableCluster获取可用的调用: 遍历所有invoker并判断invoker.isAvalible,只要有一个为true就直接调用返回,不管是否成功。

FailsafeCluster失败安全: 出现异常时直接忽略,通常用于写入审计日志。

ForkingCluster并行调用: 只要一个成功即返回,通常用于实时性要求较高的操作,但需要浪费更多的服务资源。

MergeableCluster分组聚合: 按组合并返回结果,比如某个服务接口有多种实现,可以用group区分,调用者调用多种实现并将得到的结果合并。

注:多group分组合并结果调用。

Dubbo笔记衍生篇⑤:MergeableClusterInvoker_猫吻鱼的博客-优快云博客

什么是调用失败?

业务调用成功,返回抛出的异常,并不算失败。模拟时可以在启动之后断掉服务,或者突然网络不通。

负载均衡

random=org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance 随机 + 权重
roundrobin=org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance 轮询 + 权重
leastactive=org.apache.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance 最少连接
consistenthash=org.apache.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance 一致性hash
shortestresponse=org.apache.dubbo.rpc.cluster.loadbalance.ShortestResponseLoadBalance 最短响应

注:其本质就是在从可用的invoker集合中查找出当前需要使用的invoker,发送请求。

方法入口:org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#doSelect

默认策略:random

路由

旧路由规则 | Apache Dubbo

tag路由参考demo

序列化

1.19 性能测试报告 - dubbo 中文文档 - 开发文档 - 文江博客

注:单次传递数据比较大的时候使用http协议比较有优势。 最少要大于1k。

默认使用dubbo协议,是在1k内的最好选择。

三、dubbo实用小技巧

mock(熔断)

Dubbo——Mock_吴声子夜歌的博客-优快云博客_dubbo mock

注:设置为true时,默认使用的是api同包下的。

优先使用设置的String类

限流

Dubbo服务限流_♛薄情痞子♛的博客-优快云博客_dubbo 限流

泛化(仅通过接口名以及方法名进行调用)

参考demo GenericConsumerDemo 设置generic 为true,通过interface和method调用即可

本地调试

通过修改版本号或者group名来进行控制

通过指定url方式进行控制

过滤器拦截器

过滤器参考demo

上下文传递

RpcContext.getContext().setAttachment

使用dubbo admin

下载dubboadmin源码
https://github.com/apache/dubbo-admin
启动dubbo-admin-server(此处可以在application.properties 修改配置中心地址 以及账密)
默认注册中心是使用的zookeeper://localhost:2181
启动dubbo-admin-ui

# 启动zk mac cmd:zkServer start (可以自行下载zk)
# 最新版本的已经添加了dubbo测试功能

参考文档

源码地址

GitHub - apache/dubbo: Apache Dubbo is a high-performance, java based, open source RPC framework.

中文文档

dubbo 中文文档 - 手册 - 文江博客

demo下载链接

dubbo demo

<think>我们正在处理一个关于Dubbo源码主流程解析的请求。用户希望了解Dubbo源码的主流程,特别是服务提供者启动和服务导出的过程。 根据引用,我们可以总结出以下关键点: 1. Dubbo的核心模块包括服务导出、注册中心、协议支持等(引用[1])。 2. 服务提供者启动时,会涉及到配置解析、服务导出、注册中心注册和启动服务等步骤(引用[2])。 3. 服务导出的基本原理包括:确定服务参数、确定协议、构造URL、注册到注册中心、启动服务(引用[3])。 4. Dubbo使用了SPI扩展机制,通过动态生成代理类来实现扩展(引用[4][5])。 因此,我们将重点解析服务提供者启动的主流程,包括: - 配置解析:解析XML配置或注解配置,生成服务配置对象。 - 服务导出:将服务配置转化为可执行的服务,包括生成Invoker、Exporter,并注册到注册中心。 - 启动服务:根据协议启动服务器(如NettyServer)监听请求。 我们将按照以下步骤详细说明: 1. 配置解析:Dubbo通过Spring自定义标签解析或注解驱动来解析服务配置。 2. 服务导出:当Spring容器刷新时,Dubbo会触发服务导出。主要步骤包括: a. 检查配置,组装URL。 b. 创建Invoker对象(代表服务的可执行对象)。 c. 通过协议导出服务,生成Exporter(管理服务生命周期)。 d. 将服务注册到注册中心(如Zookeeper)。 3. 启动服务:在协议导出过程中,会启动服务器(如NettyServer)监听端口。 下面我们将详细展开这些步骤。</think>### Dubbo源码主流程解析 Dubbo的核心流程围绕**服务导出**(服务提供者)和**服务引入**(消费者)展开,主流程如下: #### **1. 配置解析与初始化** - **XML/注解解析**:Dubbo通过Spring自定义标签或注解解析配置(如`<dubbo:service>`),生成`ServiceBean`对象[^3][^4]。 - **组装URL**:将配置参数(接口名、协议、注册中心地址等)封装为**URL对象**(Dubbo的统一配置模型)[^3][^5]。 - 示例URL:`dubbo://192.168.1.1:20880/com.example.UserService?timeout=1000` #### **2. 服务导出(服务提供者)** - **创建Invoker**: - 将服务实现类包装为`AbstractProxyInvoker`(基于Javassist或JDK动态代理生成)[^5]。 - 实现远程调用逻辑:将方法调用转化为网络请求[^3][^4]。 - **协议导出**: - 通过`Protocol.export()`方法(默认`DubboProtocol`)启动网络服务(如Netty Server)[^3][^5]。 - 关键步骤: ```java Exporter<?> exporter = protocol.export(wrapperInvoker); // 导出服务 ``` - **注册到注册中心**: - 将服务URL注册到ZooKeeper等注册中心(通过`RegistryProtocol`)[^3]。 - 消费者通过注册中心发现服务提供者地址。 #### **3. 服务引入(消费者)** - **订阅服务**: - 消费者从注册中心获取提供者URL列表[^3][^4]。 - **创建代理对象**: - 通过`ProxyFactory`(默认`JavassistProxyFactory`)生成服务接口的代理类[^5]。 - 调用方法时,代理类将请求转发给集群模块(Cluster)。 #### **4. 远程调用** - **集群容错**: - `Cluster`模块处理负载均衡(如Random)、容错(如Failover)[^4]。 - **网络通信**: - 通过`ExchangeClient`(默认Netty实现)发送请求[^3][^5]。 - 提供者收到请求后,由`DubboProtocol.requestHandler`执行本地调用并返回结果[^3]。 #### **5. 关键设计** - **SPI扩展机制**: - 核心接口(`Protocol`、`Cluster`等)通过SPI动态加载实现类,支持扩展(如替换为REST协议)[^4][^5]。 - **URL总线**: - 所有配置和状态通过URL传递,贯穿整个流程[^3][^5]。 #### **流程图** ```mermaid graph LR A[服务提供者] --> B[解析配置生成URL] B --> C[创建Invoker] C --> D[Protocol.export 启动服务] D --> E[注册中心注册URL] F[消费者] --> G[订阅服务获取URL] G --> H[创建代理对象] H --> I[调用代理方法] I --> J[Cluster选择提供者] J --> K[Netty发送请求] K --> A ``` ### 总结 Dubbo主流程围绕**URL配置模型**和**SPI扩展机制**,通过**服务导出/引入**实现远程通信。核心步骤包括: 1. 配置解析 → 2. 服务导出(启动服务+注册中心) → 3. 服务引入(订阅+生成代理) → 4. 远程调用(集群容错+网络通信)[^3][^4][^5]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值