dubbo

ddatsh

dev #dubbo #java

dubbo 源码分析,参考众多文章,经常会更新

Dubbo依赖关系

方块代表层或模块

蓝色与业务有交互,绿色只对Dubbo内部交互

蓝色虚线初始化时调用,红色虚线运行时异步调用,红色实线运行时同步调用


http://www.cnblogs.com/wxd0108/p/6638537.html

http://www.jianshu.com/p/6ec185c2f520

https://yq.aliyun.com/articles/39068

https://ywbrj0421.gitbooks.io/dubbo/content/

http://wyj.shiwuliang.com/2017/02/25/Dubbo%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%20%E2%80%94%20%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E6%9A%B4%E9%9C%B2/

代码架构

解析 spring 配置,ReferenceBean,ServiceBean等

dubbo-config\dubbo-config-spring

存储对应配置,ServiceConfig

dubbo-config\dubbo-config-api

ZookeeperRegistry

解析应用协议(dubbo、hessian、http、rmi、webservice、thrift、redis、memcache)

spring httpinvoker 和 支持soap 协议的 webservice

使客户端可脱离dubbo独立调用

dubbo 没有用原生态的thrift,进行了改造,不够成熟

tcp、http等

不同协议用不同容器。dubbo、thrift对应netty、mina、grizzly;hessian、http、webservice对应jetty

限流 等

DubboMonitor

代理生成实际业务调用对象,InvokerInvocationHandler

ExtensionLoader

simple和完整的 dubbo admin

zk、redis、multicast、simple

multicast 识别不了服务端,客户端掉线

服务治理

名称 功能
loadbalance 轮循、随机、一致性hash、最小活跃
cluster failback、failfast、failover、failsafe、并行调用
路由 路由规则调用目标服务
限流 客户端过滤器,consumer限流
监控 实时监控各服务及consumer状态
服务管理 启用禁用、权重
消费者管理 屏蔽、动态配置
配置管理 动态改负载均衡

不支持跨数据中心路由,没在server做限流

http、webservice跨语言协议,客户端不访问注册中心情况下直接调用dubbo服务,失去服务治理意义

dubbo-common是整个dubbo核心内容

扩展点是Dubbo的核心,核心则是ExtensionLoader,类似ClassLoader,ExtensionLoader是加载Dubbo的扩展点的

每种类型的扩展点都会有一个与其对应的ExtensionLoader,类似jvm中每个Class都会有一个ClassLoader

每个ExtensionLoader会包含多个该扩展点的实现,类似一个ClassLoader可以加载多个具体的类,但是不同的ExtensionLoader之间是隔离的,这点也和ClassLoader类似

NamespaceHandler

dubbo.xsd 定义dubbo相关元素属性

DubboNamespaceHandler向spring容器注册dubbo元素解析器(application/registry/monitor/provider/consumer/protocol Config)、service/reference/annotation Bean ),DubboBeanDefinitionParser具体解析

<dubbo:application name="" />
<dubbo:registry address="" check="false"  file=""/>
<dubbo:monitor protocol="registry"/>
<dubbo:protocol name="dubbo" port="-1" threadpool="cached" threads="400"/>
<dubbo:service interface="" ref="" timeout="60000"/>
<dubbo:reference interface="" id="xxService" check="false"/>

像用springbean一样进行服务暴露和调用了,完全看不到dubboapi的存在

原理: spring 可扩展Schema自定义配置 dubb-config\dubbo-config-spring\META-INF\spring.handlers > dubbo xml解析类:DubboNamespaceHandler

解析成ServiceConfig,ReferenceConfig等

JDK SPI 扩展

dubbo高级用法之泛化与接口自适应 http://www.jianshu.com/p/eb6220a6bfd8

服务发布

Transporters、Transporter、NettyTransporter、NettyServer等

时序图

a. DubboBeanDefinitionParser 解析xml标签,生成ServiceConfig等配置对象

b.ServiceConfig export()等发布服务的方法被调用

c.spi确定Protocol接口实现对象为DubboProtocol,调用它的openServer()等方法

d.spi确定Transporter接口实现对象为NettyTransporter,调用它的bind()方法

e.调用NettyServer类,启动netty服务,绑定端口

发布活动图

consumer注册及生成代理对象

consumer向注册中心注册,获取服务端相应的信息,生产代理对象的过程和源码

时序图

a.DubboBeanDefinitionParser解析xml标签,生成ReferenceConfig等配置对象

b.ReferenceConfig init()等方法被调用

c.spi确定Protocol接口实现对象为RegistryProtocol的对象,调用它的refer()方法;

d.spi确定RegistryFactory接口实现对象为ZookeeperRegistryFactory,调用它的getRegistry()方法,生产ZookeeperRegistry对象

e.调用RegistryProtocol对象的doRefer()方法后,并调用FailoverCluster的join()方法,生成FailoverClusterInvoker的对象

f.调用JdkProxyFactory的getProxy()方法,生成consumer使用接口的代理对象