服务端暴露过程

dubbo本地调用和远程调用 dubbo远程调用过程_java

  • 在spring整合dubbo中,NamespaceHandlerDubboBeanDefinitonParser完成解析工作,服务提供两个Bean,一个给本地spring容器,另一个交给dubbo
  • serviceBean实现了AppliactionListener<ContextRefreshEvent>onApplicationEvent方法监听ContextRefreshEvent事件,spring bean加载完成,发布ContextRefreshEvent,执行export方法。加载父类ServiceConfig export方法暴露。
export()
	 doExport()
	 		doExportUrls()
	 			doExportUrlsFor1Protocol() 
	 				 exportLocal()暴露本地服务  封装成exporter对象 exporterMap 
	 				 暴露远程服务  封装成exporter对象 存入exporterMap 中
	 				   protected final Map<String, Exporter<?>> exporterMap = new ConcurrentHashMap<String, Exporter<?>>();
private void doExportUrls() {
        List<URL> registryURLs = loadRegistries(true);
        for (ProtocolConfig protocolConfig : protocols) {
            doExportUrlsFor1Protocol(protocolConfig, registryURLs);
        }
}
  • 首先获取properties里面所有注册的url地址,接着对每个协议对应不同的注册中心进行暴露,进行本地暴露、远端暴露,远端暴露的过程中包含Netty服务器的配置和启动、向zk服务器注册并订阅。

客户端引用过程

dubbo本地调用和远程调用 dubbo远程调用过程_java_02

  • 扫描配置文件,ReferenceBean继承FactoryBeanReferenceConfiginit()开始,
init()
	    createProxy() 创建代理Invoker,最后利用FactoryBean.getObject()注入
  • createProxy 功能
  • 判断是否是本地JVM的服务
  • 获取注册地址,判断是否是单个URL
  • 注册消费者信息到注册中心中
  • 订阅服务提供者、路由和配置的信息
  • 加入Cluster,将Directory包装成Invoker
  • 最后生成Invoker对象

Invoker作用

  • 它是一个可执行的对象,能够根据方法的名称、参数得到相应的执行结果。
  • 它里面有一个方法Result invoke(Invocation invocation)
  • Invocation是包含需要执行的方法和参数的重要信息,目前他有实现类RpcInvocation、MockInvocation
  • 它的三种类型的Invoker
    1)本地执行类的Invoker
    service端:通过InjvmExporter来进行反射调用方法执行
    2)远程通信类的Invoker
    client端:通过DubboInvoker进行远程通信,发送要执行的接口给server端
    server端:采用AbstractProxyInvoker代理执行,然后将结果返回
    3)多个远程通信执行类的Invoker聚合成集群版的Invoker
    client端:通过AbstractClusterInvoker来进行负载均衡,DubboInvoker进行远程通信,发送要执行的接口给server端:采用AbstractProxyInvoker代理执行,然后将结果返回

消费者网络发送过程

  • 服务代理(创建InvokerInvacationHandler对象)
  • –>服务降级–>集群容错(容错、目录查找、负载均衡)
  • –>扩展点(监听器链。过滤器链)–>服务引用—>
  • 编解码序列化–>网络传输(用来抽象netty和mina接口)
  • –>服务端接受–>从exporterMap提取一个Invoker对象–>
  • (javaassitProxyFactory.AbstractProxyInvoker).doInvoke
  • –>真正实现的方法

接受过程相反