主要步骤

  • 一、在springboot项目中配置application.yml
  • 二、在apollo平台上配置对应的namespace及logback配置
  • 三、在SpringBoot启动类上添加@EnableApolloConfig
  • 四、通过Java SystemProperty指定Apollo启动相关环境配置
  • 五、校验配置是否生效


参考:
https://github.com/ctripcorp/apollo/pull/1614

springboot logging模块启动顺序默认在apollo模块之前,因此apollo中配置的日志相关配置并未生效,
在apollo1.2+版本后提供了eager加载配置,这种方式使得Apollo的加载顺序放到了日志系统加载之前,
会导致Apollo的启动过程无法通过日志的方式输出(因为执行Apollo加载的时候,日志系统压根没有准备好呢!所以在Apollo代码中使用Slf4j的日志输出便没有任何内容)

这种加载时间太靠前的方式不是必选的,通过参数apollo.bootstrap.eagerLoad.enabled可控制是否走这种逻辑,
在SpringBoot中配置日志优先于apollo加载,主要分为以下几步:

一、在springboot项目中配置application.yml

apollo-client maven依赖如下:

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

SpringBoot项目中application.yml配置如下:

# apollo配置
apollo:
  # 启用apollo boot 配置
  bootstrap:
    enabled: true
    # 使Apollo的加载顺序放到日志系统加载之前
    eagerLoad:
      enabled: true
    # 注入命名空间(多个namespace间英文逗号分隔)
    namespaces: application.yml

二、在apollo平台上配置对应的namespace及logback配置

然后在apollo对应的app下新建namespace: application.yml且设置logback配置如下:

#设置日志级别
logging:
  level:
    root: debug
  pattern:
    console: >-
      %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
      %clr(${LOG_LEVEL_PATTERN:-%5p})
      %clr(${PID:- }){magenta}
      %clr(---){faint}
      %clr([%15.15t]){faint}
      %clr(%-40.40logger{39}){cyan}
      %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
    file: >-
      %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}
      ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} :
      %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
  file:
    # 日志文件名称及路径
    name: /data/logs/mx_svc_gateway/mx_svc_gateway.log
  logback:
    rollingpolicy:
      # 重启时是否删除原日志
      clean-history-on-start: false
      # 滚动文件命名模式
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
      # 单日志文件大小
      max-file-size: 10MB
      # 保留的最大归档文件数量
      max-history: 100

apollo java配置 apollo配置加载顺序_Java

三、在SpringBoot启动类上添加@EnableApolloConfig

在SpringBoot项目起送类上添加@EnableApolloConfig注解,且其中value需与第一步中的apollo.bootstrap.namespaces相同

import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring启动类
 *
 * @author luohq
 * @date 2020/03/03
 */
@SpringBootApplication
//启用apollo配置中心
@EnableApolloConfig("application.yml")
public class MxSvcGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(MxSvcGatewayApplication.class, args);
    }

}

实际使用过程中,若启动类不添加@EnableApolloConfig注解,会报如下警告:

--2021-03-03 10:56:30.688 - WARN 8952 --- [           main] o.s.b.c.p.PropertySourcesDeducer         : 
Multiple PropertySourcesPlaceholderConfigurer beans registered 
[propertySourcesPlaceholderConfigurer, org.springframework.context.support.PropertySourcesPlaceholderConfigurer], 
falling back to Environment

四、通过Java SystemProperty指定Apollo启动相关环境配置

Java项目启动相关apollo环境系统属性

# appId
-Dapp.id=mx-svc-gateway
# apollo meta服务url
-Dapollo.meta=http://xxx.myapollo.com:8080
# apoll配置缓存目录
-Dapollo.cacheDir=/mx-apollo-cache-dir
# apollo集群配置
-Dapollo.cluster=luo

开发时可以指定应用启动VM Options

apollo java配置 apollo配置加载顺序_Java_02

而在线上部署服务时,可在Java启动命令上直接拼接如上系统属性,
亦可以通过暴露环境变量,然后将环境变量值转换为对应的系统属性。

java -jar myapp.jar 
-Dapp.id=mx-svc-gateway
-Dapollo.meta=http://xxx.myapollo.com:8080
-Dapollo.cacheDir=/mx-apollo-cache-dir
-Dapollo.cluster=luo

五、校验配置是否生效

如上几步配置完成后,通过修改logging.level.root=debug|info后重启服务,即可看到最终的日志配置是否生效。