|
|
|
@ -18,6 +18,7 @@ package com.alibaba.cloud.dubbo.autoconfigure;
|
|
|
|
|
|
|
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
@ -50,6 +51,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
|
|
import org.springframework.cloud.client.ServiceInstance;
|
|
|
|
|
import org.springframework.cloud.client.serviceregistry.Registration;
|
|
|
|
|
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
|
|
|
|
|
import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
|
|
|
|
|
import org.springframework.cloud.consul.serviceregistry.ConsulRegistration;
|
|
|
|
|
import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean;
|
|
|
|
|
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaAutoServiceRegistration;
|
|
|
|
@ -61,6 +63,7 @@ import org.springframework.context.annotation.Conditional;
|
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
|
import org.springframework.context.annotation.Import;
|
|
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
|
|
|
|
import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME;
|
|
|
|
|
import static com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationAutoConfiguration.EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME;
|
|
|
|
@ -77,12 +80,11 @@ import static org.springframework.util.ObjectUtils.isEmpty;
|
|
|
|
|
@Configuration(proxyBeanMethods = false)
|
|
|
|
|
@Import({ DubboServiceRegistrationEventPublishingAspect.class,
|
|
|
|
|
DubboBootstrapStartCommandLineRunner.class })
|
|
|
|
|
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
|
|
|
|
|
matchIfMissing = true)
|
|
|
|
|
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
|
|
|
|
|
@AutoConfigureAfter(name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME,
|
|
|
|
|
CONSUL_AUTO_SERVICE_AUTO_CONFIGURATION_CLASS_NAME,
|
|
|
|
|
"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration" },
|
|
|
|
|
value = { DubboMetadataAutoConfiguration.class })
|
|
|
|
|
"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration" }, value = {
|
|
|
|
|
DubboMetadataAutoConfiguration.class })
|
|
|
|
|
public class DubboServiceRegistrationAutoConfiguration {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -260,6 +262,9 @@ public class DubboServiceRegistrationAutoConfiguration {
|
|
|
|
|
@AutoConfigureOrder
|
|
|
|
|
class ConsulConfiguration {
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private ConsulDiscoveryProperties consulDiscoveryProperties;
|
|
|
|
|
|
|
|
|
|
@EventListener(DubboBootstrapStartedEvent.class)
|
|
|
|
|
public void attachURLsIntoMetadataBeforeReRegist(
|
|
|
|
|
DubboBootstrapStartedEvent event) {
|
|
|
|
@ -284,18 +289,41 @@ public class DubboServiceRegistrationAutoConfiguration {
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@EventListener(ServiceInstancePreRegisteredEvent.class)
|
|
|
|
|
public void onServiceInstancePreRegistered(
|
|
|
|
|
ServiceInstancePreRegisteredEvent event) {
|
|
|
|
|
Registration registration = event.getSource();
|
|
|
|
|
attachURLsIntoMetadata((ConsulRegistration) registration);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void attachURLsIntoMetadata(ConsulRegistration consulRegistration) {
|
|
|
|
|
NewService newService = consulRegistration.getService();
|
|
|
|
|
Map<String, String> serviceMetadata = dubboServiceMetadataRepository
|
|
|
|
|
.getDubboMetadataServiceMetadata();
|
|
|
|
|
if (!isEmpty(serviceMetadata)) {
|
|
|
|
|
List<String> tags = newService.getTags();
|
|
|
|
|
if (isEmpty(serviceMetadata)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
NewService newService = consulRegistration.getService();
|
|
|
|
|
if (consulDiscoveryProperties.isTagsAsMetadata()) {
|
|
|
|
|
for (Map.Entry<String, String> entry : serviceMetadata.entrySet()) {
|
|
|
|
|
tags.add(entry.getKey() + "=" + entry.getValue());
|
|
|
|
|
attAsTag(newService.getTags(), entry.getKey(), entry.getValue());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
newService.getMeta().putAll(serviceMetadata);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void attAsTag(List<String> tags, String key, String value) {
|
|
|
|
|
Iterator<String> iter = tags.iterator();
|
|
|
|
|
while (iter.hasNext()) {
|
|
|
|
|
String tag = iter.next();
|
|
|
|
|
String[] tmp = tag.split("=");
|
|
|
|
|
if (StringUtils.pathEquals(tmp[0], key)) {
|
|
|
|
|
iter.remove();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
tags.add(key + "=" + value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|