1. Namespacejava
1.1. 什麼是Namespacegit
Namespace是配置項的集合,相似於一個配置文件的概念。github
Apollo在建立項目的時候,都會默認建立一個「application」的Namespace。顧名思義,「application」是給應用自身使用的,熟悉Spring Boot的同窗都知道,Spring Boot項目都有一個默認配置文件application.yml。在這裏application.properties就等同於「application」的Namespace。對於90%的應用來講,「application」的Namespace已經知足平常配置使用場景了。spring
1.2. 客戶端如何獲取Namespace數據庫
2. 從新構建bootstrap
git clone https://github.com/ctripcorp/apollo.git緩存
修改完代碼後調用 ${YOUR-WORKSPACE}/apollo/script/build.sh app
執行完bulid.sh之後會再各個項目的target目錄下生產zip包框架
因而,咱們就能夠獲得如下三個包分佈式
apollo-adminservice-1.5.0-SNAPSHOT-github.zip
apollo-configservice-1.5.0-SNAPSHOT-github.zip
apollo-portal-1.5.0-SNAPSHOT-github.zip
解壓後修改數據庫鏈接地址後,啓動
3. 增長可用的環境
前面咱們經過執行初始化腳原本初始化數據庫,在腳本的最後插入了幾條初始化數據
所以,能夠經過修改 apollo.portal.envs 字段的值來添加激活的(可用的)環境。直接修改初始化腳本,或者腳本執行完之後再執行update。例如:
1 UPDATE ApolloPortalDB.ServerConfig SET value = 'local,dev,test,prod' WHERE id = 1;
2 UPDATE ApolloPortalDB.ServerConfig SET value = '[{"orgId":"TEC","orgName":"技術部"}]' WHERE id = 2;
訪問 http://localhost:8070/ (apollo/admin)
本例中,增長了TEST環境,還增長了一個Namespace
4. API使用方式
API方式是最簡單、高效使用Apollo配置的方式,不依賴Spring框架便可使用。
4.1. 獲取默認namespace的配置
1 // config instance is singleton for each namespace and is never null
2 Config config = ConfigService.getAppConfig();
3 String someKey = "someKeyFromDefaultNamespace";
4 String someDefaultValue = "someDefaultValueForTheKey";
5 String value = config.getProperty(someKey, someDefaultValue);
經過上述的config.getProperty能夠獲取到someKey對應的實時最新的配置值。
另外,配置值從內存中獲取,因此不須要應用本身作緩存。
4.2. 監聽配置變化事件
監聽配置變化事件只在應用真的關心配置變化,須要在配置變化時獲得通知時使用,好比:數據庫鏈接串變化後須要重建鏈接等。
若是隻是但願每次都取到最新的配置的話,只須要按照上面的例子,調用config.getProperty便可。
1 // config instance is singleton for each namespace and is never null
2 Config config = ConfigService.getAppConfig();
3 config.addChangeListener(new ConfigChangeListener() {
4 @Override
5 public void onChange(ConfigChangeEvent changeEvent) {
6 System.out.println("Changes for namespace " + changeEvent.getNamespace());
7 for (String key : changeEvent.changedKeys()) {
8 ConfigChange change = changeEvent.getChange(key);
9 System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
10 }
11 }
12 });
4.3. 獲取公共Namespace的配置
1 String somePublicNamespace = "CAT";
2 Config config = ConfigService.getConfig(somePublicNamespace);
3 String someKey = "someKeyFromPublicNamespace";
4 String someDefaultValue = "someDefaultValueForTheKey";
5 String value = config.getProperty(someKey, someDefaultValue);
4.4. 獲取非properties格式namespace的配置
apollo-client 1.3.0版本開始對yaml/yml作了更好的支持,使用起來和properties格式一致。
1 Config config = ConfigService.getConfig("application.yml");
2 String someKey = "someKeyFromYmlNamespace";
3 String someDefaultValue = "someDefaultValueForTheKey";
4 String value = config.getProperty(someKey, someDefaultValue);
5. 實時動態調整日誌級別
這個功能很實用
引入依賴
1 <groupId>com.ctrip.framework.apollo</groupId>
2 <artifactId>apollo-client</artifactId>
3 <version>1.4.0</version>
4 </dependency>
日誌級別配置
1 package com.cjs.example.config;
2
3 import com.ctrip.framework.apollo.Config;
4 import com.ctrip.framework.apollo.model.ConfigChange;
5 import com.ctrip.framework.apollo.model.ConfigChangeEvent;
6 import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
7 import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
8 import lombok.extern.slf4j.Slf4j;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.boot.logging.LogLevel;
11 import org.springframework.boot.logging.LoggingSystem;
12 import org.springframework.context.annotation.Configuration;
13 import org.springframework.util.StringUtils;
14
15 import java.util.Set;
16
17 /**
18 * @author ChengJianSheng
19 * @date 2019-05-31
20 */
21 @Slf4j
22 @Configuration
23 public class LoggerConfig {
24
25 private static final String LOGGER_TAG = "logging.level.";
26
27 /**
28 * 注入默認的命名空間配置
29 */
30 @ApolloConfig
31 private Config config;
32
33 @Autowired
34 private LoggingSystem loggingSystem;
35
36 @ApolloConfigChangeListener
37 private void onChange(ConfigChangeEvent configChangeEvent) {
38 System.out.println("配置發生變化");
39 System.out.println("Changes for namespace " + configChangeEvent.getNamespace());
40 for (String key : configChangeEvent.changedKeys()) {
41 ConfigChange change = configChangeEvent.getChange(key);
42 System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
43 }
44
45 Set<String> keyNames = config.getPropertyNames();
46 for (String key : keyNames) {
47 if (StringUtils.isEmpty(key)) {
48 continue;
49 }
50 if (!key.startsWith(LOGGER_TAG)) {
51 continue;
52 }
53
54 String loggerName = key.replace(LOGGER_TAG, "");
55 String strLevel = config.getProperty(key, "info");
56 LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
57 loggingSystem.setLogLevel(loggerName, level);
58
59 log.info("{}:{}", key, strLevel);
60 }
61 }
62
63 }
application.properties
1 server.port=9000
2
3 app.id=1001
4 env=LOCAL
5 apollo.meta=http://localhost:8080
6 apollo.cacheDir=/Users/chengjiansheng/data
7 apollo.bootstrap.enabled=true
修改配置
5. 工程結構
https://github.com/chengjiansheng/apollo-demo
6. 文檔