Feign接口的url占位符无法获取Apollo的配置

1:问题描述

项目中,使用apollo服务,来管理配置,在feign的url参数上使用${}的形式,获取配置文件的参数,在本地没有问题,但是使用了apollo后,发现该参数一直获取的是本地的配置文件参数,apollo别的参数都是好的,使用@Value(“${}”)获取也是可以的,但是feign上的占位符始终获取不到apollo的值

 

2:问题原因分析

1:首先apollo确保与本地配置文件的参数名是一致的(此错误几乎不会发生)

2:spring的加载,才是造成这种情况的主要原因之一,首先spring在启动时,它就会扫描到FeignClient这个注解,然后会直接填值,此时apollo的配置还没有加载,所以根本就没有apollo的参数。所以解决这个问题其实很简单,那就是打开apollo的饥饿加载。

3:apollo连接的环境不一致(该错误可能会发生)

 

3:解决问题核心配置

1::针对【问题原因分析】中第二条,解决方案是在apollo的配置中增加一条配置,如下:

apollo.bootstrap.eagerLoad.enabled=true

 

2:针对【问题原因分析】中第三条,解决方案是增加apollo的监听器,代码如下,粘贴即用:

@Slf4j
@Component
public class ApolloChangeListener implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Autowired
    RefreshScope refreshScope;

    @ApolloConfigChangeListener(
            // 要监听的namespace
            value = {"application"}
    )
    public void configChange(ConfigChangeEvent event) {
        // 配置变更后的数据集合
        Set<String> changedKeys = event.changedKeys();
        for (String changedKey : changedKeys) {
            log.warn("apollo修改配置 key = {},apollo历史参数值:{},修改后参数值:{}",changedKey,event.getChange(changedKey).getOldValue(),event.getChange(changedKey).getNewValue());
        }
        this.applicationContext.publishEvent(new EnvironmentChangeEvent(event.changedKeys()));
        refreshScope.refreshAll();
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

在apollo中进行修改和发布,看控制台会不会打印并输出,即可知道是不是连接对了apollo地址

 

posted @ 2022-08-17 21:20  鸭猪是的念来过倒  阅读(914)  评论(0编辑  收藏  举报