dubbo启动过程(spring方式)详解

selfchange selfchange     2023-01-14     530

关键词:

一、使用Spring xml配置方式的启动过程

  1. 解析XML,注册Bean

  2. 监听Spring事件

  3. 启动或关闭dubbo

二、详细过程

1. 解析XML,注册Bean

  利用Spring提供的NamespaceHandler扩展机制,META-INF下放两个spring配置文件,

  spring.schemas定义xsd文档位置,spring.handlers定义XML标签对应的Handler。

技术分享图片

  spring.schemas内容:

 技术分享图片

  spring.handlers内容:

 技术分享图片

  DubboNamespaceHandler继承NamespaceHandlerSupport(Spring类),并重写了init()方法。

  在init()方法中,注册每个标签对应的解析类(DubboBeanDefinitionParser)。

  技术分享图片

  NamespaceHandlerSupport类中以Map方式存储标签名及对应的解析类;

  技术分享图片

  NamespaceHandlerSupport类中的parse(Element element, ParserContext parserContext)方法,是实际的解析入口,

解析时根据标签名获取对应的parser,然后再调用parser的parse方法(即DubboBeanDefinitionParser中的parse方法)。

  在DubboBeanDefinitionParser的parse方法中,生成BeanDefinition对象,并使用ParserContext中的BeanDefinitionRegistry

注册到spring容器中,参考BeanDefinitionRegistry#registerBeanDefinition(String beanName, BeanDefinition beanDefinition)。

  注意: dubbo的所有bean都是非懒加载的;

      spring中,需要在parser的parse方法中注册bean,spring不负责注册parse方法返回的BeanDefinition。

  另外,关于spring.handlers解析及DubboBeanDefinitionParser的init()方法调用,参考spring的DefaultNamespaceHandlerResolver。

2. 注册监听Spring事件

  dubbo的jar包中,META-INF目录下有一个web-fragment.xml文件(web-fragment工作方式请自行百度)

  技术分享图片

  其关键的内容如下,配置了一个context属性:contextInitializerClasses

技术分享图片

  DubboApplicationContextInitializer类源码如下:

  技术分享图片

  可以看到,此处将DubboApplicationListener添加到Spring容器中(即AbstractApplicationContext中的listener列表)

  技术分享图片

  DubboApplicationContextInitializer.initialize()方法在Spring中的执行过程:

    web应用中,我们配置web.xml中的Spring启动监听器:

    技术分享图片

    ContextLoaderListener中,contextInitialized()方法启动Spring容器。

    技术分享图片

    ContextLoaderListener继承了ContextLoader,ContextLoader中customizeContext方法中,

    读取contextInitializerClasses属性执行的class(多个class支持 ,; 四种分隔符),并调用其initialize()方法。

  接下来看一下DubboApplicationListener内容:

  技术分享图片

  Spring启动完成时,产生ContextRefreshEvent事件,并回调所有listener.

  具体代码在:AbstractApplicationContext.finishRefresh()方法中:

  技术分享图片

   publishEvent()中,再使用SimpleApplicationEventMulticaster.multicastEvent()方法回调所有监听器

  的onApplicationEvent()方法。

  技术分享图片

  技术分享图片

  至此,上述即为dubbo注册即监听Spring的过程。

  另外,如果不是web应用是怎么做的呢?

    Dubbo提供了SpringContainer来启动非web应用,依然是采用Spring注册监听机制

     技术分享图片

3. 启动dubbo

  由DubboBootstrap.start()方法负责。

  技术分享图片

  详细的启动过程下次给出。

 

本人水平有限,文中有不当之处欢迎评论中指出。

 

dubbo--系统学习笔记--快速启动

快速启动服务提供者服务消费者快速启动  Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。  如果不想使用Spring配置,而希望通过API... 查看详情

dubbo启动源码解析一

参考技术A这次讲dubbo-spring-boot-starter启动方式,所以入口就是Spring的SPI机制;首先在META-INF/spring.factories配置下,配置了org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration类,在启动时,则会把DubboAutoConfiguration类注册到spring容器中... 查看详情

dubbo(一)——dubbo集成于spring的原理

...接从dubbo的配置和一些核心的API开始讲起,是从dubbo已经启动的过程作为开始节点,而这些核心API与Spring的之间的关系被省略了,这些东西对我来说属于前置的知识点,所以花了比较长的时间又从Dubbo的核心API倒着往前看。在阅读... 查看详情

springframework启动详解(代码片段)

之前一直对Spring启动的过程很迷糊,所以这次国庆梳理一下。Spring启动一言以蔽之:创建一个根应用上下文。(因为其他的所有的应用上下文都可以通过各种方式继承它) (一)了解应用上下文SpringFramework容器以一个或多个... 查看详情

dubbo的配置过程,实现原理及架构详解

...资源就变得在所难免。因此,后期涌现出了很多RPC(远程过程调用)的框架,如ApacheThrift、Hessian、gRPC等。然而,随着RPC框架的推广和使用的日益深入,服务越来越多的情况也衍 查看详情

spring学习--详解spring启动配置(经典文章)

摘自:https://www.jianshu.com/p/280c7e720d0cspring的启动是建筑在servlet容器之上的,所有web工程的初始位置就是web.xml,它配置了servlet的上下文(context)和监听器(Listener),下面就来看看web.xml里面的配置:<!--上下文监听器,用于监听s... 查看详情

dubbo架构设计详解

...libaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要... 查看详情

dubbo怎么不依赖spring

...,实现了sync-over-async和request-response消息机制.RPC:一个远程过程调用的抽象,支持负载均衡、容灾和集群功能Registry:服务目录框架用于服务的注册和服务事件发布和订阅。Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任... 查看详情

spring容器启动过程

...Spring,这几天没事看了看Spring源码,总结了下Spring容器的启动过程,想把它记录下来,免得忘了spring容器的启动方式有两种:1、自己提供ApplicationContext自己创建Spring容器2、Web项目中在web.xml中配置监听启动org.springframework.web.contex... 查看详情

dubbo-发布服务执行的流程

...licationContextAware,ApplicationListener,BeanNameAware来融入到spring的启动过程。ServiceBean实现了ApplicationListener接口,当spring容器触发了ContextRefreshedEvent事件时,就会调用ServiceConfig中的export()方法发布申明的dubbo服务,ServiceConfig中的export()方... 查看详情

spring启动加载过程源码分析

我们知道启动spring容器两常见的两种方式(其实都是加载spring容器的xml配置文件时启动的):1.在应用程序下加载ApplicationContextctx=newClassPathXmlApplicationContext("spring-context.xml");2.web模式下加载<context-param><param-name>contextConfi 查看详情

spring事务使用详解(代码片段)

... address 表:user表:address表:2.Spring配置文件启动事务:1<tx:annota 查看详情

linux开启过程详解

解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的。该文章陈述了GRUB2引导装载程序开机引导装载内核的过程和systemd初始化系统执行开机启动操作系统的过程。 ??事实上,操作系统的启动分... 查看详情

dubbbospring配置方式解析(代码片段)

我们知道dubbo使用了spring的自定义标签。在使用自定义标签的时候,需要建立自定义标签的解析类BeanDefinitionParser,Dubbo中的BeanDefinitionParser为com.alibaba.dubbo.config.spring.schema.DubboBeanDefinitionParser,建立处理类NamespaceHandlerSu... 查看详情

详解spring——ioc之分析bean的生命周期

...p/f968bf1a1892在分析SpringBean实例化过程中提到Spring并不是一启动容器就开启bean的实例化进程,只有当客户端通过显示或者隐式的方式调用BeanFactory的getBean()方法来请求某个实例对象的时候,它才会触发相应bean的实例化进程,当然... 查看详情

dubbo原理和机制详解(非常全面)

...2)智能容错和负载均衡提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。3)服务注册和发现服务注册,基于注册中心目录服... 查看详情

从零开始认识dubbo

...在dubbo上注册)其核心部分包含:2.Dubbo能做什么Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。3.Dubbo架构节点角色说明:Provider:暴露服务... 查看详情

dubbo学习dubbo面试题

...法,默认随机actives:消费者端,最大并发调用限制9、Dubbo启动时如果依赖的服务不可用会怎样?Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常, 查看详情