dubbo深度解析(深度理解学习DUBBO源码总结)
dubbo深度解析(深度理解学习DUBBO源码总结)Javaprovider服务提供者:2、cluster:服务框架核心,提供基于接口方法的远程过程调用,包括多协议支持,提供软负载均衡和容错机制的集群支持。3、register:服务注册中心,使服务消费方能动态的查找服务提供方,使地址透明,让服务提供方能平滑增加或减少机器。dubbo入门,与spring整合使用:
dubbo——阿里开源的分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案。
本文建议与Dubbo源码一起参读,有助于理解!
三大核心组件:
1、remoting:远程通讯基础,提供对多种NIO框架进行抽象封装。
2、cluster:服务框架核心,提供基于接口方法的远程过程调用,包括多协议支持,提供软负载均衡和容错机制的集群支持。
3、register:服务注册中心,使服务消费方能动态的查找服务提供方,使地址透明,让服务提供方能平滑增加或减少机器。
dubbo入门,与spring整合使用:
provider服务提供者:
Java
服务消费者:
Java
不管是customer或者是provider,首先都要经配置文件中的内容转化成系统需要的类或接口,此时则要进行初始化;dubbo使用流程大致分为三步,注册、暴露、调用等。
在这里有一个小问题:spring整合dubbo,服务的入口在哪?
想一想spring容器的入口在哪。
-
解析服务
-
基于dubbo.jar内的META-INF/spring.handlers配置,dubbo将会解析dubbo命名空间(回调tDubboNamespaceHandler),将标签与对应类相互映射,解析为Bean对象;
-
在ServiceConfig.export()或者ReferenceConfig.init()初始化时,将Bean转成URL形式,所有Bean属性作为URL参数;
-
将URL传给协议扩展点(SPI机制),基于扩展点的自适应机制,根据URL的协议头,进行不同协议的服务暴露、注册、引用。
-
服务暴露(注册):
想要调用服务,首先要发布服务;下面说一下dubbo服务暴露的主要思想:
dubbo提供使用注册中心和不使用注册中心两种方式,这里我们只讲解使用注册中心;其他相关问题参考dubbo官方文档。
在有注册中心的情况下(如:address="zookeeper://localhost:2181"),ServiceConfig将Bean解析成如下URL格式:
registry://registry-host/com.alibaba.dubbo.registry.RegistryService?export=URL.encode("dubbo://service-host/com.foo.FooService?version=1.0.0")
基于扩展点自适应机制(SPI,有兴趣的话可以了解一下SPI机制),通过URL的register://协议头识别,会调用RegistryProtocol的export()方法,将export参数中的提供者URL先注册到注册中心(dubbo开源后,提供4中注册中心,注册中心的实现代码调用,也使用了SPI机制);
之后,再重新传给 Protocol 扩展点进行暴露,dubbo://service-host/com.foo.FooService?version=1.0.0,然后基于扩展点自适应机制,通过提供者 URL 的 dubbo:// 协议头识别,就会调用DubboProtocol 的 export()方法,打开服务端口。
Java
Exporter 是服务暴露出口,通过getInvoker,获取服务接口invoker。
Dubbo 协议的 Invoker转为 Exporter发生在 DubboProtocol类的 export方法,它主要是打开 socket 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现。
-
服务引用
原理如服务暴露,通过ReferenceConfig解析出URL,通过SPI机制识别协议头,调用RegistryProtocol的refer()方法,或者调用DubboProtocol 的 refer()方法,匹配出提供者引用,然后 RegistryProtocol 将多个提供者引用,通过 Cluster扩展点,伪装成单个提供者引用返回。
Java
-
服务拦截
基于扩展点自适应机制,所有的protocol都会套上wrapper类,这里可以理解成是装饰器模式;ProtocolFilterWrapper类,将所有的Filter组装成链,进行装饰;然后SPI自适应机制,通过 ProtocolListenerWrapper 类,将所有的InvokerListener和ExportListener组装集合,在引用和暴露前后进行回调。
总结:
服务暴露引用链,都是基于SPI扩展点自适应机制完成的,基本调用链总结如下:
ServiceConfig.export()--->RegistryProtocol.export()--->ProtocolFilterWrapper.export()--->ProtocolListenerWrapper.export()--->DubboProtocol.export();
其中方法调用的过程和内部实现相当繁琐,关于dubbo的注册、暴露、引用总结暂时就到这里,如有错误,及时指正~
感谢~