Skip to content

Commit

Permalink
Decoupling ConfigBase and ServiceModel (apache#10110)
Browse files Browse the repository at this point in the history
CrazyHZM authored Jul 15, 2022
1 parent 3101a5d commit 807fc12
Showing 29 changed files with 241 additions and 176 deletions.
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@
package org.apache.dubbo.rpc.model;

import org.apache.dubbo.common.utils.Assert;
import org.apache.dubbo.config.ReferenceConfigBase;

import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -49,38 +48,38 @@ public class ConsumerModel extends ServiceModel {
*/
public ConsumerModel(String serviceKey,
Object proxyObject,
ServiceDescriptor serviceModel,
ReferenceConfigBase<?> referenceConfig,
Map<String, AsyncMethodInfo> methodConfigs) {
ServiceDescriptor serviceDescriptor,
Map<String, AsyncMethodInfo> methodConfigs,
ClassLoader interfaceClassLoader) {

super(proxyObject, serviceKey, serviceModel, referenceConfig);
super(proxyObject, serviceKey, serviceDescriptor, null, interfaceClassLoader);
Assert.notEmptyString(serviceKey, "Service name can't be null or blank");

this.methodConfigs = methodConfigs == null ? new HashMap<>() : methodConfigs;
}

public ConsumerModel(String serviceKey,
Object proxyObject,
ServiceDescriptor serviceModel,
ReferenceConfigBase<?> referenceConfig,
ServiceDescriptor serviceDescriptor,
ServiceMetadata metadata,
Map<String, AsyncMethodInfo> methodConfigs) {
Map<String, AsyncMethodInfo> methodConfigs,
ClassLoader interfaceClassLoader) {

super(proxyObject, serviceKey, serviceModel, referenceConfig, metadata);
super(proxyObject, serviceKey, serviceDescriptor, null, metadata, interfaceClassLoader);
Assert.notEmptyString(serviceKey, "Service name can't be null or blank");

this.methodConfigs = methodConfigs == null ? new HashMap<>() : methodConfigs;
}

public ConsumerModel(String serviceKey,
Object proxyObject,
ServiceDescriptor serviceModel,
ReferenceConfigBase<?> referenceConfig,
ServiceDescriptor serviceDescriptor,
ModuleModel moduleModel,
ServiceMetadata metadata,
Map<String, AsyncMethodInfo> methodConfigs) {
Map<String, AsyncMethodInfo> methodConfigs,
ClassLoader interfaceClassLoader) {
super(proxyObject, serviceKey, serviceDescriptor, moduleModel, metadata, interfaceClassLoader);

super(proxyObject, serviceKey, serviceModel, referenceConfig, moduleModel, metadata);
Assert.notEmptyString(serviceKey, "Service name can't be null or blank");

this.methodConfigs = methodConfigs == null ? new HashMap<>() : methodConfigs;
@@ -101,7 +100,7 @@ public AsyncMethodInfo getAsyncInfo(String methodName) {
public void initMethodModels() {
Class<?>[] interfaceList;
if (getProxyObject() == null) {
Class<?> serviceInterfaceClass = getReferenceConfig().getServiceInterfaceClass();
Class<?> serviceInterfaceClass = getServiceInterfaceClass();
if (serviceInterfaceClass != null) {
interfaceList = new Class[]{serviceInterfaceClass};
} else {
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.Assert;
import org.apache.dubbo.common.utils.ClassUtils;
import org.apache.dubbo.config.context.ModuleConfigManager;

import java.util.HashMap;
@@ -183,13 +184,13 @@ public ConsumerModel registerInternalConsumer(Class<?> internalService, URL url)
serviceMetadata.setDefaultGroup(url.getGroup());
serviceMetadata.setServiceInterfaceName(internalService.getName());
serviceMetadata.setServiceType(internalService);
String servyceKey = URL.buildKey(internalService.getName(), url.getGroup(), url.getVersion());
serviceMetadata.setServiceKey(servyceKey);
String serviceKey = URL.buildKey(internalService.getName(), url.getGroup(), url.getVersion());
serviceMetadata.setServiceKey(serviceKey);

ConsumerModel consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), "jdk", serviceRepository.lookupService(serviceMetadata.getServiceInterfaceName()), null,
this, serviceMetadata, new HashMap<>());
ConsumerModel consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), "jdk", serviceRepository.lookupService(serviceMetadata.getServiceInterfaceName()),
this, serviceMetadata, new HashMap<>(0), ClassUtils.getClassLoader(internalService));

logger.info("Dynamically registering consumer model " + servyceKey + " into model " + this.getDesc());
logger.info("Dynamically registering consumer model " + serviceKey + " into model " + this.getDesc());
serviceRepository.registerConsumer(consumerModel);
return consumerModel;
}
Original file line number Diff line number Diff line change
@@ -71,8 +71,12 @@ public void registerConsumer(String serviceKey,
ReferenceConfigBase<?> rc,
Object proxy,
ServiceMetadata serviceMetadata) {
ConsumerModel consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), proxy, serviceDescriptor, rc,
serviceMetadata, null);
ClassLoader classLoader = null;
if (rc != null) {
classLoader = rc.getInterfaceClassLoader();
}
ConsumerModel consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), proxy, serviceDescriptor,
serviceMetadata, null, classLoader);
this.registerConsumer(consumerModel);
}

@@ -89,8 +93,14 @@ public void registerProvider(String serviceKey,
ServiceDescriptor serviceModel,
ServiceConfigBase<?> serviceConfig,
ServiceMetadata serviceMetadata) {
ClassLoader classLoader = null;
Class<?> cla = null;
if (serviceConfig != null) {
classLoader = serviceConfig.getInterfaceClassLoader();
cla = serviceConfig.getInterfaceClass();
}
ProviderModel providerModel = new ProviderModel(serviceKey, serviceInstance, serviceModel,
serviceConfig, serviceMetadata);
serviceMetadata, classLoader);
this.registerProvider(providerModel);
}

@@ -100,14 +110,15 @@ public void registerProvider(ProviderModel providerModel) {
}

public ServiceDescriptor registerService(ServiceDescriptor serviceDescriptor) {
return registerService(serviceDescriptor.getServiceInterfaceClass(),serviceDescriptor);
return registerService(serviceDescriptor.getServiceInterfaceClass(), serviceDescriptor);
}

public ServiceDescriptor registerService(Class<?> interfaceClazz) {
ServiceDescriptor serviceDescriptor = new ReflectionServiceDescriptor(interfaceClazz);
return registerService(interfaceClazz,serviceDescriptor);
return registerService(interfaceClazz, serviceDescriptor);
}
public ServiceDescriptor registerService(Class<?> interfaceClazz,ServiceDescriptor serviceDescriptor) {

public ServiceDescriptor registerService(Class<?> interfaceClazz, ServiceDescriptor serviceDescriptor) {
List<ServiceDescriptor> serviceDescriptors = services.computeIfAbsent(interfaceClazz.getName(),
k -> new CopyOnWriteArrayList<>());
synchronized (serviceDescriptors) {
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@
package org.apache.dubbo.rpc.model;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.config.ServiceConfigBase;

import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -36,11 +35,16 @@ public class ProviderModel extends ServiceModel {
private final List<RegisterStatedURL> urls;
private final Map<String, List<ProviderMethodModel>> methods = new HashMap<>();

/**
* The url of the reference service
*/
private List<URL> serviceUrls = new ArrayList<URL>();

public ProviderModel(String serviceKey,
Object serviceInstance,
ServiceDescriptor serviceModel,
ServiceConfigBase<?> serviceConfig) {
super(serviceInstance, serviceKey, serviceModel, serviceConfig);
ServiceDescriptor serviceDescriptor,
ClassLoader interfaceClassLoader) {
super(serviceInstance, serviceKey, serviceDescriptor, null, interfaceClassLoader);
if (null == serviceInstance) {
throw new IllegalArgumentException("Service[" + serviceKey + "]Target is NULL.");
}
@@ -50,25 +54,25 @@ public ProviderModel(String serviceKey,

public ProviderModel(String serviceKey,
Object serviceInstance,
ServiceDescriptor serviceModel,
ServiceConfigBase<?> serviceConfig,
ServiceMetadata serviceMetadata) {
super(serviceInstance, serviceKey, serviceModel, serviceConfig, serviceMetadata);
ServiceDescriptor serviceDescriptor,
ServiceMetadata serviceMetadata,
ClassLoader interfaceClassLoader) {
super(serviceInstance, serviceKey, serviceDescriptor, null, serviceMetadata, interfaceClassLoader);
if (null == serviceInstance) {
throw new IllegalArgumentException("Service[" + serviceKey + "]Target is NULL.");
}

initMethod(serviceModel.getServiceInterfaceClass());
initMethod(serviceDescriptor.getServiceInterfaceClass());
this.urls = new ArrayList<>(1);
}

public ProviderModel(String serviceKey,
Object serviceInstance,
ServiceDescriptor serviceModel,
ServiceConfigBase<?> serviceConfig,
ModuleModel moduleModel,
ServiceMetadata serviceMetadata) {
super(serviceInstance, serviceKey, serviceModel, serviceConfig, moduleModel, serviceMetadata);
ServiceMetadata serviceMetadata,
ClassLoader interfaceClassLoader) {
super(serviceInstance, serviceKey, serviceModel, moduleModel, serviceMetadata, interfaceClassLoader);
if (null == serviceInstance) {
throw new IllegalArgumentException("Service[" + serviceKey + "]Target is NULL.");
}
@@ -163,6 +167,15 @@ private void initMethod(Class<?> serviceInterfaceClass) {
}
}

public List<URL> getServiceUrls() {
return serviceUrls;
}

public void setServiceUrls(List<URL> urls) {
this.serviceUrls = urls;
}


@Override
public boolean equals(Object o) {
if (this == o) {
Original file line number Diff line number Diff line change
@@ -30,38 +30,81 @@ public class ServiceModel {
private Object proxyObject;
private Callable<Void> destroyCaller;
private ClassLoader classLoader;

private final ClassLoader interfaceClassLoader;

private final ModuleModel moduleModel;
private final ServiceDescriptor serviceModel;
private final AbstractInterfaceConfig config;

private ServiceMetadata serviceMetadata;
private AbstractInterfaceConfig config;

public ServiceModel(Object proxyObject, String serviceKey, ServiceDescriptor serviceModel, AbstractInterfaceConfig config) {
this(proxyObject, serviceKey, serviceModel, config, null);
}
private final ServiceMetadata serviceMetadata;

public ServiceModel(Object proxyObject, String serviceKey, ServiceDescriptor serviceModel, AbstractInterfaceConfig config, ServiceMetadata serviceMetadata) {
this(proxyObject, serviceKey, serviceModel, config, ScopeModelUtil.getModuleModel(config != null ? config.getScopeModel() : null), serviceMetadata);
public ServiceModel(Object proxyObject, String serviceKey, ServiceDescriptor serviceModel, ModuleModel moduleModel, ClassLoader interfaceClassLoader) {
this(proxyObject, serviceKey, serviceModel, moduleModel, null, interfaceClassLoader);
}

public ServiceModel(Object proxyObject, String serviceKey, ServiceDescriptor serviceModel, AbstractInterfaceConfig config, ModuleModel moduleModel, ServiceMetadata serviceMetadata) {
public ServiceModel(Object proxyObject, String serviceKey, ServiceDescriptor serviceModel, ModuleModel moduleModel, ServiceMetadata serviceMetadata,
ClassLoader interfaceClassLoader) {
this.proxyObject = proxyObject;
this.serviceKey = serviceKey;
this.serviceModel = serviceModel;
this.moduleModel = moduleModel;
this.config = config;
this.moduleModel = ScopeModelUtil.getModuleModel(moduleModel);
this.serviceMetadata = serviceMetadata;
this.interfaceClassLoader = interfaceClassLoader;
if (serviceMetadata != null) {
serviceMetadata.setServiceModel(this);
}
if (config != null) {
this.classLoader = config.getInterfaceClassLoader();
if (interfaceClassLoader != null) {
this.classLoader = interfaceClassLoader;
}
if (this.classLoader == null) {
this.classLoader = Thread.currentThread().getContextClassLoader();
}
}

@Deprecated
public AbstractInterfaceConfig getConfig() {
return config;
}

@Deprecated
public void setConfig(AbstractInterfaceConfig config) {
this.config = config;
}

/**
* ServiceModel should be decoupled from AbstractInterfaceConfig and removed in a future version
* @return
*/
@Deprecated
public ReferenceConfigBase<?> getReferenceConfig() {
if (config == null) {
return null;
}
if (config instanceof ReferenceConfigBase) {
return (ReferenceConfigBase<?>) config;
} else {
throw new IllegalArgumentException("Current ServiceModel is not a ConsumerModel");
}
}

/**
* ServiceModel should be decoupled from AbstractInterfaceConfig and removed in a future version
* @return
*/
@Deprecated
public ServiceConfigBase<?> getServiceConfig() {
if (config == null) {
return null;
}
if (config instanceof ServiceConfigBase) {
return (ServiceConfigBase<?>) config;
} else {
throw new IllegalArgumentException("Current ServiceModel is not a ProviderModel");
}
}

public String getServiceKey() {
return serviceKey;
}
@@ -99,32 +142,6 @@ public Class<?> getServiceInterfaceClass() {
return serviceModel.getServiceInterfaceClass();
}

public AbstractInterfaceConfig getConfig() {
return config;
}

public ReferenceConfigBase<?> getReferenceConfig() {
if (config == null) {
return null;
}
if (config instanceof ReferenceConfigBase) {
return (ReferenceConfigBase<?>) config;
} else {
throw new IllegalArgumentException("Current ServiceModel is not a ConsumerModel");
}
}

public ServiceConfigBase<?> getServiceConfig() {
if (config == null) {
return null;
}
if (config instanceof ServiceConfigBase) {
return (ServiceConfigBase<?>) config;
} else {
throw new IllegalArgumentException("Current ServiceModel is not a ProviderModel");
}
}

public void setServiceKey(String serviceKey) {
this.serviceKey = serviceKey;
if (serviceMetadata != null) {
@@ -156,6 +173,10 @@ public void setDestroyCaller(Callable<Void> destroyCaller) {
this.destroyCaller = destroyCaller;
}

public ClassLoader getInterfaceClassLoader() {
return interfaceClassLoader;
}

@Override
public boolean equals(Object o) {
if (this == o) {
@@ -165,11 +186,11 @@ public boolean equals(Object o) {
return false;
}
ServiceModel that = (ServiceModel) o;
return Objects.equals(serviceKey, that.serviceKey) && Objects.equals(proxyObject, that.proxyObject) && Objects.equals(moduleModel, that.moduleModel) && Objects.equals(serviceModel, that.serviceModel) && Objects.equals(config, that.config) && Objects.equals(serviceMetadata, that.serviceMetadata);
return Objects.equals(serviceKey, that.serviceKey) && Objects.equals(proxyObject, that.proxyObject) && Objects.equals(destroyCaller, that.destroyCaller) && Objects.equals(classLoader, that.classLoader) && Objects.equals(interfaceClassLoader, that.interfaceClassLoader) && Objects.equals(moduleModel, that.moduleModel) && Objects.equals(serviceModel, that.serviceModel) && Objects.equals(serviceMetadata, that.serviceMetadata);
}

@Override
public int hashCode() {
return Objects.hash(serviceKey, proxyObject, moduleModel, serviceModel, config, serviceMetadata);
return Objects.hash(serviceKey, proxyObject, destroyCaller, classLoader, interfaceClassLoader, moduleModel, serviceModel, serviceMetadata);
}
}
Loading
Oops, something went wrong.

0 comments on commit 807fc12

Please sign in to comment.