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. 工程结构
6. 文档
上一篇: 函数(三)
推荐阅读
-
Springcloud 2.x 版本 分布式配置中心
-
spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
-
Spring Cloud 之分布式配置中心--Config
-
为什么需要分布式配置中心?
-
携程Apollo(阿波罗)配置中心在.NET Core项目快速集成
-
SpringCloud实战(六)-高可用的分布式配置中心(Spring Cloud Config)
-
配置中心 Apollo 1.4 安装
-
基于zookeeper实现分布式配置中心(二)
-
分布式配置中心超轻量的实现方式(带源码)
-
携程 Apollo 配置中心 | 学习笔记(十一)| 如何引入Apollo配置中心改造老Web项目?