快捷搜索:  汽车  科技

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服务提供者:

dubbo深度解析(深度理解学习DUBBO源码总结)(1)

Java

服务消费者:

Java

不管是customer或者是provider,首先都要经配置文件中的内容转化成系统需要的类或接口,此时则要进行初始化;dubbo使用流程大致分为三步,注册、暴露、调用等。

在这里有一个小问题:spring整合dubbo,服务的入口在哪?

想一想spring容器的入口在哪。

  • 解析服务

  1. 基于dubbo.jar内的META-INF/spring.handlers配置,dubbo将会解析dubbo命名空间(回调tDubboNamespaceHandler),将标签与对应类相互映射,解析为Bean对象;

  2. 在ServiceConfig.export()或者ReferenceConfig.init()初始化时,将Bean转成URL形式,所有Bean属性作为URL参数;

  3. 将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()方法,打开服务端口。

dubbo深度解析(深度理解学习DUBBO源码总结)(2)

Java

Exporter 是服务暴露出口,通过getInvoker,获取服务接口invoker。

Dubbo 协议的 Invoker转为 Exporter发生在 DubboProtocol类的 export方法,它主要是打开 socket 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现。

  • 服务引用

原理如服务暴露,通过ReferenceConfig解析出URL,通过SPI机制识别协议头,调用RegistryProtocol的refer()方法,或者调用DubboProtocol 的 refer()方法,匹配出提供者引用,然后 RegistryProtocol 将多个提供者引用,通过 Cluster扩展点,伪装成单个提供者引用返回。

dubbo深度解析(深度理解学习DUBBO源码总结)(3)

Java

  • 服务拦截

基于扩展点自适应机制,所有的protocol都会套上wrapper类,这里可以理解成是装饰器模式;ProtocolFilterWrapper类,将所有的Filter组装成链,进行装饰;然后SPI自适应机制,通过 ProtocolListenerWrapper 类,将所有的InvokerListener和ExportListener组装集合,在引用和暴露前后进行回调。

总结:

服务暴露引用链,都是基于SPI扩展点自适应机制完成的,基本调用链总结如下:

ServiceConfig.export()--->RegistryProtocol.export()--->ProtocolFilterWrapper.export()--->ProtocolListenerWrapper.export()--->DubboProtocol.export();

其中方法调用的过程和内部实现相当繁琐,关于dubbo的注册、暴露、引用总结暂时就到这里,如有错误,及时指正~

感谢~

猜您喜欢: