使用过Spring Cloud的eureka的项目,肯定会遇到本地开发注册到其他环境的eureka,影响他人使用。所以我们觉得往eureka注册需要做个限制。
eureka暂时还没有配置方案来解决这个问题,只能自己拓展。
在网上找到别人写的一个中间件,解决spring cloud使用起来的一些诟病。
地址:https://gitee.com/gengzi/Nepxion-Discovery
现在就实现eureka的注册白名单。
eureka注册服务,入口方法是EurekaAutoServiceRegistration.start()
private EurekaServiceRegistry serviceRegistry;
public EurekaAutoServiceRegistration(ApplicationContext context, EurekaServiceRegistry serviceRegistry, EurekaRegistration registration) {
this.context = context;
this.serviceRegistry = serviceRegistry;
this.registration = registration;
}
this.serviceRegistry.register(this.registration);
需要在初始化serviceRegistry的时候,修改为我们自定义的EurekaServiceRegistry
首先自定义spring的初始化器,加到spring.factories中
org.springframework.context.ApplicationContextInitializer=\
com.xxx.xxx.xxx.EurekaApplicationContextInitializer
public class EurekaApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.getBeanFactory().addBeanPostProcessor(new InstantiationAwareBeanPostProcessorAdapter() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof EurekaServiceRegistry) {
EurekaServiceRegistry eurekaServiceRegistry = (EurekaServiceRegistry) bean;
return new EurekaServiceRegistryDecorator(eurekaServiceRegistry, applicationContext);
}
return bean;
}
});
}
}
如果是EurekaServiceRegistry,返回我们包装的EurekaServiceRegistryDecorator。
public class EurekaServiceRegistryDecorator extends EurekaServiceRegistry {
@Override
public void register(EurekaRegistration registration) {
Boolean registerControlEnabled = isRegisterControlEnabled(environment);
if (registerControlEnabled) {
InetAddress address = null;
try {
address = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
validateWhitelist(address.getHostAddress());
}
serviceRegistry.register(registration);
}
然后在这个register就可以随便自己定义规则了。