淘先锋技术网

首页 1 2 3 4 5 6 7

五、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 远程服务的暴露机制

  • 整体机制
    在这里插入图片描述