Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
更详细的介绍请查看:https://github.com/ctripcorp/apollo
安装步骤可以查看:https://blog.csdn.net/michael_hm/article/details/79412839
注意点:
访问http://localhost:8070 登录后,选择创建项目。如下图所示:
添加配置支持两种方式:
日志模块是每个项目中必须的,用来记录程序运行中的相关信息。一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO或者ERROR级别的日志,主要记录业务操作或者错误的日志。那么问题来了,当线上环境出现问题希望输出DEBUG日志信息辅助排查的时候怎么办呢?修改配置文件,重新打包然后上传重启线上环境,以前确实是这么做的。
虽然上面我们已经把日志的配置部署到Apollo配置中心,但在配置中心修改日志等级,依然需要重启应用才生效,下面我们就通过监听配置的变化,来达到热更新的效果。
apoller配置文件内容如下:
spring.application.name = ec-voicesystem
server.port = 8831
logging.level.cn.thislx.apollo.controller = info
application.properties配置文件如下:
app.id=leimingtech-springboot-apollo
apollo.meta=http://192.168.30.128:8080
apollo.bootstarp.enabled=true
apollo.bootstrap.eagerLoad.enabled=true
logging.level.cn.thislx.apollo.controller=debug
配置说明:
需要添加的依赖 如下:
<dependency>
<groupId>com.ctrip.framework.apollogroupId>
<artifactId>apollo-clientartifactId>
<version>1.1.0version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.4version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>3.8.1version>
dependency>
启动类代码如下所示:
package cn.thislx.apollo;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: LX [email protected]
* @Description: 启动类必须增加@EnableApolloConfig
* @Date: 2019/4/16 20:03
* @Version: V1.0
*/
@SpringBootApplication
//@EnableDiscoveryClient
@EnableApolloConfig
public class ApolloApplication {
public static void main(String[] args) {
SpringApplication.run(ApolloApplication.class, args);
}
}
读取公共apollo配置工具类代码如下:
package cn.thislx.apollo.utils;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;
import java.util.Properties;
/**
* @Author: LX [email protected]
* @Description: 读取公共apollo配置
* @Date: 2019/4/16 20:03
* @Version: V1.0
*/
public class PropertiesUtils {
private static final String COMMON = "nova1.NovaCommon";
public static Properties properties = new Properties();
static {
Config commonConfig = ConfigService.getConfig(COMMON);
if (commonConfig != null) {
for (String key : commonConfig.getPropertyNames()) {
properties.setProperty(key, commonConfig.getProperty(key, null));
}
}
}
}
监听apollo配置更新配置类代码如下:
package cn.thislx.apollo.config;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.logging.LoggingSystem;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.Set;
/**
* @Author: LX [email protected]
* @Description: 监听apollo配置更新配置类
* @Date: 18:45 2019/4/16
* @Version: V1.0
*/
@Configuration
public class LoggerConfig {
private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);
private static final String LOGGER_TAG = "logging.level.";
@Autowired
private LoggingSystem loggingSystem;
/**
* @ApolloConfig注解: 将Apollo服务端的中的配置注入这个类中。
*/
@ApolloConfig
private Config config;
/**
* @param changeEvent:可以获取被修改配置项的key集合,以及被修改配置项的新值、旧值和修改类型等信息。
* @ApolloConfigChangeListener注解: 监听配置中心配置的更新事件,若该事件发生,则调用refreshLoggingLevels方法,处理该事件。
*/
@ApolloConfigChangeListener
private void configChangeListter(ConfigChangeEvent changeEvent) {
refreshLoggingLevels();
}
/**
* @Author: LX [email protected]
* @Description: apollo文件修改执行。实现实时更新日志打印级别
* @Date: 2019/4/16 20:11
* @Version: V1.0
*/
@PostConstruct
private void refreshLoggingLevels() {
Set<String> keyNames = config.getPropertyNames();
for (String key : keyNames) {
if (StringUtils.containsIgnoreCase(key, LOGGER_TAG)) {
String strLevel = config.getProperty(key, "info");
LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());
loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);
logger.info("{}:{}", key, strLevel);
}
}
}
}
测试Controller代码如下:
package cn.thislx.apollo.controller;
import cn.thislx.apollo.utils.PropertiesUtils;
import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Properties;
import java.util.Set;
/**
* @Author: LX [email protected]
* @Description: 测试获取apollo配置controller
* @Date: 9:36 2019/4/16
* @Version: V1.0
*/
@Slf4j
@RestController
@RequestMapping("/apollo")
public class IndexController {
/**
* 可以直接使用注解获取apollo中的配置信息
*/
@Value("${server.port}")
private String port;
/**
* 从apollo获取配置信息
*/
@ApolloConfig
private Config config;
/**
* @Author: LX [email protected]
* @Description: 打印apollo的索引配置类
* @Date: 2019/4/16 19:59
* @Version: V1.0
*/
@GetMapping("/index")
public Properties apolloReadDemo() {
/**
* 得到当前app.id中的配置
* */
Set<String> set = config.getPropertyNames();
for (String key : set) {
PropertiesUtils.properties.setProperty(key, config.getProperty(key, null));
}
for (String key : PropertiesUtils.properties.stringPropertyNames()) {
System.out.println(key + ":" + PropertiesUtils.properties.getProperty(key));
}
return PropertiesUtils.properties;
}
/**
* @Author: LX [email protected]
* @Description: 测试修改apollo配置文件热更新
* @Date: 2019/4/16 19:54
* @Version: V1.0
*/
@GetMapping("testHotUpdate")
public String testHotUpdate() {
log.debug("debug log...");
log.info("info log...");
log.warn("warn log...");
return "port:" + port;
}
}
修改 apollo中的logging.level.cn.thislx.apollo.controller对应的日志级别,调用http://ip:port/apollo/testHotUpdate ,观察日志修改前后日志打印情况。发现已经实现日志配置文件的热更新了。
源码地址:https://github.com/lxwjq/SpringBoot-Apollo