dubbo源代码-InjvmProtocol
本地调用,使用了Injvm协议,是一个伪协议,它不开启端口,不发起远程调用,只在JVM内直接关联,但执行Dubbo的Filter链。
Defineinjvmprotocol:
<dubbo:protocolname="injvm"/>
Setdefaultprotocol:
<dubbo:providerprotocol="injvm"/>
Setserviceprotocol:
<dubbo:serviceprotocol="injvm"/>
Useinjvmfirst:
<dubbo:consumerinjvm="true".../>
<dubbo:providerinjvm="true".../>
或
<dubbo:referenceinjvm="true".../>
<dubbo:serviceinjvm="true".../>
注意:服务暴露与服务引用都需要声明injvm="true"
自动暴露、引用本地服务
从dubbo2.2.0开始,每个服务默认都会在本地暴露;在引用服务的时候,默认优先引用本地服务;如果希望引用远程服务可以使用一下配置强制引用远程服务。
...
<dubbo:reference...scope="remote"/>
经过测试,用上面的方法无法实现在本地调用,经过在一个jvm中同时启动provider和consumer,以及分为两个jvm,分别起provider和consumer,都未成功
另:用dubbo源代码自带的测试用例编码方式可以实现
DemoServiceservice=newDemoServiceImpl();
Exporter<?>exporter=protocol.export(proxy.getInvoker(service,DemoService.class,URL.valueOf("injvm://127.0.0.1/TestService").addParameter(Constants.INTERFACE_KEY,DemoService.class.getName())));
exporters.add(exporter);
service=proxy.getProxy(protocol.refer(DemoService.class,URL.valueOf("injvm://127.0.0.1/TestService").addParameter(Constants.INTERFACE_KEY,DemoService.class.getName())));
assertEquals(service.getSize(newString[]{"","",""}),3);
service.invoke("injvm://127.0.0.1/TestService","invoke");