dubbo源代码-InjvmProtocol

本地调用,使用了Injvm协议,是一个伪协议,它不开启端口,不发起远程调用,只在JVM内直接关联,但执行Dubbo的Filter链。
Define injvm protocol:

<dubbo:protocolname="injvm"/>
Set default protocol:

<dubbo:providerprotocol="injvm"/>
Set service protocol:

<dubbo:serviceprotocol="injvm"/>
Use injvm first:

<dubbo:consumerinjvm="true".../>
<dubbo:providerinjvm="true".../>


<dubbo:referenceinjvm="true".../>
<dubbo:serviceinjvm="true".../>
注意:服务暴露与服务引用都需要声明injvm="true"
自动暴露、引用本地服务

从 dubbo 2.2.0 开始,每个服务默认都会在本地暴露;在引用服务的时候,默认优先引用本地服务;如果希望引用远程服务可以使用一下配置强制引用远程服务。

...
    <dubbo:reference...scope="remote"/>

经过测试,用上面的方法无法实现在本地调用,经过在一个jvm中同时启动provider和consumer,以及分为两个jvm,分别起provider和consumer,都未成功
另:用dubbo源代码自带的测试用例编码方式可以实现
DemoService service = new DemoServiceImpl();
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(new String[]{"", "", ""}), 3);
service.invoke("injvm://127.0.0.1/TestService", "invoke");

猜你喜欢

转载自yiduwangkai.iteye.com/blog/2323004