From 04fc3ce4cc87b9bd09546c12df3f8762b9525da9 Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Fri, 1 May 2020 15:45:39 +0800 Subject: [PATCH] Ignore deserilization when service/method not found (#5733) --- README.md | 2 ++ .../apache/dubbo/rpc/model/ServiceRepository.java | 8 ++++++++ .../dubbo/registry/dubbo/RegistryProtocolTest.java | 2 ++ .../registry/dubbo/RegistryStatusCheckerTest.java | 2 ++ .../rpc/protocol/dubbo/CallbackServiceCodec.java | 5 ++++- .../protocol/dubbo/DecodeableRpcInvocation.java | 4 ++++ .../rpc/protocol/dubbo/ArgumentCallbackTest.java | 5 +++++ .../rpc/protocol/dubbo/DubboProtocolTest.java | 11 +++++++++++ .../dubbo/rpc/protocol/dubbo/MultiThreadTest.java | 4 ++++ .../dubbo/decode/DubboTelnetDecodeTest.java | 14 ++++++++++++++ .../dubbo/rpc/protocol/dubbo/support/EnumBak.java | 10 ++++++++++ 11 files changed, 66 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c9e59ebe21..0eebf9db8e 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Apache Dubbo is a high-performance, Java based open source RPC framework. Please We are now collecting dubbo user info in order to help us to improve Dubbo better, pls. kindly help us by providing yours on [issue#1012: Wanted: who's using dubbo](https://github.com/apache/dubbo/issues/1012), thanks :) +[使用文档](http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html)/[Documentation](http://dubbo.apache.org/en-us/docs/user/quick-start.html) + ## Architecture ![Architecture](http://dubbo.apache.org/img/architecture.png) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceRepository.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceRepository.java index e40ea98a76..ba47230575 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceRepository.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceRepository.java @@ -85,6 +85,14 @@ public class ServiceRepository extends LifecycleAdapter implements FrameworkExt return serviceDescriptor; } + public void unregisterService(Class interfaceClazz) { + unregisterService(interfaceClazz.getName()); + } + + public void unregisterService(String path) { + services.remove(path); + } + public void registerConsumer(String serviceKey, ServiceDescriptor serviceDescriptor, ReferenceConfigBase rc, diff --git a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryProtocolTest.java b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryProtocolTest.java index dccfffb475..7167d9c35e 100644 --- a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryProtocolTest.java +++ b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryProtocolTest.java @@ -21,6 +21,7 @@ import org.apache.dubbo.common.config.ConfigurationUtils; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.registry.NotifyListener; import org.apache.dubbo.registry.RegistryFactory; +import org.apache.dubbo.registry.RegistryService; import org.apache.dubbo.registry.integration.RegistryProtocol; import org.apache.dubbo.registry.support.AbstractRegistry; import org.apache.dubbo.remoting.exchange.ExchangeClient; @@ -72,6 +73,7 @@ public class RegistryProtocolTest { @BeforeEach public void setUp() { ApplicationModel.setApplication("RegistryProtocolTest"); + ApplicationModel.getServiceRepository().registerService(RegistryService.class); } @Test diff --git a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryStatusCheckerTest.java b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryStatusCheckerTest.java index a66a007fd2..3f7d5c68c7 100644 --- a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryStatusCheckerTest.java +++ b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryStatusCheckerTest.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.status.Status; import org.apache.dubbo.registry.RegistryFactory; +import org.apache.dubbo.registry.RegistryService; import org.apache.dubbo.registry.status.RegistryStatusChecker; import org.apache.dubbo.registry.support.AbstractRegistryFactory; import org.apache.dubbo.rpc.model.ApplicationModel; @@ -47,6 +48,7 @@ public class RegistryStatusCheckerTest { @BeforeEach public void setUp() { AbstractRegistryFactory.clearRegistryNotDestroy(); + ApplicationModel.getServiceRepository().registerService(RegistryService.class); } @Test diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java index 6c916d492f..7a60e0ead8 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java @@ -30,6 +30,7 @@ import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.ProxyFactory; import org.apache.dubbo.rpc.RpcInvocation; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.protocol.AsyncToSyncInvoker; import java.io.IOException; @@ -123,6 +124,7 @@ class CallbackServiceCodec { // one channel can have multiple callback instances, no need to re-export for different instance. if (!channel.hasAttribute(cacheKey)) { if (!isInstancesOverLimit(channel, url, clazz.getName(), instid, false)) { + ApplicationModel.getServiceRepository().registerService(clazz); Invoker invoker = PROXY_FACTORY.getInvoker(inst, clazz, exportUrl); // should destroy resource? Exporter exporter = PROTOCOL.export(invoker); @@ -160,6 +162,7 @@ class CallbackServiceCodec { URL referurl = URL.valueOf("callback://" + url.getAddress() + "/" + clazz.getName() + "?" + INTERFACE_KEY + "=" + clazz.getName()); referurl = referurl.addParametersIfAbsent(url.getParameters()).removeParameter(METHODS_KEY); if (!isInstancesOverLimit(channel, referurl, clazz.getName(), instid, true)) { + ApplicationModel.getServiceRepository().registerService(clazz); @SuppressWarnings("rawtypes") Invoker invoker = new ChannelWrappedInvoker(clazz, channel, referurl, String.valueOf(instid)); proxy = PROXY_FACTORY.getProxy(new AsyncToSyncInvoker<>(invoker)); @@ -172,9 +175,9 @@ class CallbackServiceCodec { Set> callbackInvokers = (Set>) channel.getAttribute(CHANNEL_CALLBACK_KEY); if (callbackInvokers == null) { callbackInvokers = new ConcurrentHashSet<>(1); - callbackInvokers.add(invoker); channel.setAttribute(CHANNEL_CALLBACK_KEY, callbackInvokers); } + callbackInvokers.add(invoker); logger.info("method " + inv.getMethodName() + " include a callback service :" + invoker.getUrl() + ", a proxy :" + invoker + " has been created."); } } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java index b8dff2e607..c5f6a0a2f0 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java @@ -34,6 +34,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.MethodDescriptor; import org.apache.dubbo.rpc.model.ServiceDescriptor; import org.apache.dubbo.rpc.model.ServiceRepository; +import org.apache.dubbo.rpc.support.RpcUtils; import java.io.IOException; import java.io.InputStream; @@ -129,6 +130,9 @@ public class DecodeableRpcInvocation extends RpcInvocation implements Codec, Dec } } if (pts == DubboCodec.EMPTY_CLASS_ARRAY) { + if (!RpcUtils.isGenericCall(path, getMethodName()) && !RpcUtils.isEcho(path, getMethodName())) { + throw new IllegalArgumentException("Service not found:" + path + ", " + getMethodName()); + } pts = ReflectUtils.desc2classArray(desc); } // } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java index 9f1de51094..a51244a684 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java @@ -21,6 +21,7 @@ import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.RpcException; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.protocol.dubbo.support.ProtocolUtils; import org.junit.jupiter.api.AfterEach; @@ -57,11 +58,14 @@ public class ArgumentCallbackTest { // export one service first, to test connection sharing serviceURL = serviceURL.addParameter("connections", 1); URL hellourl = serviceURL.setPath(IHelloService.class.getName()); + ApplicationModel.getServiceRepository().registerService(IDemoService.class); + ApplicationModel.getServiceRepository().registerService(IHelloService.class); hello_exporter = ProtocolUtils.export(new HelloServiceImpl(), IHelloService.class, hellourl); exporter = ProtocolUtils.export(new DemoServiceImpl(), IDemoService.class, serviceURL); } void referService() { + ApplicationModel.getServiceRepository().registerService(IDemoService.class); demoProxy = (IDemoService) ProtocolUtils.refer(IDemoService.class, consumerUrl); } @@ -91,6 +95,7 @@ public class ArgumentCallbackTest { } public void destroyService() { + ApplicationModel.getServiceRepository().destroy(); demoProxy = null; try { if (exporter != null) exporter.unexport(); diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java index 38583ff881..e55f7ac31d 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java @@ -24,6 +24,7 @@ import org.apache.dubbo.remoting.Constants; import org.apache.dubbo.rpc.Protocol; import org.apache.dubbo.rpc.ProxyFactory; import org.apache.dubbo.rpc.RpcException; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoService; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoServiceImpl; import org.apache.dubbo.rpc.protocol.dubbo.support.NonSerialized; @@ -35,6 +36,7 @@ import org.apache.dubbo.rpc.service.EchoService; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.util.HashMap; @@ -54,6 +56,12 @@ public class DubboProtocolTest { @AfterAll public static void after() { ProtocolUtils.closeAll(); + ApplicationModel.getServiceRepository().unregisterService(DemoService.class); + } + + @BeforeAll + public static void setup() { + ApplicationModel.getServiceRepository().registerService(DemoService.class); } @Test @@ -148,6 +156,9 @@ public class DubboProtocolTest { // 3000L))); RemoteService remote = new RemoteServiceImpl(); + + ApplicationModel.getServiceRepository().registerService(RemoteService.class); + int port = NetUtils.getAvailablePort(); protocol.export(proxy.getInvoker(remote, RemoteService.class, URL.valueOf("dubbo://127.0.0.1:" + port + "/" + RemoteService.class.getName()))); remote = proxy.getProxy(protocol.refer(RemoteService.class, URL.valueOf("dubbo://127.0.0.1:" + port + "/" + RemoteService.class.getName()).addParameter("timeout", diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/MultiThreadTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/MultiThreadTest.java index e7832215bf..9b34edbe60 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/MultiThreadTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/MultiThreadTest.java @@ -22,9 +22,11 @@ import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Protocol; import org.apache.dubbo.rpc.ProxyFactory; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoService; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoServiceImpl; import org.apache.dubbo.rpc.protocol.dubbo.support.ProtocolUtils; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -42,10 +44,12 @@ public class MultiThreadTest { @AfterEach public void after() { ProtocolUtils.closeAll(); + ApplicationModel.getServiceRepository().destroy(); } @Test public void testDubboMultiThreadInvoke() throws Exception { + ApplicationModel.getServiceRepository().registerService("TestService", DemoService.class); int port = NetUtils.getAvailablePort(); Exporter rpcExporter = protocol.export(proxy.getInvoker(new DemoServiceImpl(), DemoService.class, URL.valueOf("dubbo://127.0.0.1:" + port + "/TestService"))); diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java index c68f5be9b9..3c66d7558a 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/decode/DubboTelnetDecodeTest.java @@ -31,6 +31,7 @@ import org.apache.dubbo.remoting.transport.netty4.NettyBackedChannelBuffer; import org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter; import org.apache.dubbo.rpc.AppResponse; import org.apache.dubbo.rpc.RpcInvocation; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation; import org.apache.dubbo.rpc.protocol.dubbo.DubboCodec; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoService; @@ -38,7 +39,9 @@ import org.apache.dubbo.rpc.protocol.dubbo.support.DemoService; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.embedded.EmbeddedChannel; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -62,6 +65,17 @@ public class DubboTelnetDecodeTest { private static AtomicInteger telnetTelnet = new AtomicInteger(0); + @BeforeAll + public static void setup() { + ApplicationModel.getServiceRepository().destroy(); + ApplicationModel.getServiceRepository().registerService(DemoService.class); + } + + @AfterAll + public static void teardown() { + ApplicationModel.getServiceRepository().destroy(); + } + /** * just dubbo request * diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/support/EnumBak.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/support/EnumBak.java index f615aa076e..0b74b1033c 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/support/EnumBak.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/support/EnumBak.java @@ -23,6 +23,7 @@ import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Protocol; import org.apache.dubbo.rpc.ProxyFactory; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.service.GenericService; import org.junit.jupiter.api.Assertions; @@ -45,6 +46,9 @@ public class EnumBak { + "&timeout=" + Integer.MAX_VALUE ); DemoService demo = new DemoServiceImpl(); + + ApplicationModel.getServiceRepository().registerService("test", DemoService.class); + Invoker invoker = proxy.getInvoker(demo, DemoService.class, serviceurl); protocol.export(invoker); @@ -88,6 +92,9 @@ public class EnumBak { URL serviceurl = URL.valueOf("dubbo://127.0.0.1:" + port + "/test?timeout=" + Integer.MAX_VALUE ); DemoService demo = new DemoServiceImpl(); + + ApplicationModel.getServiceRepository().registerService("test", DemoService.class); + Invoker invoker = proxy.getInvoker(demo, DemoService.class, serviceurl); protocol.export(invoker); @@ -109,6 +116,9 @@ public class EnumBak { int port = NetUtils.getAvailablePort(); URL consumerurl = URL.valueOf("dubbo://127.0.0.1:" + port + "/test?timeout=" + Integer.MAX_VALUE ); + + ApplicationModel.getServiceRepository().registerService(DemoService.class); + Invoker reference = protocol.refer(DemoService.class, consumerurl); DemoService demoProxy = (DemoService) proxy.getProxy(reference); Type type = demoProxy.enumlength(Type.High);