以SpringCloud 为例,希望服务在启动后根据某些信息生成一个动态的 实例ID

也就是application.yaml中配置的如Eureka的配置

eureka:
  instance:
    instance-id: ID

我们如果希望在服务启动时候随机生成一个instance-id,首先找到

可以使用BeanPostProcessor在Bean实例化之后对他进行修改eureka.instance这个属性绑定到的Bean,通过在application.yaml 按住Ctril + 左键点击可以找到org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
在这里插入图片描述

接下在使用后处理器在实例化之后对属性进行调整即可

@Component
public class EurekaConfigBeanPostProcessor implements BeanPostProcessor  {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof EurekaInstanceConfigBean) {
            EurekaInstanceConfigBean properties = (EurekaInstanceConfigBean) bean;
            String instanceId = properties.getInstanceId();
            System.out.println("Old InstanceID:      " + instanceId);
            instanceId =  UUID.randomUUID().toString();
            // 修改ID
            properties.setInstanceId(instanceId);
        }
        return null;
    }
}

这样在注册中心我们就可以看见我们自定义的ID。

这里主要是找到配置文件中对应配置的Config对象。

下面是SpringCloud consul动态修改实例ID的示例,Consul的配置实例为org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties类:

@Component
public class ConsulConfigPostProcessorDemo implements BeanPostProcessor  {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof ConsulDiscoveryProperties) {
            
            ConsulDiscoveryProperties properties = (ConsulDiscoveryProperties) bean;
            String instanceId = properties.getInstanceId();
            System.out.println("InstanceID:      " + instanceId);
            instanceId += "__MODIFY";
            properties.setInstanceId(instanceId);
        }
        return null;
    }
}

参考

[1]. 萧逸才 . Spring的BeanPostProcessor接口实现Demo . https://blog.csdn.net/xyc_csdn/article/details/77427724

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐