apolloconfig / apollo-use-cases

Show various usage scenarios and sample codes of the Apollo configuration center, welcome to share more configuration use cases in your daily work!
Apache License 2.0
945 stars 401 forks source link

针对应用启动前需要读取文件配置的处理 #22

Closed jokimina closed 5 years ago

jokimina commented 5 years ago

除了java应用在运行中实时listen namespace的配置, 实际上还有文件配置会出现差异情况,

在我们场景, 比如properties等包含数据源或其他需要在应用启动前读取的配置, 在应用启动前由shell通过不同参数从apollo拉取到本地, 从而实现一个镜像可以放在任何环境跑.
约定公共配置文件抽离到public, 有需要的关联覆盖相应配置项.

不知道这种算不算use case. 大致内容如下, 觉得可以的话我之后提交一个pr.

#!/bin/bash
CONFIG_SERVER_BASE_URL=${CONFIG_SERVER_BASE_URL:?"need env param [CONFIG_SERVER_BASE_URL]"}
APOLLO_APP_ID=${APOLLO_APP_ID:?"need env param [APOLLO_APP_ID]"}
PUBLIC_PREFIX=${PUBLIC_PREFIX:-"PLATFORM"}
APOLLO_CLUSTER=${APOLLO_CLUSTER:-"default"}
CONFIG_FILES="$(find /data/tomcat/webapps/ROOT/WEB-INF/classes/ -name "*.properties" ! -path "*static*"  | awk -vFS="/" '{print $NF}')"
ECS_IP=$(curl http://100.100.100.200/latest/meta-data/private-ipv4)
APOLLO_FORCE_PROPERTIES=${APOLLO_FORCE_PROPERTIES:-"true"}

for _config_file in ${CONFIG_FILES[@]}
do
    export result=
    echo "## $_config_file"
    _abs_config_file_path=`find /data/tomcat/webapps/ROOT/WEB-INF/classes/ -name "$_config_file" ! -path "*static*"`
    _namespace=${_config_file%%.*}

    if [ x"$_namespace" = x"config" ] || [ x"$_namespace" = x"db-config" ] || [ x"$_namespace" = x"redis" ];then
        _namespace="${PUBLIC_PREFIX}.${_namespace}"
    fi

    result=$(curl -s ${CONFIG_SERVER_BASE_URL}/configfiles/${APOLLO_APP_ID}/${APOLLO_CLUSTER}/${_namespace}?ip=${ECS_IP} | tr -d '\\' )
    if echo $result | grep -q 'Not Found' ;then
        echo "#################        $_config_file not found in apollo!!!      #######################"  
        if [ x"$APOLLO_FORCE_PROPERTIES" = x"true" ];then
            exit 404
        fi
        continue
    fi
    echo "### init  ${_abs_config_file_path} ..."
    echo "$result" | sort  > ${_abs_config_file_path}
done
nobodyiam commented 5 years ago

这是一个挺有意思的场景,是针对老应用不改代码接入apollo?

我理解对普通的Java应用(除了极少数启动期配置如日志配置)应该都是可以运行时获取配置的

jokimina commented 5 years ago

这里只是在应用启动前, 把相关的文件配置从apollo上拉到本地准备好, 对于应用来说是无感知的. 实际读取的还是文件配置.

文件主要是早期大量的properties文件配置的兼容, 数据源相关启动时需要读到的配置, 不然应用无法启动, 数据源会有很多重复配置, 所以约定了几个固定数据源文件会从公共namespace拉取, 有特别的可以自行关联覆盖. 不过现在虽然应用层面接入了apollo监听实时配置, 但是有一些变更较少的配置开发同学会放到properties文件里, 现在都是统一托管到apollo.

jokimina commented 5 years ago

简单概括就是把文件配置也托管到apollo了, 抽离了文件配置的重复内容和屏蔽环境差异, 开发同学其实没啥感觉, 反正应用读的都是文件, 这里可能主要体现的运维同学的用法 lol..

nobodyiam commented 5 years ago

恩,这确实是一个具备实际应用的场景,欢迎PR