• dubbo核心源码流程分析



    dubbo版本:3.0.13-SNAPSHOT
    dubbo分支:3.0
    github克隆:git clone https://github.com/apache/dubbo.git
    注意事项:由于curator框架和zookeeper框架的版本兼容导致连接zookeeper失败,需要降低zookeeper的版本

    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.12</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1、消费端动态代理生成流程

    org.apache.dubbo.config.ReferenceConfig#init
    ==================================org.apache.dubbo.config.ReferenceConfig#createProxy
    ==================================org.apache.dubbo.config.ReferenceConfig#createInvokerForRemote
    ==================================org.apache.dubbo.registry.integration.RegistryProtocol#refer
    ==================================org.apache.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper#getProxy(org.apache.dubbo.rpc.Invoker<T>)
    ==================================org.apache.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper#getProxy(org.apache.dubbo.rpc.Invoker<T>, boolean)
    ==================================org.apache.dubbo.rpc.proxy.AbstractProxyFactory#getProxy(org.apache.dubbo.rpc.Invoker<T>, boolean)
    ==================================org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory#getProxy
    ==================================new InvokerInvocationHandler(invoker)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2、生产端动态代理生成流程

    org.apache.dubbo.config.ServiceConfig#doExportUrl
    ==================================》
    proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
    ==================================org.apache.dubbo.rpc.ProxyFactory$Adaptive#getInvoker
    ==================================org.apache.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper#getInvoker
    ==================================org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory#getInvoker
    ==================================new AbstractProxyInvoker<T>(proxy, type, url)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3、服务注册到zookeeper

    org.apache.dubbo.registry.zookeeper.ZookeeperRegistry#doRegister
    
    • 1

    4、从zookeeper订阅服务

    org.apache.dubbo.registry.zookeeper.ZookeeperRegistry#doSubscribe
    
    • 1

    5、NettyServer启动流程

    org.apache.dubbo.remoting.transport.netty4.NettyServer#NettyServer
    ==================================org.apache.dubbo.remoting.transport.AbstractServer#AbstractServer
    ==================================org.apache.dubbo.remoting.transport.netty4.NettyServer#doOpen
    ==================================org.apache.dubbo.remoting.transport.netty4.NettyServer#initServerBootstrap
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6、NettyClient启动流程

    org.apache.dubbo.remoting.transport.netty4.NettyClient#NettyClient
    ==================================org.apache.dubbo.remoting.transport.AbstractClient#AbstractClient
    ==================================org.apache.dubbo.remoting.transport.netty4.NettyClient#doOpen
    ==================================org.apache.dubbo.remoting.transport.netty4.NettyClient#initBootstrap
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7、LoadBalance负载均衡初始化流程

    org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke
    ==================================LoadBalance loadbalance = initLoadBalance(invokers, invocation);
    ==================================org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#initLoadBalance
    
    • 1
    • 2
    • 3
    • 4
    • 5

    8、dubbo rpc异步调用流程

    org.apache.dubbo.rpc.protocol.AbstractInvoker#doInvokeAndReturn
    ==================================org.apache.dubbo.rpc.protocol.dubbo.DubboInvoker#doInvoke
    ==================================ExecutorService executor = getCallbackExecutor(getUrl(), inv);
     ==================================org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeChannel#request(java.lang.Object, int, java.util.concurrent.ExecutorService)
     ==================================》
     channel.send(req);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    9、dubbo的调用类型种类

    1FailfastClusterInvoker:快速失败,报错后直接抛异常
    2FailoverClusterInvoker:故障转移,重试可用的所有机器
    3FailbackClusterInvoker:定时重试,失败后通过定时任务再次执行
    4FailsafeClusterInvoker:安全失败,报错后不抛异常,返回空对象
    5ForkingClusterInvoker:并行多路调用,谁先返回就用谁的结果
    6BroadcastClusterInvoker:广播调用,遍历调用所有机器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    10、dubbo的负载均衡种类

    1RandomLoadBalance:基于权重的随机负载均衡
    2RoundRobinLoadBalance:基于复杂权重计算的轮询
    3LeastActiveLoadBalance:基于最小活跃的负载均衡算法
    4ConsistentHashLoadBalance:基于虚拟环的一致性hash算法
    
    • 1
    • 2
    • 3
    • 4

    11、ExtensionLoader扩展入口

    1@SPI注解加载入口:org.apache.dubbo.common.extension.ExtensionLoader#getExtension(java.lang.String)
    2@Adaptive注解加载入口:
    org.apache.dubbo.common.extension.ExtensionLoader#getAdaptiveExtension
    3@Activate注解加载入口:
    org.apache.dubbo.common.extension.ExtensionLoader#getActivateExtension(org.apache.dubbo.common.URL, java.lang.String)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    12、NettySever转发请求给业务线程池代码入口

    org.apache.dubbo.remoting.transport.dispatcher.all.AllChannelHandler#received
    
    • 1

    13、dubbo编解码代码入口

    1、编码入口
    org.apache.dubbo.remoting.exchange.codec.ExchangeCodec#encodeRequest
    2、解码入口
    org.apache.dubbo.remoting.exchange.codec.ExchangeCodec#decode(org.apache.dubbo.remoting.Channel, org.apache.dubbo.remoting.buffer.ChannelBuffer)
    
    • 1
    • 2
    • 3
    • 4

    14、route chain的构建代码入口

    org.apache.dubbo.registry.integration.RegistryProtocol#doCreateInvoker
    ==================================》
    directory.buildRouterChain(urlToRegistry);
    ==================================org.apache.dubbo.registry.integration.DynamicDirectory#buildRouterChain
    ==================================org.apache.dubbo.rpc.cluster.RouterChain#buildChain
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    15、filter chain的构建代码入口

    org.apache.dubbo.registry.integration.RegistryProtocol#doCreateInvoker
    ==================================(ClusterInvoker<T>) cluster.join(directory, true);
    ==================================org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster#join
    ==================================org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster#buildClusterInterceptors
    ==================================org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster.ClusterFilterInvoker#ClusterFilterInvoker
    ==================================org.apache.dubbo.rpc.cluster.filter.DefaultFilterChainBuilder#buildClusterInvokerChain
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    没人带宝宝,所以才要送去托育园?
    小谈静态类和单例模式
    【scikit-learn基础】--『回归模型评估』之偏差分析
    OpenLayers实战,OpenLayers调用手机陀螺仪方向实现指南针效果
    真·Redis缓存优化—97%的优化率你见过嘛? | 京东云技术团队
    基于随机森林的otto商品分类
    “三门问题”解决方案:换不换?更换策略与贝叶斯策略?附 Java 验证代码
    【vue】7、配置axios简化开发,router
    拿捏红黑树(C++)
    MySQL事务
  • 原文地址:https://blog.csdn.net/weixin_40857858/article/details/127984610