(二)Dubbo底层实现的原理------服务的调用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36520235/article/details/88617696

Dubbo原理的实现之服务的调用

(一)大概描述一下整个服务调用的过程的准备工作和总体流程,后面一步一步分析

先说一下dubbo调用服务的原理需要的前置步骤,相当于准备工作:

  • dubbo在引用服务的时候是分两种方式的,第一种是我们正常使用的懒汉式的加载方式的,其实就是我们用@Reference注解的时候使用的就是懒汉式的加载方式
  • 第二种是当我们在 Spring 容器调用 ReferenceBean 的 afterPropertiesSet 方法时引用服务,这种调用方式其实是一种饿汉式的加载方式,然后两者调用的开始其实就是从ReferenceBean 的 getObject 方法开始

现在调用完事之后,下一步就是决定引用那种服务,有三种可供选择的嗲用服务的方式:

  1. 第一种是引用本地 (JVM) 服务
  2. 第二是通过直连方式引用远程服务
  3. 第三是通过注册中心引用远程服务
  4. 然后最终都会生成一个Invoker对象,此时的Invoker对象已经具备调用本地或远程服务的能力了,但是不能直接暴露给用户,会对一下业务造成侵入,然后需要使用代理工厂类代理对象去调用Invoker的逻辑。

总的概括一下总的调用流程:

首先是ReferenceConfig类先去调用init()方法,然后会在init方法中调用Protocol的refer()方法生成一个Invoker对象实例,这里是消费服务的关键,然后会在init方法中通过createProxy(map)方法生成一个代理对象,然后在CreateProxy方法中进行判断是采用哪种调用方式(就是上面三种方式之一),并去调用refer()方法生成一个Invoker对象,接下来会把Invoker对象转换为客服端需要的对象(UserService),

引用服务的时序图:
在这里插入图片描述
整个调用过程的简化图:
在这里插入图片描述

(二)源码分析的流程:

1. 处理配置

2. 引用服务

  1. 创建Invoker对象实例,在服务提供方,Invoker 用于调用服务提供类。在服务消费方,Invoker 用于执行远程调用。Invoker 是由 Protocol 实现类构建而来
  2. 创建代理,代理对象生成的入口方法为 ProxyFactory 的 getProxy,并对服务接口进行生成代理对象, Proxy 的 getProxy 方法获取 Proxy 子类,然后创建 InvokerInvocationHandler 对象,并将该对象传给 newInstance 生成 Proxy 实例
  3. 然后就没了,就是直接是使用就行了

猜你喜欢

转载自blog.csdn.net/qq_36520235/article/details/88617696