【Spring Boot】Spring Boot之整合Apollo配置中心


一、Apollo配置中心簡單介紹
  Apollo(阿波羅)是攜程框架部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,並且具備規范的權限、流程治理等特性,適用於微服務配置管理場景。

二、整合步驟

1)添加Maven依賴

<!-- apollo -->
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.6.0</version>
        </dependency>

2)添加apollo配置在application.properties或bootstrap.properties

非特殊場景下只需要這兩個配置

# 注入默認application namespace的配置示例
apollo.bootstrap.enabled=true
# Apollo application appid
app.id=001
# 指定Apollo Meta Server (默認http://apollo.meta)(默認Meta server與config server地址一樣)
apollo.meta=http://localhost:8080

其他配置:

server.port=9090
#1、 注入默認application namespace的配置示例
apollo.bootstrap.enabled=true
# Apollo application appid
app.id=001
# 指定Apollo Meta Server (默認http://apollo.meta)(默認Meta server與config server地址一樣)
apollo.meta=http://localhost:8080
#2、注入默認application namespace或多個非默認namespace的配置示例
#apollo.bootstrap.namespaces = application,TEST1.public.yml,TEST2.app002_public
#3、將Apollo配置加載提到初始化日志系統之前(1.2.0+) (默認false)
# 使Apollo的加載順序放到日志系統加載之前,不過這會導致Apollo的啟動過程無法通過日志的方式輸出
#apollo.bootstrap.eagerLoad.enabled = true
# 指定apollo cluster (默認default)
#apollo.cluster=SomeCluster
# 指定環境
# 如果是運行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar
# 設置內存中的配置項是否保持和頁面上的順序一致(默認false)
#apollo.property.order.enable=true
#  配置訪問秘鑰
#apollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719

# Spring應用通常會使用Placeholder來注入配置,使用的格式形如${someKey:someDefaultValue},如${timeout:100}。冒號前面的是key,冒號后面的是默認值。
# 建議在實際使用時盡量給出默認值,以免由於key沒有定義導致運行時錯誤。
# 從v0.10.0開始的版本支持placeholder在運行時自動更新,而@ConfigurationProperties如果需要在Apollo配置變化時自動更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope
# 通過設置false來關閉placeholder在運行時自動更新功能(默認true)
#apollo.autoUpdateInjectedSpringProperties=false

注意:對於Meta Server的是內網地址,本地開發環境無法直接連接的情況

直接指定Config Service地址的方式來跳過Meta Server服務發現
如果是運行jar文件,需要注意格式是java -Dapollo.configService=http://localhost:8080 -jar xxx.jar

3)從Apollo中獲取配置

1、Spring Placeholder方式即@Value(${key})方式,該方式支持屬性自動更新(即Apollo屬性更新后會馬上通知應用更新)

@Value("${v1:defaultValue}")
    public String v1;*

2、Spring Boot提供的@ConfigurationProperties使用方式,該方式默認不會自動更新,如果需要在Apollo配置變化時自動更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。

@Configuration
@ConfigurationProperties(prefix = "demo")
@Data
public class ApplicationProperties {

    public String demo1;
    public String demo2;
    public String demo3;
    public String demo4;
}

3、Apollo API使用方式

* 獲取默認namespace的配置
* 獲取非默認的配置
* 監聽配置變化事件

@GetMapping("test2")
    public String test2() {
        // 獲取默認namespace的配置(application),key為v1的值
        Config config = ConfigService.getAppConfig();
        String someKey = "v1";
        String someDefaultValue = "defaultValue";
        String value = config.getProperty(someKey, someDefaultValue);
        System.out.println(value);

        Config publicConfig = ConfigService.getConfig("TEST1.public.yml");
        String someKey2 = "public_key";
        String someDefaultValue2 = "defaultValue";
        String value2 = publicConfig.getProperty(someKey2, someDefaultValue2);
        System.out.println(value2);

        // 非yaml/yml/properties格式的namespace,獲取方式
        ConfigFile configFile = ConfigService.getConfigFile("TEST1.public", ConfigFileFormat.YML);
        String content = configFile.getContent();
        System.out.println(content);

        // 監聽配置變化事件
        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()));
                }
            }
        });
        return v1;
    }

4、Apollo Annotation使用方式

* @ApolloConfig
用來自動注入Config對象
* @ApolloConfigChangeListener
用來自動注冊ConfigChangeListener
* @ApolloJsonValue
用來把配置的json字符串自動注入為對象

@RestController
public class ApolloAnnotionUse {

    // 注入默認的名稱空間配置
    @ApolloConfig
    private Config config;
    @ApolloConfig("application")
    private Config anotherConfig;
    // 注入指定的名稱空間配置
    @ApolloConfig("TEST1.public.yml")
    private Config yetAnotherConfig;

    // 用來把配置的json字符串自動注入為對象
    @ApolloJsonValue("${jsonBeanProperty:[]}")
    private List<String> anotherJsonBeans;

    @Value("${v1:defaultValue}")
    public String v1;

    // 監控默認空間的
    @ApolloConfigChangeListener
    private void someOnChange(ConfigChangeEvent changeEvent) {
        //update injected value of batch if it is changed in Apollo
        if (changeEvent.isChanged("v1")) {
            v1 = config.getProperty("v1", "100");
        }
    }

    // 監控指定空間的
    @ApolloConfigChangeListener("application")
    private void anotherOnChange(ConfigChangeEvent changeEvent) {
        //do something
    }

    // 監控指定空間的
    @ApolloConfigChangeListener({"application","TEST1.public.yml"})
    private void anotherOnChangeMuch(ConfigChangeEvent changeEvent) {
        //do something
    }

    @GetMapping("annoTest")
    public void test() {
        System.out.println(   config.getProperty("v1", "0"));
        System.out.println(   anotherConfig.getProperty("v1", "0"));
        System.out.println(   yetAnotherConfig.getProperty("publicKey", "0"));
        System.out.println(v1);
        System.out.println(anotherJsonBeans);

    }

}

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM