Dubbo源码分析(二):Dubbo之消费端(Consumer)

通观全部Dubbo代码,有两个很重要的对象就是Invoker和Exporter,Dubbo会根据用户配置的协议调用不同协议的Invoker,再通过ReferenceFonfig将Invoker用Exporter包装后暴露在网络上。当用户调用一个Service接口的一个方法后由于Dubbo使用javassist动态代理,会调用Invoker的Invoke方法从而初始化一个RPC调用访问请求访问服务端的Service返回结果。下面我们就从Comsumer端开始逐步解析这个框架。

Dubbo首先使用com.alibaba.dubbo.config.spring.schema.NamespaceHandler注册解析器,当spring解析xml配置文件时就会调用这些解析器生成对应的BeanDefinition交给spring管理:

public class DubboNamespaceHandler extends NamespaceHandlerSupport {static {Version.checkDuplicate(DubboNamespaceHandler.class);}public void init() {//配置<dubbo:application>标签解析器registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));//配置<dubbo:module>标签解析器registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));//配置<dubbo:registry>标签解析器registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));//配置<dubbo:monitor>标签解析器registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));//配置<dubbo:provider>标签解析器registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));//配置<dubbo:consumer>标签解析器registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));//配置<dubbo:protocol>标签解析器registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));//配置<dubbo:service>标签解析器registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));//配置<dubbo:refenrence>标签解析器registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));//配置<dubbo:annotation>标签解析器registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));}}

Spring在初始化IOC容器时会利用这里注册的BeanDefinitionParser的parse方法获取对应的ReferenceBean的BeanDefinition实例,由于ReferenceBean实现了InitializingBean接口,在设置了bean的所有属性后会调用afterPropertiesSet方法:

public void afterPropertiesSet() throws Exception {//如果Consumer还未注册if (getConsumer() == null) {//获取applicationContext这个IOC容器实例中的所有ConsumerConfigMap<String, ConsumerConfig> consumerConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ConsumerConfig.class, false, false);//如果IOC容器中存在这样的ConsumerConfigif (consumerConfigMap != null && consumerConfigMap.size() > 0) {ConsumerConfig consumerConfig = null;//遍历这些ConsumerConfigfor (ConsumerConfig config : consumerConfigMap.values()) {//如果用户没配置Consumer系统会生成一个默认Consumer,且它的isDefault返回ture//这里是说要么是Consumer是默认的要么是用户配置的Consumer并且没设置isDefault属性if (config.isDefault() == null || config.isDefault().booleanValue()) {//防止存在两个默认Consumerif (consumerConfig != null) {throw new IllegalStateException("Duplicate consumer configs: " + consumerConfig + " and " + config);}//获取默认ConsumerconsumerConfig = config;}}if (consumerConfig != null) {//设置默认ConsumersetConsumer(consumerConfig);}}}//如果reference未绑定application且(reference未绑定consumer或referenc绑定的consumer没绑定applicationif (getApplication() == null&& (getConsumer() == null || getConsumer().getApplication() == null)) {//获取IOC中所有application的实例Map<String, ApplicationConfig> applicationConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ApplicationConfig.class, false, false);if (applicationConfigMap != null && applicationConfigMap.size() > 0) {//如果IOC中存在applicationApplicationConfig applicationConfig = null;//遍历这些applicationfor (ApplicationConfig config : applicationConfigMap.values()) {//如果application是默认创建或者被指定成默认if (config.isDefault() == null || config.isDefault().booleanValue()) {if (applicationConfig != null) {throw new IllegalStateException("Duplicate application configs: " + applicationConfig + " and " + config);}//获取applicationapplicationConfig = config;}}if (applicationConfig != null) {//关联到referencesetApplication(applicationConfig);}}}//如果reference未绑定module且(reference未绑定consumer或referenc绑定的consumer没绑定moduleif (getModule() == null&& (getConsumer() == null || getConsumer().getModule() == null)) {//获取IOC中所有module的实例Map<String, ModuleConfig> moduleConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, ModuleConfig.class, false, false);if (moduleConfigMap != null && moduleConfigMap.size() > 0) {ModuleConfig moduleConfig = null;//遍历这些modulefor (ModuleConfig config : moduleConfigMap.values()) {//如果module是默认创建或者被指定成默认if (config.isDefault() == null || config.isDefault().booleanValue()) {if (moduleConfig != null) {throw new IllegalStateException("Duplicate module configs: " + moduleConfig + " and " + config);}//获取modulemoduleConfig = config;}}if (moduleConfig != null) {//关联到referencesetModule(moduleConfig);}}}//如果reference未绑定注册中心(Register)且(reference未绑定consumer或referenc绑定的consumer没绑定注册中心(Register)if ((getRegistries() == null || getRegistries().size() == 0)&& (getConsumer() == null || getConsumer().getRegistries() == null || getConsumer().getRegistries().size() == 0)&& (getApplication() == null || getApplication().getRegistries() == null || getApplication().getRegistries().size() == 0)) {//获取IOC中所有的注册中心(Register)实例Map<String, RegistryConfig> registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false);if (registryConfigMap != null && registryConfigMap.size() > 0) {List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();//遍历这些registryfor (RegistryConfig config : registryConfigMap.values()) {//如果registry是默认创建或者被指定成默认if (config.isDefault() == null || config.isDefault().booleanValue()) {registryConfigs.add(config);}}if (registryConfigs != null && registryConfigs.size() > 0) {//关联到reference,,此处可以看出一个consumer可以绑定多个registry(注册中心)super.setRegistries(registryConfigs);}}}//如果reference未绑定监控中心(Monitor)且(reference未绑定consumer或reference绑定的consumer没绑定监控中心(Monitor)if (getMonitor() == null&& (getConsumer() == null || getConsumer().getMonitor() == null)&& (getApplication() == null || getApplication().getMonitor() == null)) {//获取IOC中所有的监控中心(Monitor)实例Map<String, MonitorConfig> monitorConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, MonitorConfig.class, false, false);if (monitorConfigMap != null && monitorConfigMap.size() > 0) {MonitorConfig monitorConfig = null;//遍历这些监控中心(Monitor)for (MonitorConfig config : monitorConfigMap.values()) {//如果monitor是默认创建或者被指定成默认if (config.isDefault() == null || config.isDefault().booleanValue()) {if (monitorConfig != null) {throw new IllegalStateException("Duplicate monitor configs: " + monitorConfig + " and " + config);}monitorConfig = config;}}if (monitorConfig != null) {//关联到reference,一个consumer绑定到一个监控中心(monitor)setMonitor(monitorConfig);}}}Boolean b = isInit();if (b == null && getConsumer() != null) {b = getConsumer().isInit();}if (b != null && b.booleanValue()) {//如果consumer已经被关联则组装ReferencegetObject();}}}

这步其实是Reference确认生成Invoker所需要的组件是否已经准备好,都准备好后我们进入生成Invoker的部分。这里的getObject会调用父类ReferenceConfig的init方法完成组装:

那段雨骤风狂。人生之旅本就是风雨兼程,是要说曾经拥有,

Dubbo源码分析(二):Dubbo之消费端(Consumer)

相关文章:

你感兴趣的文章:

标签云: