最新dubbo启动引导过程

    科技2026-06-11  2

    dubbo启动引导过程(基于2.7.9)

    前言

    再百度或google上一搜索dubbo服务暴露过程 相关的文章已经有很多了,但是文章

    基本都是基于老版本的dubbo,当你对着文章去看下载下来的代码时,会发现很多东西对不上;出于此目的,我便有了自己根据新版本(就目前来讲)的dubbo来写一些关于我自己的理解,如果有不正确的地方,欢迎大家指出。此篇文章主要是我对dubbo服务启动引导的理解,不包括服务暴露的过程。

    准备

    我们先将dubbo的源码下载下来,地址是 https://github.com/apache/dubbo

    啥都不说了,先run起来

    启动zookeeper

    我们下载好代码,直接用官方的demo来运行。不过呢,你要启动zookeeper;当然,你启动其他的注册中心也可以,不启动也可以,笔者这里使用的docker来启动zookeeper,方便又干净。

    docker run -d -P zookeeper

    这样我们就有了一个zookeeper的注册中心。-P的含义是随机绑定本机端口,你也可以指定端口,不熟悉docker的同学可以自行搜索下。接下来我们看一下zookeeper的端口号

    docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e22afb746c2b zookeeper "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32783->2181/tcp, 0.0.0.0:32782->2888/tcp, 0.0.0.0:32781->3888/tcp, 0.0.0.0:32780->8080/tcp nifty_black

    可以看到zookeeper的2888绑定到了我机器的32782端口

    另外,新版的dubbo的三大中心(注册中心、配置中心、元数据中心)是分开的,我们也可以使用同一个zookeeper,为了简单,我这里都用32782端口这个zookeeper了.

    配置dubbo

    我这里就先用dubbo-demo-xml-provider给大家做示范。将三大中心的zookeeper地址都改为zookeeper://127.0.0.1:32782,这样我们的org.apache.dubbo.demo.provider.Application就可以run起来了。

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <dubbo:application metadata-type="remote" name="demo-provider"/> <dubbo:metadata-report address="zookeeper://127.0.0.1:32782"/> <dubbo:config-center address="zookeeper://127.0.0.1:32782"/> <dubbo:registry address="zookeeper://127.0.0.1:32782"/> <dubbo:protocol name="dubbo"/> <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/> <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/> </beans>

    至此,我们的dubbo provider就可以成功启动了

    dubbo启动过程

    首先看一眼我们demo的main方法

    public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml"); context.start(); System.in.read(); }

    很明显,我们demo启动借助的spring。不过这段代码是怎么知道要启动dubbo的呢?它是在spring.handlers文件中加上了如下内容

    http\://dubbo.apache.org/schema/dubbo=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler http\://code.alibabatech.com/schema/dubbo=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler

    spring.handlers在哪里呢?这这里

    注册dubbo schemas的解析器

    这点就不展开讲了。在老版本的dubbo中,这个类的功能也只有这一个。

    注册DubboBootstrapApplicationListener

    老版本的dubbo是通过ServiceBean继承InitializingBean来实现的,而新版本的则有所改变。新版的dubbo在parse方法中调用了一个方法DubboBeanUtils#registerCommonBeans(BeanDefinitionRegistry registry)这个方法中有一行代码如下

    registerInfrastructureBean(registry, DubboBootstrapApplicationListener.BEAN_NAME,DubboBootstrapApplicationListener.class);

    DubboBootstrapApplicationListener

    DubboBootstrapApplicationListener继承自OneTimeExecutionApplicationContextEventListener,而OneTimeExecutionApplicationContextEventListener继承自ApplicationListener,DubboBootstrapApplicationListener实现了ApplicationListener的onApplicationEvent来监听spring事件,当spring事件为ContextRefreshedEvent时,最终会调dubboBootstrap.start();

    DubboBootstrap

    dubbo启动引导程序,至此,dubbo服务的启动交给了DubboBootstrap.

    总结

    老版本的dubbo是服务启动是有ServiceBean负责的,ServiceBean通过继承InitializingBean进而实现setApplicationContext方法,来启动dubbo服务,而新版本的是从DubboNamespaceHandler中向spring注册DubboBootstrapApplicationListener来监听spring事件,当事件为ContextRefreshedEvent时,会启调用DubboBootstrap#start来启动dubbo服务。接下的的服务暴露等操作就交由DubboBootstrap去完成了。

    Processed: 0.026, SQL: 9