diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java index bc97fefddb..1cc2cd1fe1 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java @@ -539,4 +539,8 @@ public interface CommonConstants { String METADATA = "metadata"; String IGNORE_LISTEN_SHUTDOWN_HOOK = "dubbo.shutdownHook.listenIgnore"; + + + String OPTIMIZER_KEY = "optimizer"; + } diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java index 388aa60d54..5278c35c6e 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProtocol.java @@ -20,7 +20,10 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.config.ConfigurationUtils; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.serialize.support.SerializableClassRegistry; +import org.apache.dubbo.common.serialize.support.SerializationOptimizer; import org.apache.dubbo.common.utils.ConcurrentHashSet; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.Constants; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Invoker; @@ -41,6 +44,7 @@ import java.util.concurrent.ConcurrentHashMap; import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT; import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.OPTIMIZER_KEY; /** * abstract ProtocolSupport. @@ -61,6 +65,9 @@ public abstract class AbstractProtocol implements Protocol, ScopeModelAware { protected FrameworkModel frameworkModel; + private final Set optimizers = new ConcurrentHashSet<>(); + + @Override public void setFrameworkModel(FrameworkModel frameworkModel) { this.frameworkModel = frameworkModel; @@ -136,4 +143,40 @@ public abstract class AbstractProtocol implements Protocol, ScopeModelAware { public Collection> getExporters() { return Collections.unmodifiableCollection(exporterMap.values()); } + + + protected void optimizeSerialization(URL url) throws RpcException { + String className = url.getParameter(OPTIMIZER_KEY, ""); + if (StringUtils.isEmpty(className) || optimizers.contains(className)) { + return; + } + + logger.info("Optimizing the serialization process for Kryo, FST, etc..."); + + try { + Class clazz = Thread.currentThread().getContextClassLoader().loadClass(className); + if (!SerializationOptimizer.class.isAssignableFrom(clazz)) { + throw new RpcException("The serialization optimizer " + className + " isn't an instance of " + SerializationOptimizer.class.getName()); + } + + SerializationOptimizer optimizer = (SerializationOptimizer) clazz.newInstance(); + + if (optimizer.getSerializableClasses() == null) { + return; + } + + for (Class c : optimizer.getSerializableClasses()) { + SerializableClassRegistry.registerClass(c); + } + + optimizers.add(className); + + } catch (ClassNotFoundException e) { + throw new RpcException("Cannot find the serialization optimizer class: " + className, e); + + } catch (InstantiationException | IllegalAccessException e) { + throw new RpcException("Cannot instantiate the serialization optimizer class: " + className, e); + + } + } } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/Constants.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/Constants.java index f16dd5c2c8..fa0eca0281 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/Constants.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/Constants.java @@ -55,7 +55,6 @@ public interface Constants { boolean DEFAULT_LAZY_REQUEST_WITH_WARNING = false; - String OPTIMIZER_KEY = "optimizer"; String ON_CONNECT_KEY = "onconnect"; diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java index c34e0ba5d7..5e01fc42f0 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java @@ -20,11 +20,8 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URLBuilder; import org.apache.dubbo.common.config.ConfigurationUtils; import org.apache.dubbo.common.extension.ExtensionLoader; -import org.apache.dubbo.common.serialize.support.SerializableClassRegistry; -import org.apache.dubbo.common.serialize.support.SerializationOptimizer; import org.apache.dubbo.common.url.component.ServiceConfigURL; import org.apache.dubbo.common.utils.CollectionUtils; -import org.apache.dubbo.common.utils.ConcurrentHashSet; import org.apache.dubbo.common.utils.NetUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.Channel; @@ -84,7 +81,6 @@ import static org.apache.dubbo.rpc.protocol.dubbo.Constants.DEFAULT_SHARE_CONNEC import static org.apache.dubbo.rpc.protocol.dubbo.Constants.IS_CALLBACK_SERVICE; import static org.apache.dubbo.rpc.protocol.dubbo.Constants.ON_CONNECT_KEY; import static org.apache.dubbo.rpc.protocol.dubbo.Constants.ON_DISCONNECT_KEY; -import static org.apache.dubbo.rpc.protocol.dubbo.Constants.OPTIMIZER_KEY; import static org.apache.dubbo.rpc.protocol.dubbo.Constants.SHARE_CONNECTIONS_KEY; @@ -104,7 +100,6 @@ public class DubboProtocol extends AbstractProtocol { */ private final Map referenceClientMap = new ConcurrentHashMap<>(); private static final Object PENDING_OBJECT = new Object(); - private final Set optimizers = new ConcurrentHashSet<>(); private AtomicBoolean destroyed = new AtomicBoolean(); @@ -399,40 +394,6 @@ public class DubboProtocol extends AbstractProtocol { return protocolServer; } - private void optimizeSerialization(URL url) throws RpcException { - String className = url.getParameter(OPTIMIZER_KEY, ""); - if (StringUtils.isEmpty(className) || optimizers.contains(className)) { - return; - } - - logger.info("Optimizing the serialization process for Kryo, FST, etc..."); - - try { - Class clazz = Thread.currentThread().getContextClassLoader().loadClass(className); - if (!SerializationOptimizer.class.isAssignableFrom(clazz)) { - throw new RpcException("The serialization optimizer " + className + " isn't an instance of " + SerializationOptimizer.class.getName()); - } - - SerializationOptimizer optimizer = (SerializationOptimizer) clazz.newInstance(); - - if (optimizer.getSerializableClasses() == null) { - return; - } - - for (Class c : optimizer.getSerializableClasses()) { - SerializableClassRegistry.registerClass(c); - } - - optimizers.add(className); - - } catch (ClassNotFoundException e) { - throw new RpcException("Cannot find the serialization optimizer class: " + className, e); - - } catch (InstantiationException | IllegalAccessException e) { - throw new RpcException("Cannot instantiate the serialization optimizer class: " + className, e); - - } - } @Override public Invoker refer(Class type, URL url) throws RpcException { diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java index 91605e6bc6..65061d65ec 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleProtocol.java @@ -66,7 +66,6 @@ public class TripleProtocol extends AbstractProtocol { private final PathResolver pathResolver; private final TriBuiltinService triBuiltinService; private final ConnectionManager connectionManager; - private final FrameworkModel frameworkModel; private final String acceptEncodings; private boolean versionChecked = false; @@ -124,12 +123,14 @@ public class TripleProtocol extends AbstractProtocol { url.getOrDefaultApplicationModel().getExtensionLoader(ExecutorRepository.class) .getDefaultExtension() .createExecutorIfAbsent(url); - PortUnificationExchanger.bind(invoker.getUrl()); + PortUnificationExchanger.bind(url); + optimizeSerialization(url); return exporter; } @Override public Invoker refer(Class type, URL url) throws RpcException { + optimizeSerialization(url); ExecutorService streamExecutor = getOrCreateStreamExecutor( url.getOrDefaultApplicationModel()); TripleInvoker invoker = new TripleInvoker<>(type, url, acceptEncodings,