前言
再百度或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 psCONTAINER 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.xsdhttp://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)
这个方法中有一行代码如下
java 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
去完成了。