Commit 9a0399ee by Nepxion

增加扩展性支持

parent 4738c6e7
......@@ -17,8 +17,11 @@ import org.springframework.context.annotation.Configuration;
import com.nepxion.discovery.plugin.framework.context.PluginContextAware;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.event.PluginPublisher;
import com.nepxion.discovery.plugin.framework.strategy.DiscoveryControlStrategy;
import com.nepxion.discovery.plugin.framework.strategy.RegisterControlStrategy;
import com.nepxion.discovery.plugin.framework.strategy.DiscoveryStrategyExecutor;
import com.nepxion.discovery.plugin.framework.strategy.RegisterStrategyExecutor;
import com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterDiscoveryStrategy;
import com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterRegisterStrategy;
import com.nepxion.discovery.plugin.framework.strategy.impl.VersionFilterDiscoveryStrategy;
@Configuration
public class PluginAutoConfiguration {
......@@ -57,12 +60,27 @@ public class PluginAutoConfiguration {
}
@Bean
public RegisterControlStrategy registerControlStrategy() {
return new RegisterControlStrategy();
public RegisterStrategyExecutor registerStrategyExecutor() {
return new RegisterStrategyExecutor();
}
@Bean
public DiscoveryControlStrategy discoveryControlStrategy() {
return new DiscoveryControlStrategy();
public DiscoveryStrategyExecutor discoveryStrategyExecutor() {
return new DiscoveryStrategyExecutor();
}
@Bean
public IpAddressFilterRegisterStrategy ipAddressFilterRegisterStrategy() {
return new IpAddressFilterRegisterStrategy();
}
@Bean
public IpAddressFilterDiscoveryStrategy ipAddressFilterDiscoveryStrategy() {
return new IpAddressFilterDiscoveryStrategy();
}
@Bean
public VersionFilterDiscoveryStrategy versionFilterDiscoveryStrategy() {
return new VersionFilterDiscoveryStrategy();
}
}
\ No newline at end of file
......@@ -16,9 +16,8 @@ import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import com.nepxion.discovery.plugin.framework.constant.PluginConstant;
import com.nepxion.discovery.plugin.framework.context.PluginContextAware;
import com.nepxion.discovery.plugin.framework.strategy.DiscoveryControlStrategy;
import com.nepxion.discovery.plugin.framework.strategy.DiscoveryStrategyExecutor;
public class DiscoveryClientDecorator implements DiscoveryClient {
private DiscoveryClient discoveryClient;
......@@ -32,35 +31,40 @@ public class DiscoveryClientDecorator implements DiscoveryClient {
}
@Override
public String description() {
return discoveryClient.description();
public List<ServiceInstance> getInstances(String serviceId) {
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
Boolean discoveryControlEnabled = PluginContextAware.isDiscoveryControlEnabled(environment);
if (discoveryControlEnabled) {
DiscoveryStrategyExecutor discoveryStrategyExecutor = applicationContext.getBean(DiscoveryStrategyExecutor.class);
discoveryStrategyExecutor.fireGetInstances(serviceId, instances);
}
@Deprecated
@Override
public ServiceInstance getLocalServiceInstance() {
return discoveryClient.getLocalServiceInstance();
return instances;
}
@Override
public List<ServiceInstance> getInstances(String serviceId) {
List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
public List<String> getServices() {
List<String> services = discoveryClient.getServices();
Boolean discoveryControlEnabled = PluginContextAware.isDiscoveryControlEnabled(environment);
if (discoveryControlEnabled) {
String applicationName = environment.getProperty(PluginConstant.SPRING_APPLICATION_NAME);
String metadataVersion = environment.getProperty(PluginConstant.EUREKA_METADATA_VERSION);
DiscoveryStrategyExecutor discoveryStrategyExecutor = applicationContext.getBean(DiscoveryStrategyExecutor.class);
discoveryStrategyExecutor.fireGetServices(services);
}
DiscoveryControlStrategy discoveryControlStrategy = applicationContext.getBean(DiscoveryControlStrategy.class);
discoveryControlStrategy.apply(applicationName, metadataVersion, serviceId, instances);
return services;
}
return instances;
@Deprecated
@Override
public ServiceInstance getLocalServiceInstance() {
return discoveryClient.getLocalServiceInstance();
}
@Override
public List<String> getServices() {
return discoveryClient.getServices();
public String description() {
return discoveryClient.description();
}
public ConfigurableEnvironment getEnvironment() {
......
......@@ -16,7 +16,7 @@ import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import com.nepxion.discovery.plugin.framework.context.PluginContextAware;
import com.nepxion.discovery.plugin.framework.strategy.RegisterControlStrategy;
import com.nepxion.discovery.plugin.framework.strategy.RegisterStrategyExecutor;
public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
private ServiceRegistry<EurekaRegistration> serviceRegistry;
......@@ -33,11 +33,8 @@ public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
public void register(EurekaRegistration registration) {
Boolean registerControlEnabled = PluginContextAware.isRegisterControlEnabled(environment);
if (registerControlEnabled) {
String serviceId = registration.getServiceId();
String ipAddress = registration.getInstanceConfig().getIpAddress();
RegisterControlStrategy registerControlStrategy = applicationContext.getBean(RegisterControlStrategy.class);
registerControlStrategy.apply(serviceId, ipAddress);
RegisterStrategyExecutor registerStrategyExecutor = applicationContext.getBean(RegisterStrategyExecutor.class);
registerStrategyExecutor.fireRegister(registration);
}
serviceRegistry.register(registration);
......@@ -45,16 +42,23 @@ public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
@Override
public void deregister(EurekaRegistration registration) {
serviceRegistry.deregister(registration);
Boolean registerControlEnabled = PluginContextAware.isRegisterControlEnabled(environment);
if (registerControlEnabled) {
RegisterStrategyExecutor registerStrategyExecutor = applicationContext.getBean(RegisterStrategyExecutor.class);
registerStrategyExecutor.fireDeregister(registration);
}
@Override
public void close() {
serviceRegistry.close();
serviceRegistry.deregister(registration);
}
@Override
public void setStatus(EurekaRegistration registration, String status) {
Boolean registerControlEnabled = PluginContextAware.isRegisterControlEnabled(environment);
if (registerControlEnabled) {
RegisterStrategyExecutor registerStrategyExecutor = applicationContext.getBean(RegisterStrategyExecutor.class);
registerStrategyExecutor.fireSetStatus(registration, status);
}
serviceRegistry.setStatus(registration, status);
}
......@@ -63,6 +67,17 @@ public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
return serviceRegistry.getStatus(registration);
}
@Override
public void close() {
Boolean registerControlEnabled = PluginContextAware.isRegisterControlEnabled(environment);
if (registerControlEnabled) {
RegisterStrategyExecutor registerStrategyExecutor = applicationContext.getBean(RegisterStrategyExecutor.class);
registerStrategyExecutor.fireClose();
}
serviceRegistry.close();
}
public ConfigurableEnvironment getEnvironment() {
return environment;
}
......
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
public abstract class AbstractDiscoveryStrategy extends BasicStrategy implements DiscoveryStrategy {
@Autowired
protected DiscoveryClient discoveryClient;
public DiscoveryClient getDiscoveryClient() {
return discoveryClient;
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
public abstract class AbstractRegisterStrategy extends BasicStrategy implements RegisterStrategy {
@Autowired
protected ServiceRegistry<?> serviceRegistry;
public ServiceRegistry<?> getServiceRegistry() {
return serviceRegistry;
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
public class BasicStrategy implements Strategy {
@Autowired
protected ConfigurableApplicationContext applicationContext;
@Autowired
protected ConfigurableEnvironment environment;
@Override
public ConfigurableApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public ConfigurableEnvironment getEnvironment() {
return environment;
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.List;
import org.springframework.cloud.client.ServiceInstance;
public interface DiscoveryStrategy extends Strategy {
void fireGetInstances(String serviceId, List<ServiceInstance> instances);
void fireGetServices(List<String> services);
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterDiscoveryStrategy;
import com.nepxion.discovery.plugin.framework.strategy.impl.VersionFilterDiscoveryStrategy;
// 因为内置监听触发的时候,需要优先过滤,所以顺序执行
public class DiscoveryStrategyExecutor {
@Autowired
private IpAddressFilterDiscoveryStrategy ipAddressFilterDiscoveryStrategy;
@Autowired
private VersionFilterDiscoveryStrategy versionFilterDiscoveryStrategy;
@Autowired
private List<DiscoveryStrategy> discoveryStrategyList;
@Autowired
private ReentrantReadWriteLock reentrantReadWriteLock;
public void fireGetInstances(String serviceId, List<ServiceInstance> instances) {
try {
reentrantReadWriteLock.readLock().lock();
ipAddressFilterDiscoveryStrategy.fireGetInstances(serviceId, instances);
versionFilterDiscoveryStrategy.fireGetInstances(serviceId, instances);
for (DiscoveryStrategy discoveryStrategy : discoveryStrategyList) {
if (discoveryStrategy != ipAddressFilterDiscoveryStrategy && discoveryStrategy != versionFilterDiscoveryStrategy) {
discoveryStrategy.fireGetInstances(serviceId, instances);
}
}
} finally {
reentrantReadWriteLock.readLock().unlock();
}
}
public void fireGetServices(List<String> services) {
ipAddressFilterDiscoveryStrategy.fireGetServices(services);
versionFilterDiscoveryStrategy.fireGetServices(services);
for (DiscoveryStrategy discoveryStrategy : discoveryStrategyList) {
if (discoveryStrategy != ipAddressFilterDiscoveryStrategy && discoveryStrategy != versionFilterDiscoveryStrategy) {
discoveryStrategy.fireGetServices(services);
}
}
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.cloud.client.serviceregistry.Registration;
public interface RegisterStrategy extends Strategy {
void fireRegister(Registration registration);
void fireDeregister(Registration registration);
void fireSetStatus(Registration registration, String status);
void fireClose();
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.Registration;
import com.nepxion.discovery.plugin.framework.strategy.impl.IpAddressFilterRegisterStrategy;
// 因为内置监听触发的时候,会抛异常处理,所以逆序执行
public class RegisterStrategyExecutor {
@Autowired
private IpAddressFilterRegisterStrategy ipAddressFilterRegisterStrategy;
@Autowired
private List<RegisterStrategy> registerStrategyList;
@Autowired
private ReentrantReadWriteLock reentrantReadWriteLock;
public void fireRegister(Registration registration) {
try {
reentrantReadWriteLock.readLock().lock();
for (RegisterStrategy registerStrategy : registerStrategyList) {
if (registerStrategy != ipAddressFilterRegisterStrategy) {
registerStrategy.fireRegister(registration);
}
}
ipAddressFilterRegisterStrategy.fireRegister(registration);
} finally {
reentrantReadWriteLock.readLock().unlock();
}
}
public void fireDeregister(Registration registration) {
for (RegisterStrategy registerStrategy : registerStrategyList) {
if (registerStrategy != ipAddressFilterRegisterStrategy) {
registerStrategy.fireDeregister(registration);
}
}
ipAddressFilterRegisterStrategy.fireDeregister(registration);
}
public void fireSetStatus(Registration registration, String status) {
for (RegisterStrategy registerStrategy : registerStrategyList) {
if (registerStrategy != ipAddressFilterRegisterStrategy) {
registerStrategy.fireSetStatus(registration, status);
}
}
ipAddressFilterRegisterStrategy.fireSetStatus(registration, status);
}
public void fireClose() {
for (RegisterStrategy registerStrategy : registerStrategyList) {
if (registerStrategy != ipAddressFilterRegisterStrategy) {
registerStrategy.fireClose();
}
}
ipAddressFilterRegisterStrategy.fireClose();
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
public interface Strategy {
ConfigurableApplicationContext getApplicationContext();
ConfigurableEnvironment getEnvironment();
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
package com.nepxion.discovery.plugin.framework.strategy.impl;
/**
* <p>Title: Nepxion Discovery</p>
......@@ -13,39 +13,24 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import com.nepxion.discovery.plugin.framework.constant.PluginConstant;
import com.nepxion.discovery.plugin.framework.entity.DiscoveryEntity;
import com.nepxion.discovery.plugin.framework.entity.DiscoveryServiceEntity;
import com.nepxion.discovery.plugin.framework.entity.FilterEntity;
import com.nepxion.discovery.plugin.framework.entity.FilterType;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.entity.VersionEntity;
import com.nepxion.discovery.plugin.framework.strategy.AbstractDiscoveryStrategy;
public class DiscoveryControlStrategy {
public class IpAddressFilterDiscoveryStrategy extends AbstractDiscoveryStrategy {
@Autowired
private RuleEntity ruleEntity;
@Autowired
private ReentrantReadWriteLock reentrantReadWriteLock;
public void apply(String consumerServiceId, String consumerServiceVersion, String providerServiceId, List<ServiceInstance> instances) {
try {
reentrantReadWriteLock.readLock().lock();
applyIpAddressFilter(providerServiceId, instances);
applyVersionFilter(consumerServiceId, consumerServiceVersion, providerServiceId, instances);
} finally {
reentrantReadWriteLock.readLock().unlock();
}
@Override
public void fireGetInstances(String serviceId, List<ServiceInstance> instances) {
applyIpAddressFilter(serviceId, instances);
}
private void applyIpAddressFilter(String providerServiceId, List<ServiceInstance> instances) {
......@@ -115,61 +100,8 @@ public class DiscoveryControlStrategy {
return matched;
}
private void applyVersionFilter(String consumerServiceId, String consumerServiceVersion, String providerServiceId, List<ServiceInstance> instances) {
// 如果消费端未配置版本号,那么它可以调用提供端所有服务,需要符合规范,极力避免该情况发生
if (StringUtils.isEmpty(consumerServiceVersion)) {
return;
}
@Override
public void fireGetServices(List<String> services) {
DiscoveryEntity discoveryEntity = ruleEntity.getDiscoveryEntity();
if (discoveryEntity == null) {
return;
}
VersionEntity versionEntity = discoveryEntity.getVersionEntity();
if (versionEntity == null) {
return;
}
Map<String, List<DiscoveryServiceEntity>> serviceEntityMap = versionEntity.getServiceEntityMap();
if (MapUtils.isEmpty(serviceEntityMap)) {
return;
}
List<DiscoveryServiceEntity> serviceEntityList = serviceEntityMap.get(consumerServiceId);
if (CollectionUtils.isEmpty(serviceEntityList)) {
return;
}
// 当前版本的消费端所能调用提供端的版本号列表
List<String> allFilterValueList = new ArrayList<String>();
for (DiscoveryServiceEntity serviceEntity : serviceEntityList) {
String providerServiceName = serviceEntity.getProviderServiceName();
if (StringUtils.equals(providerServiceName, providerServiceId)) {
List<String> consumerVersionValueList = serviceEntity.getConsumerVersionValueList();
List<String> providerVersionValueList = serviceEntity.getProviderVersionValueList();
// 判断consumer-version-value值是否包含当前消费端的版本号
if (CollectionUtils.isNotEmpty(consumerVersionValueList) && consumerVersionValueList.contains(consumerServiceVersion)) {
if (CollectionUtils.isNotEmpty(providerVersionValueList)) {
allFilterValueList.addAll(providerVersionValueList);
}
}
}
}
// 未找到相应的版本定义或者未定义
if (CollectionUtils.isEmpty(allFilterValueList)) {
return;
}
Iterator<ServiceInstance> iterator = instances.iterator();
while (iterator.hasNext()) {
ServiceInstance serviceInstance = iterator.next();
String metaDataVersion = serviceInstance.getMetadata().get(PluginConstant.VRESION);
if (!allFilterValueList.contains(metaDataVersion)) {
iterator.remove();
}
}
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy;
package com.nepxion.discovery.plugin.framework.strategy.impl;
/**
* <p>Title: Nepxion Discovery</p>
......@@ -12,36 +12,38 @@ package com.nepxion.discovery.plugin.framework.strategy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.netflix.eureka.serviceregistry.EurekaRegistration;
import com.nepxion.discovery.plugin.framework.entity.FilterEntity;
import com.nepxion.discovery.plugin.framework.entity.FilterType;
import com.nepxion.discovery.plugin.framework.entity.RegisterEntity;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.exception.PluginException;
import com.nepxion.discovery.plugin.framework.strategy.AbstractRegisterStrategy;
public class RegisterControlStrategy {
private static final Logger LOG = LoggerFactory.getLogger(RegisterControlStrategy.class);
public class IpAddressFilterRegisterStrategy extends AbstractRegisterStrategy {
private static final Logger LOG = LoggerFactory.getLogger(IpAddressFilterRegisterStrategy.class);
@Autowired
private RuleEntity ruleEntity;
@Autowired
private ReentrantReadWriteLock reentrantReadWriteLock;
@Override
public void fireRegister(Registration registration) {
String serviceId = registration.getServiceId();
String ipAddress = null;
public void apply(String serviceId, String ipAddress) {
try {
reentrantReadWriteLock.readLock().lock();
if (registration instanceof EurekaRegistration) {
EurekaRegistration eurekaRegistration = (EurekaRegistration) registration;
ipAddress = eurekaRegistration.getInstanceConfig().getIpAddress();
}
applyIpAddressFilter(serviceId, ipAddress);
} finally {
reentrantReadWriteLock.readLock().unlock();
}
}
private void applyIpAddressFilter(String serviceId, String ipAddress) {
......@@ -105,4 +107,19 @@ public class RegisterControlStrategy {
throw new PluginException(ipAddress + " isn't allowed to register to Eureka server, because it isn't in whitelist");
}
}
@Override
public void fireDeregister(Registration registration) {
}
@Override
public void fireSetStatus(Registration registration, String status) {
}
@Override
public void fireClose() {
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.framework.strategy.impl;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import com.nepxion.discovery.plugin.framework.constant.PluginConstant;
import com.nepxion.discovery.plugin.framework.entity.DiscoveryEntity;
import com.nepxion.discovery.plugin.framework.entity.DiscoveryServiceEntity;
import com.nepxion.discovery.plugin.framework.entity.RuleEntity;
import com.nepxion.discovery.plugin.framework.entity.VersionEntity;
import com.nepxion.discovery.plugin.framework.strategy.AbstractDiscoveryStrategy;
public class VersionFilterDiscoveryStrategy extends AbstractDiscoveryStrategy {
@Autowired
private RuleEntity ruleEntity;
@Override
public void fireGetInstances(String serviceId, List<ServiceInstance> instances) {
String consumerServiceId = environment.getProperty(PluginConstant.SPRING_APPLICATION_NAME);
String consumerServiceVersion = environment.getProperty(PluginConstant.EUREKA_METADATA_VERSION);
applyVersionFilter(consumerServiceId, consumerServiceVersion, serviceId, instances);
}
private void applyVersionFilter(String consumerServiceId, String consumerServiceVersion, String providerServiceId, List<ServiceInstance> instances) {
// 如果消费端未配置版本号,那么它可以调用提供端所有服务,需要符合规范,极力避免该情况发生
if (StringUtils.isEmpty(consumerServiceVersion)) {
return;
}
DiscoveryEntity discoveryEntity = ruleEntity.getDiscoveryEntity();
if (discoveryEntity == null) {
return;
}
VersionEntity versionEntity = discoveryEntity.getVersionEntity();
if (versionEntity == null) {
return;
}
Map<String, List<DiscoveryServiceEntity>> serviceEntityMap = versionEntity.getServiceEntityMap();
if (MapUtils.isEmpty(serviceEntityMap)) {
return;
}
List<DiscoveryServiceEntity> serviceEntityList = serviceEntityMap.get(consumerServiceId);
if (CollectionUtils.isEmpty(serviceEntityList)) {
return;
}
// 当前版本的消费端所能调用提供端的版本号列表
List<String> allFilterValueList = new ArrayList<String>();
for (DiscoveryServiceEntity serviceEntity : serviceEntityList) {
String providerServiceName = serviceEntity.getProviderServiceName();
if (StringUtils.equals(providerServiceName, providerServiceId)) {
List<String> consumerVersionValueList = serviceEntity.getConsumerVersionValueList();
List<String> providerVersionValueList = serviceEntity.getProviderVersionValueList();
// 判断consumer-version-value值是否包含当前消费端的版本号
if (CollectionUtils.isNotEmpty(consumerVersionValueList) && consumerVersionValueList.contains(consumerServiceVersion)) {
if (CollectionUtils.isNotEmpty(providerVersionValueList)) {
allFilterValueList.addAll(providerVersionValueList);
}
}
}
}
// 未找到相应的版本定义或者未定义
if (CollectionUtils.isEmpty(allFilterValueList)) {
return;
}
Iterator<ServiceInstance> iterator = instances.iterator();
while (iterator.hasNext()) {
ServiceInstance serviceInstance = iterator.next();
String metaDataVersion = serviceInstance.getMetadata().get(PluginConstant.VRESION);
if (!allFilterValueList.contains(metaDataVersion)) {
iterator.remove();
}
}
}
@Override
public void fireGetServices(List<String> services) {
}
}
\ No newline at end of file
......@@ -14,6 +14,8 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import com.nepxion.discovery.plugin.example.extension.MyDiscoveryStrategy;
import com.nepxion.discovery.plugin.example.extension.MyRegisterStrategy;
import com.nepxion.discovery.plugin.example.impl.DiscoveryConfigAdapter;
@SpringBootApplication
......@@ -27,4 +29,14 @@ public class DiscoveryApplication {
public DiscoveryConfigAdapter discoveryConfigLoader() {
return new DiscoveryConfigAdapter();
}
@Bean
public MyRegisterStrategy myRegisterStrategy() {
return new MyRegisterStrategy();
}
@Bean
public MyDiscoveryStrategy myDiscoveryStrategy() {
return new MyDiscoveryStrategy();
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.example.extension;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.List;
import org.springframework.cloud.client.ServiceInstance;
import com.nepxion.discovery.plugin.framework.strategy.AbstractDiscoveryStrategy;
public class MyDiscoveryStrategy extends AbstractDiscoveryStrategy {
@Override
public void fireGetInstances(String serviceId, List<ServiceInstance> instances) {
System.out.println("========== getInstances() 被触发:serviceId=" + serviceId + " instances=" + instances + " ==========");
}
@Override
public void fireGetServices(List<String> services) {
System.out.println("========== getServices() 被触发:services=" + services + " ==========");
}
}
\ No newline at end of file
package com.nepxion.discovery.plugin.example.extension;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import org.springframework.cloud.client.serviceregistry.Registration;
import com.nepxion.discovery.plugin.framework.strategy.AbstractRegisterStrategy;
public class MyRegisterStrategy extends AbstractRegisterStrategy {
@Override
public void fireRegister(Registration registration) {
System.out.println("========== register() 被触发:serviceId=" + registration.getServiceId());
}
@Override
public void fireDeregister(Registration registration) {
System.out.println("========== deregister() 被触发:serviceId=" + registration.getServiceId());
}
@Override
public void fireSetStatus(Registration registration, String status) {
System.out.println("========== setStatus() 被触发:serviceId=" + registration.getServiceId() + " status=" + status);
}
@Override
public void fireClose() {
System.out.println("========== close() 被触发 ==========");
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment