zoukankan      html  css  js  c++  java
  • Dubbo服务入口和启动过程(Version2.7.3)

    1. Spring容器何时加载Dubbo组件?

    根据官方说法

    基于 dubbo.jar 内的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名称空间时,会回调 DubboNamespaceHandler。

    所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。

    在 ServiceConfig.export() 或 ReferenceConfig.get() 初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。

    然后将 URL 传给 协议扩展点,基于扩展点的 扩展点自适应机制,根据 URL 的协议头,进行不同协议的服务暴露或引用。

    可以知道,Dubbo的启动得益于Spring的扩展机制

    1. 上面说的是基于XML的扩展机制,体现在

    Handler注册了一系列Bean定义解析器

    2. 而目前Dubbo支持注解配置了,这里就是第二种扩展----基于Java配置的扩展

    比如官方的示例配置:

    @Configuration
    @EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.simple.annotation.impl")
    @PropertySource("classpath:/spring/dubbo-provider.properties")
    static public class ProviderConfiguration {
           
    }

    其中有个 EnableDubbo 注解

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    @EnableDubboConfig
    @DubboComponentScan
    public @interface EnableDubbo {
        @AliasFor(
            annotation = DubboComponentScan.class,
            attribute = "basePackages"
        )
        String[] scanBasePackages() default {};
    
        @AliasFor(
            annotation = DubboComponentScan.class,
            attribute = "basePackageClasses"
        )
        Class<?>[] scanBasePackageClasses() default {};
    
        @AliasFor(
            annotation = EnableDubboConfig.class,
            attribute = "multiple"
        )
        boolean multipleConfig() default true;
    }

    里面有个 EnableDubboConfig 注解

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    @Import({DubboConfigConfigurationRegistrar.class})
    public @interface EnableDubboConfig {
        boolean multiple() default true;
    }

    看见 @Import 注解了吗,它是支持Java配置扩展的关键点,使得Spring在处理 EnableDubboConfig 注解的时候能够调用给定类中的相关方法。

    public class DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRegistrar {
        public DubboConfigConfigurationRegistrar() {
        }
    
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            AnnotationAttributes attributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(EnableDubboConfig.class.getName()));
            boolean multiple = attributes.getBoolean("multiple");
            AnnotatedBeanDefinitionRegistryUtils.registerBeans(registry, new Class[]{Single.class});
            if (multiple) {
                AnnotatedBeanDefinitionRegistryUtils.registerBeans(registry, new Class[]{Multiple.class});
            }
    
        }
    }

    接口 ImportBeanDefinitionRegistrar 里的 registerBeanDefinitions 方法允许Dubbo向Spring里注册Bean。

    到这里我们了解了

    1. Dubbo启动的入口(利用Spring的扩展机制)

    2. Spring的扩展机制(这个网友讲的很棒:https://www.tuicool.com/articles/ueeyYjI)实际上有好多扩展机制:

    • 基于XML配置
    • 基于Java配置
    • 基于BeanFactoryPostProcessor和BeanPostProcessor
    • 基于Aware
    • 基于ApplicationListener

    2. 服务调用过程?

    直接拿官方图片,说的已经很明白了

     调用过程

    1. 服务容器负责启动,加载,运行服务提供者。
    2. 服务提供者在启动时,向注册中心注册自己提供的服务。
    3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
    4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    5. 服务消费者,从缓存的提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    Dubbo一些概念

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

    RPC(Remote Procedure Call)

    远程过程调用协议,通过网络从远程计算机上请求调用某种服务。

    RMI(Remote Method Invocation)

    远程方法调用,能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚拟机中对象的方法。RMI是RPC的java语言的细化版。

    服务治理

    服务治理(SOA governance),按照Anne Thomas Manes的定义是:企业为了确保事情顺利完成而实施的过程,包括最佳实践、架构原则、治理规程、规律以及其他决定性的因素。服务治理指的是用来管理SOA的采用和实现的过程。

  • 相关阅读:
    13 款开源的全文检索引擎
    Laravel5.5 Jwt 1.0 beta 配置
    Laravel SQL 查询语句集锦
    laravel在中间件内生成的变量如何传到控制器
    laravel中的自定义函数的加载和第三方扩展库加载
    laravel5.5 dingo/api+jwt-auth
    微信小程序之使用checkbox
    微信小程序之使用wx:for遍历循环
    微信小程序之页面导航栏
    微信小程序之数据缓存
  • 原文地址:https://www.cnblogs.com/LUA123/p/12455732.html
Copyright © 2011-2022 走看看