Dubbo
文章平均质量分 92
Spring Cloud Alibaba Dubbo
vinylon1022
这个作者很懒,什么都没留下…
展开
-
Dubbo源码分析十六、dubbo编解码
单独分析一下dubbo的编解码过程。默认情况下使用dubbo自己定义的编码协议。我们先来看一下 Dubbo 数据包结构。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vh5EtRPv-1609227698562)(.\imgs\data-format.jpg)]Dubbo 数据包分为消息头和消息体,消息头用于存储一些元信息,比如魔数(Magic),数据包类型(Request/Response),消息体长度(Data Length)等。消息体中用于存储具体的调用消息,比如原创 2020-12-29 15:42:12 · 480 阅读 · 2 评论 -
Dubbo源码分析十五、服务调用过程(2)
本篇分析provider端收到消息的处理过程先上一个IO线程的调用栈:NettyServerHandler#channelRead(ChannelHandlerContext, MessageEvent)—> AbstractPeer#received(Channel, Object)—> MultiMessageHandler#received(Channel, Object)—> HeartbeatHandler#received(Channel, Object)—>原创 2020-12-29 15:18:54 · 204 阅读 · 0 评论 -
Dubbo源码分析十四、服务调用过程(1)
下面开始分析运行时服务调用过程。本篇主要关注前半段,即consumer端发送消息。先拉一下调用栈:proxy0#sayHello(String)—> InvokerInvocationHandler#invoke(Object, Method, Object[])—> MockClusterInvoker#invoke(Invocation)—> AbstractClusterInvoker#invoke(Invocation)—> FailoverClusterInvo原创 2020-12-29 14:34:30 · 227 阅读 · 1 评论 -
Dubbo源码分析十三、负载均衡
dubbo提供了5种负载均衡策略,分别是:RandomLoadBalance --加权随机LeastActiveLoadBalance --最小活跃数ShortestResponseLoadBalance --最短响应时间RoundRobinLoadBalance --加权轮询ConsistentHashLoadBalance --一致性hash首先我们知道在集群ClusterInvoker选择Invoker时调用到LoadBanlance的select方法,我们先看一下:@Overrid原创 2020-12-29 13:49:37 · 150 阅读 · 0 评论 -
Dubbo源码分析十二、集群模式
集群环境下Dubbo 主要提供了这样几种容错方式:Failover Cluster - 失败自动切换Failfast Cluster - 快速失败Failsafe Cluster - 失败安全Failback Cluster - 失败自动恢复Forking Cluster - 并行调用多个服务提供者先来介绍一下集群容错的所有组件。包含 Cluster、Cluster Invoker、Directory、Router 和 LoadBalance 等。[外链图片转存失败,源站可能有防盗链机制,原创 2020-12-29 11:33:44 · 161 阅读 · 0 评论 -
Dubbo源码分析十一、服务路由
条件路由规则由两个条件组成,分别用于对服务消费者和提供者进行匹配。比如有这样一条规则:host = 10.20.153.10 => host = 10.20.153.11该条规则表示 IP 为 10.20.153.10 的服务消费者只可调用 IP 为 10.20.153.11 机器上的服务,不可调用其他机器上的服务。条件路由规则的格式如下:[服务消费者匹配条件] => [服务提供者匹配条件]如果服务消费者匹配条件为空,表示不对服务消费者进行限制。如果服务提供者匹配条件为空,表示对某些原创 2020-12-29 10:41:03 · 183 阅读 · 1 评论 -
Dubbo源码分析十、服务目录
关于服务目录,之前在讲到服务引用时提到过。我们可以简单的理解为远程服务在本地的缓存,缓存的对象就是invoker。那么关于服务目录有哪些需要搞清楚的呢?整理了一下:列举Invoker-- 运行时调用时需要得到和当前调用相符合的invoker列表通知notify–服务发生变更时能收到通知更新本地缓存我们知道注册中心记录的是服务url,那么通知过来的就是url列表,应该有一个当前invoker列表和通知的url列表的差值计算的过程。路由 – 这个是列举的一个子功能,这里单独拎出来说。运行时调原创 2020-12-29 09:53:51 · 110 阅读 · 0 评论 -
Dubbo源码分析九、服务引用(2)
本篇主要分析创建代理的过程,先回到ReferenceConfig的createProxy方法,看一下最后生成代理对象的那行代码:return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));AbstractProxyFactory类的getProxy方法:@Overridepublic <T> T getProxy(Invoker<T> invoker, boolean generi原创 2020-12-29 09:04:44 · 130 阅读 · 0 评论 -
Dubbo源码分析八、服务引用(1)
Dubbo 服务引用的时机有两个,第一个是在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,第二个是在 ReferenceBean 对应的服务被注入到其他类中时引用。这两个引用服务的时机区别在于,第一个是饿汉式的,第二个是懒汉式的。默认情况下,Dubbo 使用懒汉式引用服务。如果需要使用饿汉式,可通过配置 <dubbo:reference> 的 init 属性开启。我们还是从DubboBootStrap的start方法进入看pr原创 2020-12-28 17:37:01 · 185 阅读 · 0 评论 -
Dubbo源码分析七、服务导出(4)
本篇分析服务注册和订阅接着上篇看,我们回到RegistryProtocol,从register(registryUrl, registeredProviderUrl);这行代码看起:private void register(URL registryUrl, URL registeredProviderUrl) { // 获取 Registry 初始化注册中心 Registry registry = registryFactory.getRegistry(registryUrl);原创 2020-12-28 16:33:01 · 463 阅读 · 0 评论 -
Dubbo源码分析六、服务导出(3)
现在开始看export(invoker)。先看一下调用的主体PROTOCOLprivate static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();可以看到这是一个Protocol的自适应扩展实例。具体对象在运行时由参数invoker.getUrl().getProtocol()得到。本地导出:private void exportLoc原创 2020-12-28 15:49:07 · 135 阅读 · 0 评论 -
Dubbo源码分析五、服务导出(2)
本篇主要关注这行代码:Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));先看一下PROXY_FACTORY的定义private static final ProxyFactory PROXY_FACTORY = ExtensionLoader.getExt原创 2020-12-28 15:16:45 · 81 阅读 · 0 评论 -
Dubbo源码分析四、服务导出(1)
关于服务导出,首先先琢磨一下服务导出时要做什么呢? 我这里整理两点:服务注册(注册的啥?Invoker!)开启服务端(本文以netty4为例)那么在分析源码时能跟到这两个点就基本上算完成了。dubbo-config-spring 针对Spring提供的接入包先看@EnableDubbo注解。在我们的启动类上增加@EnableDubbo注解即打开Dubbo@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inher原创 2020-12-28 14:53:40 · 228 阅读 · 0 评论 -
Dubbo源码分析三、SPI之自适应扩展
关于自适应扩展,dubbo官网中有这么一段话:在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法除外)。拓展方法未被调用,拓展就无法被加载。对于这个矛盾的问题,Dubbo 通过自适应拓展机制很好的解决了。自适应拓展机制的实现逻辑比较复杂,首先 Dubbo 会为拓展接口生原创 2020-12-28 11:41:11 · 230 阅读 · 0 评论 -
Dubbo源码分析一、dubbo全观
前言 Dubbo是一个面向接口代理的高性能RPC框架。由阿里开源,目前已经捐献给Apache,作为Apache顶级项目孵化。自己接触Dubbo也有很长时间了,一直以来都是以使用为主。近期开始整理一下,从源码层面分析一下,以求更深入的理解。Dubbo官网地址:https://dubbo.apache.org 本系列基于dubbo2.7.6版本源码进行分析。官网上的文档已经非常详细了,对照着官网文档看源码还是很容易理解的。全观首先先上两张图吧,我想这两张图在很多文章中都会看到,重要性不言而喻:这原创 2020-12-28 10:00:42 · 362 阅读 · 0 评论 -
Dubbo源码分析二、dubbo的SPI
前言 前文讲到了Dubbo中有十个分层,各分层之间单向依赖。每一层对其他模块的依赖都是通过Dubbo的SPI机制建立的。因此我们首先要了解Dubbo的SPI机制。由于dubbo各层次之间的这种SPI依赖关系,我们可以很方便的实现在各层的扩展,只需要针对性的定制相应SPI接口的实现即可。 要知道的是,dubbo没有直接使用Java SPI,而是重新实现了一套功能更为强大的SPI机制。相关逻辑都在ExtensionLoader 类中。先看一个demo示例。先定义一个SPI接口,该接口被@SPI注解原创 2020-12-28 10:02:30 · 168 阅读 · 0 评论