• Apollo 分布式配置中心(补充)


    1.   Namespace

    1.1.  什么是Namespace

    Namespace是配置项的集合,类似于一个配置文件的概念。

    Apollo在创建项目的时候,都会默认创建一个“application”的Namespace。顾名思义,“application”是给应用自身使用的,熟悉Spring Boot的同学都知道,Spring Boot项目都有一个默认配置文件application.yml。在这里application.properties就等同于“application”的Namespace。对于90%的应用来说,“application”的Namespace已经满足日常配置使用场景了。

    1.2.  客户端如何获取Namespace

    2.  重新构建

    git clone https://github.com/ctripcorp/apollo.git

    修改完代码后调用 ${YOUR-WORKSPACE}/apollo/script/build.sh 

    执行完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.  文档

    Apollo核心概念之“Namespace” 

    分布式部署指南

    Apollo配置中心的各种使用场景和示例代码 

    Java客户端使用指南 

    部署&开发遇到的常见问题 

    Apollo使用指南 

      

  • 相关阅读:
    把程序的定义与实现部分用头文件与源文件分开
    简单控件的应用(二)—学生管理系统
    Java基础14
    创建插入符、输出不同效果的文字
    Java基础12
    简单控件的应用(一)—prj计算器
    简单的Win 32 Application
    最简单的音乐播放器
    消息处理初步
    基于MFC,在非客户区与客户区利用CButon类创建button
  • 原文地址:https://www.cnblogs.com/cjsblog/p/10956364.html
Copyright © 2020-2023  润新知