Dubbo服务端在启动服务时会经历怎样的调用过程?在收到消费者发送的请求后会经历怎样的调用过程?这篇文章主要针对以上两个调用过程并结合Dubbo源码进行分析。
我们采用的是Consumer-Provider的Demo提供的示例,并按照《Dubbo消费者调用过程源码分析》中的分析思路,下面将对两种过程进行进一步分析,先来看一张服务发布过程的时序图(图片太大建议在新的窗口打开查看),对服务发布与注册有个大致的了解:
Dubbo服务端在启动服务时会经历怎样的调用过程?在收到消费者发送的请求后会经历怎样的调用过程?这篇文章主要针对以上两个调用过程并结合Dubbo源码进行分析。
我们采用的是Consumer-Provider的Demo提供的示例,并按照《Dubbo消费者调用过程源码分析》中的分析思路,下面将对两种过程进行进一步分析,先来看一张服务发布过程的时序图(图片太大建议在新的窗口打开查看),对服务发布与注册有个大致的了解:
从Dubbo 2.7.0的项目依赖来看,依赖的Spring Framework版本是4.3.16.RELEASE
:
1 | <properties> |
Dubbo是基于Spring构建和运行的,兼容Spring配置,Dubbo利用了SpringFramework的Extensible XML authoring 特性,扩展了Spring标签,关于如何利用Spring扩展标签,可以参考官方文档 《Extensible XML authoring》:
编写xml,描述需要扩展的标签的配置属性,dubbo实现放在jar包META-INF/dubbo.xsd
文件里 同时通过编写META-INF/spring.handlers
文件,提供给spring,内容如下:
1 | http\://dubbo.apache.org/schema/dubbo=org.apache.dubbo.config.spring.schema.DubboNamespaceHandler |
编写一个NamespaceHandler接口实现类,dubbo中的实现类是DubboNamespaceHandler,同时通过编写META-INF/spring.schemas
文件提供给Spring,内容如下:
1 | http\://dubbo.apache.org/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd |
编写一个或多个BeanDefinitionParser实现类,用来解析扩展的元素,Dubbo实现类是DubboBeanDefinitionParaser
把以上解析组件注册给Spring
Dubbo是微内核架构,还是开闭原则的应用,把核心流程架构固定,但是流程的各个节点对重新改进是开放的。具体的实现机制就是SPI(Service Provider Interface)机制,Dubbo基于Java SPI机制(不了解Java SPI机制的可以参考这篇文章《深入理解Java SPI机制》),在其基础上做了改进和扩展。
根据SPI规范,接口由框架定义,具体实现可以由不同的厂商提供,在Dubbo jar包可以发现在/META-INF/dubbo/internal
目录下有许多接口命名的文件,文件里面的内容就是文件名代表的接口的各种实现类,这就是Dubbo SPI机制的配置基础,以org.apache.dubbo.rpc.Protocol
文件为例,内容如下(dubbo-2.7.0-SNAPSHOT 版本):
1 | filter=org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper |
在分析Dubbo RPC服务调用过程之前,我们先写一个基于Dubbo实现的Consumer-Provider的Demo,通过这个Demo来分析具体的RPC调用栈。
先定义一个接口:
1 | /** |
我们基于zookeeper注册中心,服务端配置如下:
1 | <dubbo:application name="dubbo-server" owner="Junlan" /> |
客户端配置如下:
1 | <dubbo:application name="dubbo-client" owner="Junlan"/> |
1 | org.apache.dubbo.common.bytecode.Proxy //生成代理类 |
1 | // create ProxyInstance class. |
Update your browser to view this website correctly. Update my browser now