一、SpringBoot集成
1.發布配置信息
設置本機為DEV環境:Linux在/opt/settings/server.properties增加配置env=DEV,windows在c:\opt\settings\server.properties
圖1
在apollo portal上新建項目后,默認就有了application命名空間。在DEV環境下新建一個名為test_namespace的命名空間。
在application上發布:spring.applicaton.name=apollo_demo,server.port=9000。
在test_name上發布:name=name1, value=value2。
2.引入依賴
org.springframework.boot
spring-boot-stater
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
${lombok.version}
provided
com.ctrip.framework.apollo
apollo-client
${apollo.version}
3.項目配置
在項目的application.properties(applicaiton.yml)或者/META-INF/app.properties填入app.id=appId(在apollo-portal上新建項目時填寫的appId,表示獲取的是那個配置項目的配置信息)。
resources目錄下新建apollo-env.properties,填寫各個環境的meta server地址:
圖2
使用application命名空間的配置信息來啟動SpringBoot應用 入口方法增加@EnableApolloConfig注解
@SpringBootApplication
@EnableApolloConfig
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
如果不使用@EnableApolloConfig注解,可以在application.properties里面配置apollo.bootstrap.enabled=true,效果一樣。 使用apollo.bootstrap.namespaces = application,test_namespace可以指定命名空間。
啟動項目:
圖3
4.獲取配置
application命名空間配置信息 java bean:
@Component
@EnableApolloConfig
@Getter
@Setter
@ToString
public class AppNamespace {
@Value("${spring.application.name:}")
private String name;
@Value("${server.port:}")
private String value;
}
java bean:
@Component
@EnableApolloConfig("CASE.test_namespace")
@Getter
@Setter
@ToString
public class TestNamespace {
@Value("${name}")
private String name;
@Value("${value}")
private String value;
}
使用:
@RestController
public class DemoController {
@Autowired
private TestNamespace demo;
@Autowired
private AppNamespace application;
@ApolloConfig
private Config appConfig;
@ApolloConfig("CASE.test_namespace")
private Config testConfig1;
private Config testConfig2 = ConfigService.getConfig("CASE.test_namespace");
}
以上兩種方式獲取配置信息的值,會跟配置中心的更改同步(1秒內);還可以使用@ConfigurationProperties來獲取配置信息,但這種方式不會同步更新,需要額外的編碼配置才能實現,具體查看官方文檔。
5.其他
@ApolloJsonValue注解,作用相當于@Value,將JSON字符串轉成對象。
@ApolloConfigChangeListener注解::
@ApolloConfigChangeListener
private void someOnChange(ConfigChangeEvent changeEvent) {
//update injected value of batch if it is changed in Apollo
if (changeEvent.isChanged("key")) {
System.out.println(config.getIntProperty("key", ""));
}
}
@ApolloConfigChangeListener相當于@ApolloConfigChangeListener("application")
相當于:
Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
System.out.println("Changes for namespace " + changeEvent.getNamespace());
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
}
}
});
如果同時以兩種方式綁定changeListener的方式,只有ConfigService實例的監聽器會生效。
2.其他