一、dubbo的三大核心接口

一、dubbo的核心领域对象是Invoker,dubbo通过Protocol来管理Invoker的生命周期,包括服务的暴露和引用都是通过它来完成,而在进行服务调用的过程是退过Invocation来保存调用过程中的变量:包括方法名,参数等。所有在整个dubbo调用过程当中:

  • Invoker 是实体域,它是 Dubbo 的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
public interface Invoker<T> extends Node {

    Class<T> getInterface();

    Result invoke(Invocation invocation) throws RpcException;

}
  • Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。
@SPI("dubbo")
public interface Protocol {

    int getDefaultPort();

    @Adaptive
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;

    @Adaptive
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;

    void destroy();

}
  • Invocation 是会话域,它持有调用过程中的变量,比如方法名,参数等。
public interface Invocation {

    String getMethodName();

    Class<?>[] getParameterTypes();

    Object[] getArguments();

    Map<String, String> getAttachments();

    String getAttachment(String key);

    String getAttachment(String key, String defaultValue);
    
    Invoker<?> getInvoker();

}

二、dubbo的服务暴露过程

invoke dubbo时中文乱码 dubbo invoker_远程服务


首先从配置文件中获取对外提供的实现类Impl(如:DemoServiceImpl),然后通过AOP代理ProxyFactory把Impl生成一个AbstractProxyInvoker实例,到这里就完成了具体服务到Invoker的转化。

在Invoker中主要包括以下几个属性:

  1. 当前接口的Class实例(DemoService.class)
  2. 当前接口的实例类对象(DemoServiceImpl.class)
  3. URL,配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息
  4. 当前接口的代理对象Wrapper实例

dubbo 的对象转换过程:

invoke dubbo时中文乱码 dubbo invoker_zookeeper_02

三、服务的注册

在服务的暴露过程中其实包括2个过程:

  1. 把服务通过配置相应的协议暴露到本地服务
  2. 把暴露的服务注册到配置的注册中心中

dubbo服务暴露与注册主要是通过RegistryProtocol这个类来完成的。以dubbo为通信协议,zookeeper为注册中心举例。

四、总结

在dubbo中屏蔽了远程调用的各个细节,抽象出了服务注册方(Provider)、注册中心(Registry)和服务消费方(Consumer),实现了服务发布与服务调用的解耦。并且做为服务调用可以以本地方法的形式来调用远程服务。关于服务发布与服务调用的上面只是说了服务暴露的主要的三个过程。其实在服务暴露的时候发出了以下几个动作:

  • 暴露本地服务
  • 暴露远程服务
  • 启动Netty
  • 连接Zookeeper
  • 到Zookeeper中注册
  • 监听zookeeper