导航:首页 > 源码编译 > dubbo源码版本升级

dubbo源码版本升级

发布时间:2023-05-14 03:26:57

1. 【bbo源码】5.配置信息解析-注解版

用于把bbo.properties读到spring的environment中,

这个工作是由Spring的类来完成的.检测到某个需要注册的Bean上有@PropertySource注解,就会读该文件的配置信息,弄到environment对象的MutablePropertySources对象中。

后期会把配置信息弄到bbo 配置类中.

该注解上还有@DubboComponentScan,@EnableDubboConfig,这两个注解是bbo用注解与spring集成的核心了

该注解用@import导入了这个类

实现了ImportBeanDefinitionRegistrar接口,那么spring在实例化的时候会调用重写ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,并且将用@Import导入的类的元数据包装成importingClassMetadata对象。

其实就是为了获取入口类AnnoBean上的@EnableDubboConfig注解里的multiple属性配置的值,默认是true.

然后注册了两个DubboConfigConfiguration的内部类

通过读Class对象注册到ioc容器

类上有@EnableDubboConfigBindings,值为@EnableDubboConfigBinding数组
通过绑定,将有对应前缀的配置信息赋值到对应的配置类中

又用@Import导入DubboConfigBindingsRegistrar类,DubboConfigBindingsRegistrar这个类又实现了ImportBeanDefinitionRegistrar,EnvironmentAware接口

实现ImportBeanDefinitionRegistrar肯定是为了另外导入一些类,并且拿到导入的源类,获取源类上配置的信息

实现EnvironmentAware是为了拿到spring的environment对象,因为 bbo.properties 已经被@PropertySource注解机制加载到了environment.MutablePropertySources中,在这里只对beanName的创建有作用。

registrar.registerBeanDefinitions :

注册的过程中,需要从environment对象中拿bbo相关的配置,比如ApplicationConfig只拿
bbo.application.*相关的配置,然后创建ApplicationConfig的BeanDefinition.

如果 @EnableDubboConfigBinding配置的multiple为true(默认为false),并且在配置文件中配置了同样前缀的属性,如:

这样会为同一种配置类型,生成两个BD.beanName不同的配置Bean,名称规则如下所示, #0表示的是'.'在配置的key中出现的位置

之后还会注册一个BeanPostProcessor类型的类的beanDefinition,BeanPostProcessor类型 会在每一个Bean实例化的过程中,根据配置的前缀,从environment拿出所需的配置,根据beanName来处理beanName相同的这一个配置Bean,把配置信息绑定到配置类的属性中。

.

利用 bboConfigBinder 对象来绑定前缀为bbo.application的配置信息到配置Bean中

这里bboConfigBinder对象是中的一个属性,是在因为这个类实现了InitializingBean这个接口的afterPropertiesSet方法,bboConfigBinder对象就是在这里初始化的

最后用的DataBinder的api把一个MutablePropertyValues绑定到Bean的属性

@import进来了DubboComponentScanRegistrar类

DubboComponentScanRegistrar又实现了ImportBeanDefinitionRegistrar接口,实现registerBeanDefinitions方法.

跟xml的逻辑一样,同样是

2. bbo从 2.4.5 升级到 2.7.8 注意事项

一、升级bbo版本

二亏册、替换所有Spring版本
因为bbo升级Spring版本也需要跟着升级这里升级为5.2.11.RELEASE

生成的spring依赖要统一不然会出错并桐

四、 全文替换 com.alibaba.bbo 为org.apache.bbo *
包括启动脚绝空坦本从
1、 com.alibaba.bbo.container.Main 替换为 org.apache.bbo.container.Main
2、bbo 配置文件的schema

3. 关于升级 Dubbo 版本到 2.6.5 后启动失败的“坑”

Dubbo 从低版本升级到 2.6.5 版本后,启动失败,报错如下:

<b><font color='red'>上终极方案:使用 2.6.2 以下版本或者 2.7.0 以上版本的 bbo ;</font></b>

具体解决方式需要根据项目的情况解决,提供一些其他方案:

删除 web.xml 中如下的配置:

Spring Boot 工程没有特别好的解决方案,提供两个解决思路:

这个方案也没有绕过添加 web.xml 的命运,做法如下:

观察报错日志,报错位置很明显是 Spring 框架初始化时的报错,重点是: there is already a root application 。

这个错误抛出位置余汪返位于: Spring-web 包的 ContextLoader 类的 initWebApplicationContext 方法。

原因很明显, ContextLoader 被调用了至少两遍,第二遍报错导致项目初始化失败,其主要的“罪魁祸首”是 bbo 包下面的 web-fragment.xml 。

Servlet 3.0 是随着 Java EE 6 规范发布的,主要新增特性:

支持 Servlet 3.0 规范的容器,在启动后会扫描工程的 jar 包,找到符合规范的 添加了相关注解的类 和 web-fragment.xml 然后跟 web.xml 的配置合并作为整个项目的初始化配置。

上述问题的发生原因很明显了:

这个是 Servlet 3.0 提供的一个属性,等同一个开关,设置为 true 则表示 web.xml 已经提供了全部的配置信息,不需要容器再去各个 jar 包找配置了陵罩,换句话就是:关闭 可插特性 ;

这个属性是 注释里面提供的解决思路。这个属性可以理解为指定 web-fragment.xml 的加载顺序,和 ordering 标签的区别是, absolute-ordering 仅仅针对我们指定的 web-fragment.xml 做排序。

轻易升级一个基础框架不是一个好的做法竖饥,<b>升级基础框架还是应该关注下当前版本和目标升级版本,框架作者做了些什么事情,出现过什么BUG。</b>

当前的 Spring Boot 的解决方案并不让人满意,毕竟 Spring Boot 的无Xml的感觉还是很爽的,为了这个升级引入了 web.xml 会有一点点不爽。

4. Dubbo2.7.8服务启动过程源码分析

可以从 git clone,导入intellij idea,子模块bbo-demo可以调试。

也可以新建Maven工程,自写demo。 推荐(要动手)

本文以新建为例,并 推荐 引入nacos做为注册中心(可选其他注册中心)。

新建接口:

新建接口实现类AnnotationProviderServiceImpl:

新建启动类AnnotationProviderBootstrap.

bbo-provider.properties配置文件如下:

整体目录结构:

上述工程是基于annotation方式创建的,所以启动类为

设置断点,并启动。

AnnotatedBeanDefinitionReader的190-192行:

回到84行:

AbstractApplicationContext的524行:

上述是初始化各种Processor,会做两部分操作,可实时查看控制台输出日志。

在的50行设置断点。
回到546行:

来到DubboBootstrap的893行start方法, 核心 所在:

initialize();主要是一些初始化操作。
重点关注exportServices
在exportServices中:
ServiceConfig被翻译成:
<bbo:service beanName="ServiceBean:com.zp.bbo.api.HelloService" />
sc.export()过程:
见ServiceConfig183行:
init serviceMetadata之后真正执行doExport动作,最终来到ServiceConfig304行:doExportUrls
这里做了几件事:
1.registerProvider:将HelloService放入 providers 和providersWithoutGroup。
2.获取注册中心地址:registryURLs
3.doExportUrlsFor1Protocol

4.exportLocal
这里根据不同的Protocol启动不同的Server。可调试进入DubboProtocol的export方法。
5.在RegistryProtocol中注册到注册中心

调试至FailbackRegistry240行:

进入NacosRegistry152行,进行注册。
进入NacosNamingService139行:registerInstance
最终NamingProxy168行registerService完成注册。
6.exported() 分发ServiceConfigExportedEvent事件

那么到此,bbo的服务提供者注册过程分析就已经全部完成。
接下来将进行bbo其他源码分析,包括负载均衡,路由等等。

阅读全文

与dubbo源码版本升级相关的资料

热点内容
非科班程序员自学 浏览:799
压缩泡沫鞋底底材 浏览:217
程序员职场第一课2正确的沟通 浏览:677
遇到不合法app应该怎么办 浏览:90
汇编程序编译后的文件 浏览:77
大智慧均线源码 浏览:371
单片机排阻的作用 浏览:213
滴滴金融app被下架如何还款 浏览:210
jpg转换成pdf免费软件 浏览:741
范里安pdf 浏览:443
伪造pdf 浏览:75
能删除android文件夹吗 浏览:446
LINUX使用V2ray 浏览:797
找人帮忙注册app推广是什么 浏览:820
独立服务器如何恢复初始化 浏览:11
优秀到不能被忽视pdf 浏览:316
导游程序员家政 浏览:586
22乘28的快速算法 浏览:338
软通动力程序员节2021 浏览:846
安卓系统如何卸载安装包 浏览:870