This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 162b98f6ba fix #10105, support serialization optimizer (#10147)
162b98f6ba is described below
commit 162b98f6ba8f6216c784c797eb5a4d32a25df23d
Author: earthchen <[email protected]>
AuthorDate: Mon Jun 13 18:12:54 2022 +0800
fix #10105, support serialization optimizer (#10147)
---
.../dubbo/common/constants/CommonConstants.java | 4 ++
.../dubbo/rpc/protocol/AbstractProtocol.java | 43 ++++++++++++++++++++++
.../apache/dubbo/rpc/protocol/dubbo/Constants.java | 1 -
.../dubbo/rpc/protocol/dubbo/DubboProtocol.java | 39 --------------------
.../dubbo/rpc/protocol/tri/TripleProtocol.java | 5 ++-
5 files changed, 50 insertions(+), 42 deletions(-)
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<String> 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<Exporter<?>> 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<String, Object> referenceClientMap = new
ConcurrentHashMap<>();
private static final Object PENDING_OBJECT = new Object();
- private final Set<String> 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 <T> Invoker<T> refer(Class<T> 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 <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
+ optimizeSerialization(url);
ExecutorService streamExecutor = getOrCreateStreamExecutor(
url.getOrDefaultApplicationModel());
TripleInvoker<T> invoker = new TripleInvoker<>(type, url,
acceptEncodings,