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_猫吻鱼的博客-CSDN博客

什么是调用失败?

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

负载均衡

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_吴声子夜歌的博客-CSDN博客_dubbo mock

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

优先使用设置的String类

限流

Dubbo服务限流_♛薄情痞子♛的博客-CSDN博客_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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值