第二章 C和P,Invoker和Exporter

来源:互联网 发布:md5算法 编辑:程序博客网 时间:2024/06/08 04:47

一、Consumer

引用流程:
调用ReferenceConfig的get()方法,如果通过Spring启动,那么ReferenceBean实际上也是通过BeanFactory的getObject方法来调用父类型ReferenceConfig的get方法;
处理配置,包括dubbo.properties,dubbo.xml,dubbo注解等等。
如果有注册中心配置,通过RegistryProtocol的refer方法,来生成ClusterInvoker,如果没有注册中心配置,直接调用对应协议的refer方法生产Invoker。
注册中心中的refer方法,会先通过注册中心地址,通过RegistryFactory工厂方法,获取Registry(注册中心访问入口),并将该Registry注入到Directory中,而Directory负责维护可访问的Invoker列表,然后将该Directory引用传递给ClusterInvoker,这样在集群调用的时候,先通过Directory获取可用Invoker,然后再根据loadbalance执行,dubbo集群软负载和核心思想大致如此。
而其中Dubbo协议的Invoker生成依赖于Transport来构建Client,Dubbo又将Client抽象为一系列接口便与拓展。

Dubbo官网引用服务时序图

二、Provider

暴露时序:
暴露时序相对于引用时序实际上还简单一些,通过ProxyFactory将需要暴露的服务伪装成一个ProxyInvoker,如此在Server收到请求的时候调用invoke方法的时候能够实际上调用到该服务。并且将该Exporter根据ServiceName等参数缓存到map中,当收到请求,根据不同的服务,调用不同的Invoker以达到远程调用的功能。然后通过Transporter开启Server,绑定到指定的端口,并且把处理RPC调用的Handler注册到Server上去。

dubbo官网暴露服务时序图

三。Invoker

Dubbo中的Invoker有许多实现类型,我大致分成四类
1、AbstractClusterInvoker的子类型
2、AbstractInvoker的子类型
3、AbstractProxyInvoker的子类型
4、其他Invoker接口的子类型。

1、 AbstractClusterInvoker

AbstractClusterInvoker是dubbo对集群调用的一个封装,
AbstractClusterInvoker及其子类型中持有Directory的引用,该Directory正是在一个或多个注册中心中,可用Invoker的目录维护。
总之,AbstractClusterInvoker及其子类型,是用于集群调用的,并非真正的调用实现Invoker。

2、AbstractInvoker

AbstractInvoker的子类型是真正对远程调用的执行过程,例如DubboInvoker、ThriftInvoker等都是该类型的子类型。

3、AbstractProxyInvoker

AbstractProxyInvoker 是服务方暴露服务时,对服务方法调用的抽象,也就是说,所有该服务的调用,最终都会通过该代理,调用到服务类型中去。

4、其他Invoker接口的实现类

其他Invoker的实现类,主要完成一些warpper增强,mock,merge等功能。

四、Exporter

同样,Exporter的结构相对于Invoker也要简单许多,只需要维护一个ProxyInvoker ,以便于找到对应的服务并且调用即可,并无其他核心功能。

0 0