diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java index db5686e6a7d3..a3bb8533225b 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java @@ -40,6 +40,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ConsumerMethodModel; import org.apache.dubbo.rpc.model.ConsumerModel; +import org.apache.dubbo.rpc.model.ServiceMetadata; import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol; import org.apache.dubbo.rpc.service.GenericService; import org.apache.dubbo.rpc.support.ProtocolUtils; @@ -153,6 +154,8 @@ public class ReferenceConfig extends AbstractReferenceConfig { */ private transient volatile boolean destroyed; + private ServiceMetadata serviceMetadata; + @SuppressWarnings("unused") private final Object finalizerGuardian = new Object() { @Override @@ -174,9 +177,13 @@ protected void finalize() throws Throwable { }; public ReferenceConfig() { + serviceMetadata = new ServiceMetadata(); + serviceMetadata.addAttribute("ORIGIN_CONFIG", this); } public ReferenceConfig(Reference reference) { + serviceMetadata = new ServiceMetadata(); + serviceMetadata.addAttribute("ORIGIN_CONFIG", this); appendAnnotation(Reference.class, reference); setMethods(MethodConfig.constructMethodConfig(reference.methods())); } @@ -265,7 +272,18 @@ private void init() { checkStubAndLocal(interfaceClass); checkMock(interfaceClass); + + //init serivceMetadata + serviceMetadata.setVersion(version); + serviceMetadata.setGroup(group); + serviceMetadata.setDefaultGroup(group); + serviceMetadata.setServiceType(interfaceClass); + serviceMetadata.setServiceInterfaceName(interfaceName); + + + ConsumerModel consumerModel = new ConsumerModel(interfaceName, group, version, getActualInterface()); + ApplicationModel.initConsumerModel(URL.buildKey(interfaceName, group, version), consumerModel); Map map = new HashMap(); @@ -316,8 +334,11 @@ private void init() { } map.put(Constants.REGISTER_IP_KEY, hostToRegistry); + serviceMetadata.getAttachments().putAll(map); + ref = createProxy(map); + serviceMetadata.setTarget(ref); consumerModel.getServiceMetadata().addAttribute(Constants.PROXY_CLASS_REF, ref); } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 3513c6d8cf32..58c4b1746b9e 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -40,6 +40,7 @@ import org.apache.dubbo.rpc.cluster.ConfiguratorFactory; import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ProviderModel; +import org.apache.dubbo.rpc.model.ServiceMetadata; import org.apache.dubbo.rpc.service.GenericService; import org.apache.dubbo.rpc.support.ProtocolUtils; @@ -165,10 +166,16 @@ public class ServiceConfig extends AbstractServiceConfig { */ private volatile String generic; + private ServiceMetadata serviceMetadata; + public ServiceConfig() { + serviceMetadata = new ServiceMetadata(); + serviceMetadata.addAttribute("ORIGIN_CONFIG", this); } public ServiceConfig(Service service) { + serviceMetadata = new ServiceMetadata(); + serviceMetadata.addAttribute("ORIGIN_CONFIG", this); appendAnnotation(Service.class, service); setMethods(MethodConfig.constructMethodConfig(service.methods())); } @@ -334,6 +341,17 @@ private void appendParameters() { public synchronized void export() { checkAndUpdateSubConfigs(); + //init serviceMetadata + serviceMetadata.setVersion(version); + serviceMetadata.setGroup(group); + serviceMetadata.setDefaultGroup(group); + serviceMetadata.setServiceType(interfaceClass); + serviceMetadata.setServiceInterfaceName(interfaceName); + serviceMetadata.setTarget(ref); + + ProviderModel providerModel = new ProviderModel(ref, serviceMetadata); + ApplicationModel.initProviderModel(URL.buildKey(interfaceName, group, version), providerModel); + if (!shouldExport()) { return; } @@ -379,8 +397,7 @@ protected synchronized void doExport() { if (StringUtils.isEmpty(path)) { path = interfaceName; } - ProviderModel providerModel = new ProviderModel(interfaceName, group, version, ref, interfaceClass); - ApplicationModel.initProviderModel(URL.buildKey(interfaceName, group, version), providerModel); + doExportUrls(); } @@ -518,6 +535,9 @@ private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List r map.put(Constants.TOKEN_KEY, token); } } + //init serviceMetadata attachments + serviceMetadata.getAttachments().putAll(map); + // export service String host = this.findConfigedHosts(protocolConfig, registryURLs, map); Integer port = this.findConfigedPorts(protocolConfig, name, map); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java index 42d23a50b724..e66e7b2bdd50 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java @@ -39,6 +39,14 @@ public ConsumerModel(String serviceName, String group, String version, Class } } + public ConsumerModel(ServiceMetadata serviceMetadata) { + this.serviceMetadata = serviceMetadata; + Method[] methods = serviceMetadata.getServiceType().getMethods(); + for (Method method : methods) { + methodModels.put(method, new ConsumerMethodModel(method)); + } + } + /** * @return serviceMetadata */ diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java index 385bbd1f6ceb..63f04bf36101 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java @@ -19,6 +19,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,6 +30,7 @@ public class ProviderModel { private final Object serviceInstance; private final ServiceMetadata serviceMetadata; + private final String serivceKey; private final Map> methods = new HashMap>(); public ProviderModel(String serviceName, String group, String version, Object serviceInstance, Class serviceInterfaceClass) { @@ -38,9 +40,16 @@ public ProviderModel(String serviceName, String group, String version, Object se this.serviceInstance = serviceInstance; this.serviceMetadata = new ServiceMetadata(serviceName, group, version, serviceInterfaceClass); + this.serivceKey = serviceMetadata.getServiceKey(); initMethod(serviceInterfaceClass); } + public ProviderModel(Object serviceInstance, ServiceMetadata serviceMetadata) { + this.serviceInstance = serviceInstance; + this.serviceMetadata = serviceMetadata; + this.serivceKey = serviceMetadata.getServiceKey(); + initMethod(serviceMetadata.getServiceType()); + } public String getServiceName() { return this.serviceMetadata.getServiceKey(); @@ -75,12 +84,13 @@ public ProviderMethodModel getMethodModel(String methodName, String[] argTypes) } public List getMethodModelList(String methodName) { - return methods.get(methodName); + List resultList = methods.get(methodName); + return resultList == null ? Collections.emptyList() : resultList; } private void initMethod(Class serviceInterfaceClass) { - Method[] methodsToExport = null; + Method[] methodsToExport; methodsToExport = serviceInterfaceClass.getMethods(); for (Method method : methodsToExport) { @@ -88,7 +98,7 @@ private void initMethod(Class serviceInterfaceClass) { List methodModels = methods.get(method.getName()); if (methodModels == null) { - methodModels = new ArrayList(1); + methodModels = new ArrayList(); methods.put(method.getName(), methodModels); } methodModels.add(new ProviderMethodModel(method)); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java index 7a9fb167b5ac..5a09f45cce21 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java @@ -25,14 +25,16 @@ */ public class ServiceMetadata { - private final String serviceKey; - private final String serviceInterfaceName; - private final String defaultGroup; - private final String version; - private final Class serviceType; + private String serviceKey; + private String serviceInterfaceName; + private String defaultGroup; + private String version; + private Class serviceType; private volatile String group; + private Object target; + /* will be transferred to remote side */ private final Map attachments = new ConcurrentHashMap(); /* used locally*/ @@ -47,17 +49,20 @@ public ServiceMetadata(String serviceInterfaceName, String group, String version this.serviceType = serviceType; } + public ServiceMetadata() { + } + public String getServiceKey() { - return serviceKey; + return serviceInterfaceName + ":" + version; } public Map getAttachments() { return attachments; } -// public Map getAttributeMap() { -// return attributeMap; -// } + public Map getAttributeMap() { + return attributeMap; + } public Object getAttribute(String key) { return attributeMap.get(key); @@ -94,4 +99,32 @@ public String getGroup() { public void setGroup(String group) { this.group = group; } + + public void setServiceInterfaceName(String serviceInterfaceName) { + this.serviceInterfaceName = serviceInterfaceName; + } + + public void setDefaultGroup(String defaultGroup) { + this.defaultGroup = defaultGroup; + } + + public void setVersion(String version) { + this.version = version; + } + + public void setServiceType(Class serviceType) { + this.serviceType = serviceType; + } + + public void setServiceKey(String serviceKey) { + this.serviceKey = serviceKey; + } + + public Object getTarget() { + return target; + } + + public void setTarget(Object target) { + this.target = target; + } }