dubbo
ddatsh
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/
代码架构
- spring 适配层
解析 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
- SPI
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
服务发布
-
spring适配:DubboNamespaceHandler、DubboBeanDefinitionParser、ServiceBean;
-
配置信息存储:Servic、Registry、Monitor、Protocol、ProviderConfig等;
-
应用协议:Protocol、Dubbo/Hessian/Thrift/Rmi/AbstractProxy/AbstractProtocol等;
-
Server相关:Exchanger、Header、Exchange、HeaderExchangeServer
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向注册中心注册,获取服务端相应的信息,生产代理对象的过程和源码
-
spring适配:DubboNamespaceHandler、DubboBeanDefinitionParser、ReferenceBean;
-
配置信息存储:Reference/Registry/Monitor/Protocol/ConsumerConfig等
-
应用协议:Protocol、Dubbo/Hessian/Thrift/Rmi/AbstractProxy/AbstractProtocol等
-
注册相关:RegistryProtocol、RegistryFactory、Registry、ZookeeperRegistryFactory、ZookeeperRegistry等
-
代理和集群相关:Proxy、JdkProxyFactory、AbstractProxyFactory、InvokerInvocationHandler、Cluster、FailoverCluster、FailoverClusterInvoker、AbstractClusterInvoker、Invoker等
时序图
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使用接口的代理对象