五、Dubbo 启停原理解析
5.1 配置解析
5.1.1 基于 schema 设计解析
-
Dubbo 配置约束文件在 dubbo-config/dubbo-config-spring/src/main/resources/dubbo.xsd 中,dubbo.xsd 文件用来约束使用 XML 配置时的标签和对应的属性
-
- 5.1.2 基于 XML 配置原理解析
-
主要解析逻辑入口是在 DubboNamespaceHandler类中完成,主要把不同的标签关联到解析实现类中。registerBeanDefinitionParser 方法约定了在Dubbo框架中遇到标签application、module和registry等都会委托给DubboBeanDefinitionParser处理
-
如果dubbo:service配置了 class属性,那么为具体class 配置的类注册 Bean,并入 ref 属性。在解析过程中调用了 parseProperties方法,这个方法主要解析〈dubbo:service〉标签中的name、class和ref等属性。parseProperties方法会把key-value键值对提取出来放到BeanDefinition中,运行时Spring会自动处理注入值
-
属性值解析时,如果属性是引用对象,则Dubbo默认会创建RuntimeBeanReference类型注入,运行时由Spring注入引用对象
5.1.3 基于注解配置原理解析 -
当Spring容器启动的时候,如果注解上面使用@Import,则会触发其注解方法selectimports,比如 EnableDubboConfig 注解中指定的 DubboConfigConfigurationSelector.class,会自动触发 DubboConfigConfigurationSelector#selectImports 方法
-
如果业务方配置了 Spring 的@PropertySource 或 XML 等价的配置(比如配置了框架 dubbo.registry.address 和dubbo.application 等属性),则 Dubbo 框架会在 DubboConfigConfigurationSelectorttselectlmports中自动生成相应的配置承载对象
-
服务注解扫描和注册
- ①Dubbo框架首先会提取用户配置的扫描包名称,因为包名可能使用${…}占位符,因此框架会调用Spring的占位符解析做进一步解码
- ②:开始真正的注解扫描,委托Spring对所有符合包名的.class文件做字节码分析,最终通过③配置扫描@Service注解作为过滤条件。在④中将仞Service标注的服务提升为不同的Bean,这里并没有设置beanClasso
- ⑤中主要根据注册的普通Bean生成ServiceBean的占位符,用于后面的属性注入逻辑
- ⑥中会提取普通Bean上标注的Service注解生成新的RootBeanDefinition,用于Spring启动后的服务暴露
-
消费注解注入
- 在①中主要利用这个扩展点查找服务引用的字段或方法
- 在②中触发字段或反射方法值的注入,字段处理会调用findFieldReferenceMetadata方法
- 在③中会遍历类所有字段,因为篇幅的原因,方法级别注入最终会调用findMethodReferenceMetadata方法处理上面的注解
- 在②中会触发字段或方法inject方法,使用泛化调用的开发人员可能用过ReferenceConfig创建引用对象
5.2 服务暴露的实现原理
5.2.1 配置承载初始化
-
默认覆盖策略
- -D 传递给 JVM 参数优先级最高
- 代码或XML配置优先级次高
- 配置文件优先级最低
5.2.2 远程服务的暴露机制
- 整体机制