diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java index 0d39c7262..4928e7c48 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java @@ -18,13 +18,12 @@ package com.tencent.cloud.polaris.registry; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; +import com.tencent.cloud.polaris.registry.filter.DefaultRegisterFilterHandler; +import com.tencent.cloud.polaris.registry.filter.RegisterFilterHandler; +import com.tencent.cloud.polaris.registry.filter.RegisterFilterHandlerContext; import com.tencent.cloud.polaris.util.OkHttpUtil; import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.api.exception.PolarisException; @@ -37,11 +36,16 @@ import com.tencent.polaris.client.util.NamedThreadFactory; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.springframework.beans.BeanUtils; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import static org.springframework.util.ReflectionUtils.rethrowRuntimeException; /** @@ -64,18 +68,30 @@ public class PolarisServiceRegistry implements ServiceRegistry { private final ScheduledExecutorService heartbeatExecutor; + private final LinkedList registerFilterHandler; + + public void addRegisterFilterHandler(RegisterFilterHandler registerFilterHandler) { + this.registerFilterHandler.add(registerFilterHandler); + } + + public void addRegisterFilterHandler(Class filterHandlerClass) { + this.registerFilterHandler.add(filterHandlerClass); + } + public PolarisServiceRegistry(PolarisDiscoveryProperties polarisDiscoveryProperties, - PolarisDiscoveryHandler polarisDiscoveryHandler, - MetadataLocalProperties metadataLocalProperties) { + PolarisDiscoveryHandler polarisDiscoveryHandler, + MetadataLocalProperties metadataLocalProperties) { this.polarisDiscoveryProperties = polarisDiscoveryProperties; this.polarisDiscoveryHandler = polarisDiscoveryHandler; this.metadataLocalProperties = metadataLocalProperties; + this.registerFilterHandler = new LinkedList<>(); + this.addRegisterFilterHandler(new DefaultRegisterFilterHandler()); + if (polarisDiscoveryProperties.isHeartbeatEnabled()) { this.heartbeatExecutor = Executors.newSingleThreadScheduledExecutor( new NamedThreadFactory("spring-cloud-heartbeat")); - } - else { + } else { this.heartbeatExecutor = null; } } @@ -101,7 +117,16 @@ public class PolarisServiceRegistry implements ServiceRegistry { instanceRegisterRequest.setMetadata(metadataLocalProperties.getContent()); instanceRegisterRequest.setProtocol(polarisDiscoveryProperties.getProtocol()); instanceRegisterRequest.setVersion(polarisDiscoveryProperties.getVersion()); + + //registerFilterHandlerInstances + List registerFilterHandlerInstances = registerFilterHandlerInstances(); try { + registerFilterHandlerInstances.forEach(registerFilterHandler -> { + if (!registerFilterHandler.beforeInvoke(new RegisterFilterHandlerContext(instanceRegisterRequest))) { + log.error("the registerFilterHandler return false on before invoke"); + } + }); + ProviderAPI providerClient = polarisDiscoveryHandler.getProviderAPI(); providerClient.register(instanceRegisterRequest); log.info("polaris registry, {} {} {}:{} {} register finished", @@ -115,11 +140,16 @@ public class PolarisServiceRegistry implements ServiceRegistry { // Start the heartbeat thread after the registration is successful. heartbeat(heartbeatRequest); } - } - catch (Exception e) { + } catch (Exception e) { log.error("polaris registry, {} register failed...{},", registration.getServiceId(), registration, e); rethrowRuntimeException(e); + } finally { + registerFilterHandlerInstances.forEach(registerFilterHandler -> { + if (!registerFilterHandler.afterInvoke(new RegisterFilterHandlerContext(instanceRegisterRequest))) { + log.error("the registerFilterHandler return false on after invoke"); + } + }); } } @@ -143,12 +173,10 @@ public class PolarisServiceRegistry implements ServiceRegistry { try { ProviderAPI providerClient = polarisDiscoveryHandler.getProviderAPI(); providerClient.deRegister(deRegisterRequest); - } - catch (Exception e) { + } catch (Exception e) { log.error("ERR_POLARIS_DEREGISTER, de-register failed...{},", registration, e); - } - finally { + } finally { if (null != heartbeatExecutor) { heartbeatExecutor.shutdown(); } @@ -186,6 +214,7 @@ public class PolarisServiceRegistry implements ServiceRegistry { /** * Start the heartbeat thread. + * * @param heartbeatRequest heartbeat request */ public void heartbeat(InstanceHeartbeatRequest heartbeatRequest) { @@ -216,14 +245,32 @@ public class PolarisServiceRegistry implements ServiceRegistry { } polarisDiscoveryHandler.getProviderAPI().heartbeat(heartbeatRequest); - } - catch (PolarisException e) { + } catch (PolarisException e) { log.error("polaris heartbeat[{}]", e.getCode(), e); - } - catch (Exception e) { + } catch (Exception e) { log.error("polaris heartbeat runtime error", e); } }, ttl, ttl, TimeUnit.SECONDS); } + private List registerFilterHandlerInstances() { + List registerFilterHandlerInstances = new LinkedList<>(); + for (Object instance : this.registerFilterHandler) { + log.info("register filterHandler name[{}]", instance.getClass().getName()); + if (instance instanceof RegisterFilterHandler) { + registerFilterHandlerInstances.add((RegisterFilterHandler) instance); + } else if (instance instanceof Class) { + try { + Class cl = (Class) instance; + RegisterFilterHandler filter = (RegisterFilterHandler) cl.newInstance(); + registerFilterHandlerInstances.add(filter); + } catch (Exception e) { + log.error("register filterHandler name[{}] error{}", instance.getClass().getName(), e); + rethrowRuntimeException(e); + } + } + } + return registerFilterHandlerInstances; + } + } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java index 68f338c5d..9cfada0ab 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java @@ -18,15 +18,19 @@ package com.tencent.cloud.polaris.registry; +import com.google.common.collect.Lists; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; import com.tencent.cloud.polaris.DiscoveryPropertiesAutoConfiguration; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; +import com.tencent.cloud.polaris.registry.filter.RegisterFilterHandler; import com.tencent.polaris.client.api.SDKContext; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration; @@ -35,6 +39,9 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationP import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.LinkedList; +import java.util.List; + /** * Autoconfiguration of service registry of Polaris. * @@ -45,21 +52,34 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnPolarisRegisterEnabled @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) -@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class, +@AutoConfigureAfter({AutoServiceRegistrationConfiguration.class, AutoServiceRegistrationAutoConfiguration.class, - PolarisDiscoveryAutoConfiguration.class }) + PolarisDiscoveryAutoConfiguration.class}) public class PolarisServiceRegistryAutoConfiguration { @Bean - public PolarisServiceRegistry polarisServiceRegistry( + @ConditionalOnMissingBean + protected List registerFilterHandler() { + return Lists.newLinkedList(); + } + + @Bean + @ConditionalOnMissingBean + protected PolarisServiceRegistry polarisServiceRegistry( PolarisDiscoveryProperties polarisDiscoveryProperties, PolarisDiscoveryHandler polarisDiscoveryHandler, - MetadataLocalProperties metadataLocalProperties) { - return new PolarisServiceRegistry(polarisDiscoveryProperties, polarisDiscoveryHandler, metadataLocalProperties); + MetadataLocalProperties metadataLocalProperties, @Autowired(required = false) LinkedList registerFilterHandler) { + PolarisServiceRegistry polarisServiceRegistry = new PolarisServiceRegistry(polarisDiscoveryProperties, polarisDiscoveryHandler, metadataLocalProperties); + if (registerFilterHandler == null) { + registerFilterHandler = new LinkedList<>(); + } + registerFilterHandler.forEach(polarisServiceRegistry::addRegisterFilterHandler); + return polarisServiceRegistry; } @Bean + @ConditionalOnMissingBean @ConditionalOnBean(AutoServiceRegistrationProperties.class) - public PolarisRegistration polarisRegistration( + protected PolarisRegistration polarisRegistration( DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration, PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context) { return new PolarisRegistration(discoveryPropertiesAutoConfiguration, @@ -67,8 +87,9 @@ public class PolarisServiceRegistryAutoConfiguration { } @Bean + @ConditionalOnMissingBean @ConditionalOnBean(AutoServiceRegistrationProperties.class) - public PolarisAutoServiceRegistration polarisAutoServiceRegistration( + protected PolarisAutoServiceRegistration polarisAutoServiceRegistration( PolarisServiceRegistry registry, AutoServiceRegistrationProperties autoServiceRegistrationProperties, PolarisRegistration registration) { diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/DefaultRegisterFilterHandler.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/DefaultRegisterFilterHandler.java new file mode 100644 index 000000000..52cf731cf --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/DefaultRegisterFilterHandler.java @@ -0,0 +1,26 @@ +package com.tencent.cloud.polaris.registry.filter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DefaultRegisterFilterHandler implements RegisterFilterHandler { + private static final Logger log = LoggerFactory + .getLogger(DefaultRegisterFilterHandler.class); + + @Override + public boolean beforeInvoke(RegisterFilterHandlerContext registerFilterHandlerContext) { + log.info("defaultRegisterFilterHandler beforeInvoke info"); + return true; + } + + @Override + public boolean afterInvoke(RegisterFilterHandlerContext registerFilterHandlerContext) { + log.info("defaultRegisterFilterHandler beforeInvoke afterInvoke"); + return true; + } + + @Override + public boolean isSingleInstance() { + return true; + } +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/RegisterFilterHandler.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/RegisterFilterHandler.java new file mode 100644 index 000000000..fa8f5e81b --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/RegisterFilterHandler.java @@ -0,0 +1,11 @@ +package com.tencent.cloud.polaris.registry.filter; + + +public interface RegisterFilterHandler { + + boolean beforeInvoke(RegisterFilterHandlerContext registerFilterHandlerContext); + + boolean afterInvoke(RegisterFilterHandlerContext registerFilterHandlerContext); + + boolean isSingleInstance(); +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/RegisterFilterHandlerContext.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/RegisterFilterHandlerContext.java new file mode 100644 index 000000000..09806d063 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/filter/RegisterFilterHandlerContext.java @@ -0,0 +1,15 @@ +package com.tencent.cloud.polaris.registry.filter; + +import com.tencent.polaris.api.rpc.InstanceRegisterRequest; + +public class RegisterFilterHandlerContext { + private InstanceRegisterRequest instanceRegisterRequest; + + public InstanceRegisterRequest getInstanceRegisterRequest() { + return instanceRegisterRequest; + } + + public RegisterFilterHandlerContext(InstanceRegisterRequest instanceRegisterRequest) { + this.instanceRegisterRequest = instanceRegisterRequest; + } +}