dubbo源码浅析-开篇
- 框架介绍
-
- 全局组件
- 服务端相关组件(provider)
- 客户端相关组件(consumer)
- 注册中心相关组件
- 文末
-
- 关于交流
这里我主要是大概的介绍一些dubbo中相关的概念,读者也尽量去自行深入了解,因为接下来的分析我会比较详细的介绍整个流程,我觉得只有这样才能让我们有更深的体会。*
框架介绍
全局组件
- ExtensionLoader : 为dubbo的核心组件提供ioc和aop的支持,类似于spring容器的ioc、aop功能,至于为什么dubbo不直接用spring现有的容器功能,官方可能想尽量避免依赖第三方。ExtensionLoader 的ioc区别于spring的ioc,ExtensionLoader 的ioc是基于java中spi的机制,也是对java原生spi机制的一个扩展,即通过key,value的方式去配置服务,在运行时根据key动态的获取需要依赖的具体服务。ExtensionLoader 的aop是基于工厂模式(默认内部实现涉及到spi的工厂和spring的工厂),然后运行时通过反射为具体对象的成员变量赋值。
- Protocol: dubbo的服务域,服务暴露和引用的关键,约定了各种协议需要实现各自的暴露和引用部分;内部提供了一个Protocol骨架AbstractProtocol,用来抽象与协议无关的公用的逻辑,比如说维护一个服务暴露的map,以及提供了取消暴露(服务销毁)的方法-》将map遍历移除。AbstractProxyProtocol 是Protocol的另外一个扩展,dubbo内部维护的协议要么继承AbstractProxyProtocol,要么继承AbstractProxyProtocol,我们自己可以继承AbstractProxyProtocol,实现doExport和doRefer方法实现自定义的协议(AbstractProxyProtocol和AbstractProtocol的区别在以后的文章中会分析),已知实现包含InjvmProtocol、DubboProtocol等。默认在运行时通过spi获取到的Protocol是ProtocolListenerWrapper包装类。
- ProxyFactory: 通过具体的动态代理方式,在服务暴露过程中具备获取Invoker的能力,在服务引用过程中,具备通过Invoker得到代理引用对象的能力。默认情况下,获取Invoker 以及获取Proxy的ProxyFactory是一个StubProxyFactoryWrapper的实例,StubProxyFactoryWrapper是ProxyFactory的包装类(spi会展开说明),而StubProxyFactoryWrapper只有在ProxyFactory获取Proxy(执行getProxy方法)时,才会起作用;简言之StubProxyFactoryWrapper是实现dubbo stub(存根服务)的关键。stub类似于mock,他提供了一种客户端可以自己实现服务提供方服务的能力(具体在接下来的文章中展开)。
- Exporter : 服务暴露数据结构,规定了通常暴露某个协议的服务时,exporter具有获取该服务可执行对象Invoker的能力,以及取消暴露的能力;Invoker转化为Exporter 时服务暴露的关键, 将该协议下的Exporter维护到exporterMap中将完成整个服务的暴露,往往每一种协议都会生成与之对应的Exporter 。
- Invoker :dubbo的实体域,可执行对象,通过ProxyFactory动态生成,由一个代理类来维护执行。
- Invocation : dubbo的会话域,可以理解为Invoker 的数据源
- URL : dubbo的通用数据模型
- Node : 抽象服务节点
- Result : 返回结果
服务端相关组件(provider)
- ServiceBean : 是服务暴露的核心组件,也是服务暴露的入口;暂时不讨论具体服务暴露的具体流程,其实真正处理服务暴露的组件是ServiceBean 的"父亲"ServiceConfig,而ServiceBean我理解的是一方面为了解耦服务具体暴露逻辑和服务暴露入口(spring的事件机制,具体会在后面的文章中介绍);
客户端相关组件(consumer)
- ReferenceBean : 是服务引用的核心组件,结构类似于ServiceBean ,ReferenceBean 的“父亲”ReferenceConfig实现具体的引用逻辑,ReferenceBean 实现了FactoryBean、ApplicationContextAware,InitializingBean这三个接口,其中引用的关键是FactoryBean的getObject()方法,在此之前还做了一些别的动作,包括将spring容器保存到SpringExtensionFactory(这个SpringExtensionFactory以后会作为扩展spring ioc的工具,分析spi时可以具体展开);在属性设置之后,初始化之前,将consumer、application、module、registries,monitor这些配置信息进入初始化,最后生成代理类,保存起来完成引用。
注册中心相关组件
- RegistryService : 负责服务注册组件的顶级抽象,主要扩展有DubboRegistry即Dubbo协议注册中心、FailbackRegistry,即失败重试等。
文末
关于交流
鉴于本人才疏学浅,谈到的内容若有不对的地方烦请告知~也期望与大家一起交流共同进步。
*下一篇—服务暴露流程分析*