dubbo服务的本地暴露,显然是针对当服务消费者和服务提供者都在同一个jvm的进程内这种场景 。通常是发生在服务之间的调用的情况下。一种情况就是A服务调用B服务的情况,如果A服务和B服务都是在一个线程中进行服务暴露的,就是本地调用。

下面先看本地暴露的源码:

 private void exportLocal(URL url) {
//这是本协议url示例:injvm://127.0.0.1/org.huxin.dubbo.test.user.service.UserInterface?anyhost=true&application=dubbo-provider&default.retries=0&default.timeout=5000&dubbo=2.8.4&generic=false&interface=org.huxin.dubbo.test.user.service.UserInterface&methods=getUserById,getUserList,updateUsers&organization=huxin&owner=programmer&pid=5964&retries=0&serialization=kryo&side=provider&timestamp=1513044127040
if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
URL local = URL.valueOf(url.toFullString())
.setProtocol(Constants.LOCAL_PROTOCOL)
.setHost(NetUtils.LOCALHOST)
.setPort(0); // ServiceClassHolder是用来保存当前服务接口实例ref对应的Class的,是一个简单的单例实现
ServiceClassHolder.getInstance().pushServiceClass(getServiceClass(ref));
       //由于默认protocol是dubbo,所以此处的protocol应是com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol类的实例
Exporter<?> exporter = protocol.export(
proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
exporters.add(exporter);
logger.info("Export dubbo service " + interfaceClass.getName() +" to local registry");
}
}
根据上面的源码,我们只需搞清楚Invoker实例是如何产生的,Invoker是什么,以及DubboProtocol的export方法就可以分析清楚本地暴露的过程了。
1. proxyFactory.getInvoker(ref, (Class) interfaceClass, local)
(1)首先是
proxyFactory的来历
ServiceConfig类中初始化时进行实例化:private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
根据之前对dubbo的SPI机制,这个proxyFactory当是com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory类的实例,也就是使用Javassist技术来产生Invoker对象。
ProxyFactory接口有两个方法:
<T> T getProxy(Invoker<T> invoker) throws RpcException; //供消费者使用

<T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;  //服务提供者使用

 (2) JavassistProxyFactory实例的 getInvoker方法分析

       可以通过如下源码看出Invoker实例在被调用时实隙地是通过其内部的wrapper对象调用proxy对象来完成的 ,下面分析下这个方法传入的参数:

  • 第一个参数proxy传入是的ref变量  ,

ref的定义:private T  ref; //接口实现类的引用  ,就是接口实现类的Class的实例

赋值的相关代码参见:http://www.cnblogs.com/hzhuxin/p/7677265.html

  • 第二个参数 type  的定义是:private Class<?>            interfaceClass;  //也就是我们定义服务接口
  • 第三个参数url 比较理解,是由之前面的调用方法 doExportUrlsFor1Protocol(protocolConfig, registryURLs) 方法拼接出来的
public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
// TODO Wrapper类不能正确处理带$的类名
final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
return new AbstractProxyInvoker<T>(proxy, type, url) {
@Override
protected Object doInvoke(T proxy, String methodName,
Class<?>[] parameterTypes,
Object[] arguments) throws Throwable {
return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
}
};
}
2. DubboProtocol的export方法分析:
因本方法比较重要,新开一篇进行分析 ,参见http://www.cnblogs.com/hzhuxin/p/8228982.html

dubbo源码分析13——服务本地暴露 exportLocal(url)的更多相关文章

  1. 4. 源码分析---SOFARPC服务端暴露

    服务端的示例 我们首先贴上我们的服务端的示例: public static void main(String[] args) { ServerConfig serverConfig = new Ser ...

  2. dubbo源码分析8——服务暴露概述

    从上文中可知,com.alibaba.dubbo.config.spring.ServiceBean类是负责解析<dubbo:service/>的配置的,下面是它的类图 从类图上可知它继承 ...

  3. dubbo源码分析12——服务暴露3_doExportUrls()方法分析

    本文紧接上文,doExportUrls()方法位于ServiceConfig类中,代码入口如下: private void doExportUrls() { List<URL> regis ...

  4. dubbo源码分析10——服务暴露1_export()方法分析

    ServiceConfig类中的export()方法,是dubbo服务暴露的入口方法,被触发的时机有两个: 1. spring容器初始化完成所有的bean实例后,通过事件机制触发 2. 实现Initi ...

  5. dubbo源码分析11——服务暴露2_doExport()方法分析

    protected synchronized void doExport() { //如果是已经解除暴露的接口则抛出异常 if (unexported) { throw new IllegalStat ...

  6. Dubbo源码分析系列---服务的发布

    摘要: 通过解析配置文件,将xml定义的Bean解析并实例化,(涉及重要的类:ServiceBean.RegistryConfig[注册中心配置].ProtocolConfig[协议配置].Appli ...

  7. Dubbo 源码分析 - 服务导出

    1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程.Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可 ...

  8. Dubbo 源码分析 - 服务调用过程

    注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...

  9. dubbo源码分析2-reference bean发起服务方法调用

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

随机推荐

  1. ARM三级流水线

    title: ARM三级流水线 tags: ARM date: 2018-10-14 16:57:10 --- 参考: ARM指令集E004armproc.chm ARM Architecture R ...

  2. python--编写用例脚本

    from appium import webdriverimport time desired_caps = {}desired_caps['platformName'] = 'Android'des ...

  3. idea使用maven打包项目

    第一步:打开maven Projects 第二步.找到package 第三步,运行.到路径下面去找打包的文件吧. 第二种方法: 使用命令 cmd进入项目目录,例如项目在D盘项目名poject 输入: ...

  4. WebStorm记录(3)

    连通接口 接口 我自己理解前后端传输数据都是通过ajax方式 一般使用get和post两种方式传输数据 GET 接口 接口描述 获取登录验证码图片及密钥 HTTP方法 POST URL /captch ...

  5. Oracle了解(一)

    通常所说的Oracle数据库服务器由一个数据库和至少一个数据库实例组成. 数据库实例是由系统后台进程和分配的内存区域构成 实例你是提供服务的进程,数据库是存放的数据. 数据库是存储数据的文件 数据库实 ...

  6. Windows Server 2008 R2中无法使用360免费Wifi的解决方案

    为了使主机和虚拟机在同一个无线网络中,而虚拟机的系统是Windows Server 2008 R2 64位的,使用360免费wifi,始终无法开启.在网上查找解决方案,终于找到了原因:Windows ...

  7. SpringBoot 2.0集成spring-data-elasticsearch

    1 资料 https://segmentfault.com/a/1190000015568618 https://github.com/JeffLi1993/springboot-learning-e ...

  8. pom样板

    <properties> <java.version>1.6</java.version> <project.build.sourceEncoding> ...

  9. rabbitMQ学习2-Python与rabbitmq

    python客户端 # rabbitmq官方推荐的python客户端pika模块 pip3 install pika 应用场景1:单发送单接收 1.生产-消费者模型 P 是生产者 C 是消费者 中间h ...

  10. python 的基础学习 第九天 文件的操作

    1,文件操作 参数:1,文件路径  2,编码方式,3,执行动作(打开方式),只读,只写,,读写,追加和读写. 1  打开文件,得到文件句柄并赋值给一个变量.2. 通过句柄对文件进行操作.3. 关闭文件 ...