feat:add registerFilterHandler

pull/181/head
imaxun 3 years ago
parent bd01550076
commit dce086ac97

@ -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,6 +68,16 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
private final ScheduledExecutorService heartbeatExecutor;
private final LinkedList<Object> registerFilterHandler;
public void addRegisterFilterHandler(RegisterFilterHandler registerFilterHandler) {
this.registerFilterHandler.add(registerFilterHandler);
}
public void addRegisterFilterHandler(Class<RegisterFilterHandler> filterHandlerClass) {
this.registerFilterHandler.add(filterHandlerClass);
}
public PolarisServiceRegistry(PolarisDiscoveryProperties polarisDiscoveryProperties,
PolarisDiscoveryHandler polarisDiscoveryHandler,
MetadataLocalProperties metadataLocalProperties) {
@ -71,11 +85,13 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
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<Registration> {
instanceRegisterRequest.setMetadata(metadataLocalProperties.getContent());
instanceRegisterRequest.setProtocol(polarisDiscoveryProperties.getProtocol());
instanceRegisterRequest.setVersion(polarisDiscoveryProperties.getVersion());
//registerFilterHandlerInstances
List<RegisterFilterHandler> 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<Registration> {
// 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<Registration> {
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<Registration> {
/**
* Start the heartbeat thread.
*
* @param heartbeatRequest heartbeat request
*/
public void heartbeat(InstanceHeartbeatRequest heartbeatRequest) {
@ -216,14 +245,32 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
}
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<RegisterFilterHandler> registerFilterHandlerInstances() {
List<RegisterFilterHandler> 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;
}
}

@ -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> 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> 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) {

@ -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;
}
}

@ -0,0 +1,11 @@
package com.tencent.cloud.polaris.registry.filter;
public interface RegisterFilterHandler {
boolean beforeInvoke(RegisterFilterHandlerContext registerFilterHandlerContext);
boolean afterInvoke(RegisterFilterHandlerContext registerFilterHandlerContext);
boolean isSingleInstance();
}

@ -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;
}
}
Loading…
Cancel
Save