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");

相关推荐