碰到的問題
項目基于SpringCloud+Apollo配置中心今布,在開發(fā)階段硫嘶,F(xiàn)eign遠程調(diào)用的時候url是寫死的阻问,但是提測后,需要進行靈活配置沦疾,所以使用了占位符称近,發(fā)現(xiàn)${}
沒有生效。
導致請求調(diào)用的時候出錯哮塞。
解決過程
首先是檢查配置是否正確刨秆,請求的代碼示例如下:
@FeignClient(name = "xxx", url = "${xxx}")
public interface FeignClientService {
/**
* 獲取實體列表
*
* @param xxx xxx
* @return
* @throws Exception
*/
@GetMapping("/xxx/xxx/xxx")
FeignResp<EntityListVO> getEntityList(@RequestParam(value = "xxx") String xxx) throws Exception;
當url使用固定時,可以正常的解析出請求的url忆畅,使用${}
沒有生效衡未。
這個時候查詢了Apollo的文檔Java客戶端使用指南3.2.1.3SpringBoot集成方式
Spring Boot除了支持上述兩種集成方式以外,還支持通過application.properties/bootstrap.properties來配置家凯,該方式能使配置在更早的階段注入缓醋,比如使用@ConditionalOnProperty的場景或者是有一些spring-boot-starter在啟動階段就需要讀取配置做一些事情(如dubbo-spring-boot-project),所以對于Spring Boot環(huán)境建議通過以下方式來接入Apollo(需要0.10.0及以上版本)绊诲。
從1.2.0版本開始送粱,如果希望把日志相關(guān)的配置(如logging.level.root=info或logback-spring.xml中的參數(shù))也放在Apollo管理,那么可以額外配置apollo.bootstrap.eagerLoad.enabled=true來使Apollo的加載順序放到日志系統(tǒng)加載之前驯镊,不過這會導致Apollo的啟動過程無法通過日志的方式輸出(因為執(zhí)行Apollo加載的時候葫督,日志系統(tǒng)壓根沒有準備好呢!所以在Apollo代碼中使用Slf4j的日志輸出便沒有任何內(nèi)容)板惑,更多信息可以參考PR 1614橄镜。參考配置示例如下:
# will inject 'application' namespace in bootstrap phase
apollo.bootstrap.enabled = true
# put apollo initialization before logging system initialization
apollo.bootstrap.eagerLoad.enabled=true
增加了如上的配置后,發(fā)現(xiàn)仍然沒有作用冯乘,然后檢查了Apollo的版本洽胶,發(fā)現(xiàn)版本的1.1.0
,這個時候內(nèi)心是崩潰的裆馒,因為配置中心是公司統(tǒng)一使用的姊氓,所以沒有辦法隨便升級,只能自己想辦法了喷好。
解決方式
沒辦法在Springboot啟動前加載翔横,可以嘗試手動加載。
import com.ctrip.framework.apollo.ConfigService;
public class ClientUrlConfig {
public void init() {
this.initSet("此處寫你需要提前初始化的key");
}
private void initSet(String... keys) {
for (String key : keys) {
String val = ConfigService.getAppConfig().getProperty(key, null);
System.setProperty(key, val);
}
}
}
然后在SpringApplication.run()
之前加載
public static void main(String[] args) {
new ClientUrlConfig().init();
SpringApplication.run(Application.class, args);
}
通過在啟動前將配置注入梗搅,${}
就可以獲取到正確的鏈接了禾唁。