2.2.2 导出服务到本地

本节我们来看一下服务导出相关的代码,按照代码执行顺序,本节先来分析导出服务到本地的过程。相关代码如下:

  1. private void exportLocal(URL url) {
  2. // 如果 URL 的协议头等于 injvm,说明已经导出到本地了,无需再次导出
  3. if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
  4. URL local = URL.valueOf(url.toFullString())
  5. .setProtocol(Constants.LOCAL_PROTOCOL) // 设置协议头为 injvm
  6. .setHost(LOCALHOST)
  7. .setPort(0);
  8. ServiceClassHolder.getInstance().pushServiceClass(getServiceClass(ref));
  9. // 创建 Invoker,并导出服务,这里的 protocol 会在运行时调用 InjvmProtocol 的 export 方法
  10. Exporter<?> exporter = protocol.export(
  11. proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
  12. exporters.add(exporter);
  13. }
  14. }

exportLocal 方法比较简单,首先根据 URL 协议头决定是否导出服务。若需导出,则创建一个新的 URL 并将协议头、主机名以及端口设置成新的值。然后创建 Invoker,并调用 InjvmProtocol 的 export 方法导出服务。下面我们来看一下 InjvmProtocol 的 export 方法都做了哪些事情。

  1. public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
  2. // 创建 InjvmExporter
  3. return new InjvmExporter<T>(invoker, invoker.getUrl().getServiceKey(), exporterMap);
  4. }

如上,InjvmProtocol 的 export 方法仅创建了一个 InjvmExporter,无其他逻辑。到此导出服务到本地就分析完了,接下来,我们继续分析导出服务到远程的过程。