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地址