Dubbo: 在springboot中的启动过程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo: 在springboot中的启动过程相关的知识,希望对你有一定的参考价值。
参考技术A SpringBoot在启动时,通过ConfigurationClassPostProcessor.postProcessBeanFactory完成对依赖jar包中XxAutopConfiguration类的注册,自然DubboAutoConfiguration也会被注册到容器内部。DubboAutoConfiguration中,定义了一个ServiceClassPostProcessor ,同样会被注册到容器内。
ServiceClassPostProcessor 实现了BeanDefinitionRegistryPostProcessor接口,同样他也是一个BeanFactoryPostProcessor。
在SpringBoot刷新容器,调用所有BeanFactoryPostProcessors时,对BeanDefinitionRegistryPostProcessor,会去调用其postProcessBeanDefinitionRegistry方法。
至此,便将ServiceBean注册进了Spring IOC容器。至于对象和代理对象的创建,那是后话了。
我们知道DubboService会被注册到注册中心,最终的结果是:将服务名、服务对外暴露的url等信息通过网络请求发送到注册中心,那么对外暴露的时机是什么时候?它又是如何做到这件事情的?
关于时机,它应该在容器刷新完成之后将所有DubboService对外暴露,那么如何感知到容器刷新呢?SpringBoot中可以注册listener,容器开始启动、启动完成等事件会通知注册进来的listener。
ServiceClassPostProcessor 除了向容器注册ServiceBean之外,还注册了一个监听器:DubboBootstrapApplicationListener,当感知到容器刷新完成和关闭事件时,做出相应处理,在这里关注刷新完成该如何处理。
启动DubboBootStrap
至于Service如何暴露:如下图
最后服务暴露到底对外暴露了个啥呢?其实就是invoker的url,当consumer发起服务调用的时候,发起请求,当provider接收到请求之后,将请求携带的信息(接口、方法名、参数数组...)封装为Invocation对象,分派到相应的invoker,通过invoker.invoke(invocation)完成调用。
另外敖丙的文章也还不错, Dubbo系列之服务暴露过程
从springboot解析@DubboReference开始讲起。
DubboAutoConfiguration被@EnableDubboConfig注解,通过该注解引入了DubboConfigConfigurationRegistrar类。
DubboConfigConfigurationRegistrar::registerBeanDefinitions(args)
ReferenceAnnotationBeanPostProcessor是一个InstantiationAwareBeanPostProcessorAdapter,在对象实例化后,填充属性中,会调用其postProcessPropertyValues
最终到达referenceBean.get()方法,返回代理对象,并注入到目标对象的field。
如果抛开SpringBoot如何注入被@DubboReference注解的Bean,可以说referenceBean.get()就是服务引用的入口。
后面的事情就是Dubbo内部要完成的了,大概过程如这样:
springboot与dubbo整合遇到的坑
整合环境:
dubbo 2.6.2
springboot 2.1.5
遇到的问题:服务一直无法注册到zookeeper注册中心
项目结构:
使用application.properties文件:
配置都没问题,启动的时候也没有明显的错误;
然后就去百度看到大部分都是这种配置,之后在一篇博客中看到,需要在主启动类上加@EnableDubbo注解,试了一下加上之后就可以解决这个问题,希望可以帮到你。
以上是关于Dubbo: 在springboot中的启动过程的主要内容,如果未能解决你的问题,请参考以下文章