基於Gitlab實現的配置中心(支持Docker)

項目介紹

項目地址: https://github.com/lipg/config-agent

配置中心工具,目前支持通過http,https的方式從git中下載配置文件。

gitlab支持在線Web修改文件,遂使用該方式可實現一個支持傳統應用的配置中心。使用shell
腳本也可是實現該功能,但是爲了提供更好的兼容性,遂使用Go專門寫的Agent,不依賴與系統環境組件,如:curl、wget等。

基本流程:從Gitlab中獲取訪問Api的Access Key -> 使用Config下載配置文件 -> 將配置文件複製並覆蓋到指定位置 -> 啓動應用

項目結構

Docker+Jenkins的持續集成及相關腳本分享請查看 http://blog.lipg.cn/ji-yu-jenkinsshi-xian-de-docker-imagechi-xu-ji-cheng/

git作爲配置中心,其每個倉庫結構

  • 根目錄
    • app/ : 項目配置文件
    • script/ : 項目所需腳本

項目結構(基於jenkins的Pipeline構建)

  • 根目錄
    • Jenkinsfile : jenkins構建腳本
    • docker/ : Docker構建所需的Dockerfile等文件
      • entrypoint/ : 啓動腳本
      • Dockerfile : docker構建腳本

使用方式

配置文件下載腳本 Get_Configuration.sh

#!/usr/bin/env bash
# 配置文件配置
# 配置文件所在的服務器,可使用環境變量AUTOZI_CONFIG_URL注入。
export DEFAULT_AUTOZI_CONFIG_URL='http://git.lipg.cn'
# 配置文件倉庫名稱,可使用環境變量AUTOZI_CONFIG_REPO注入。
export DEFAULT_AUTOZI_CONFIG_REPO='cloud/config-agent'
# 配置文件標示,可以使用環境變量AUTOZI_CONFIG_TARGET注入。(可以是分支名稱、Tag、可以是commit ID。)
export DEFAULT_AUTOZI_CONFIG_TARGET='master'
# 授權的Token,可以使用環境變量AUTOZI_CONFIG_TOKEN注入。
export DEFAULT_AUTOZI_CONFIG_TOKEN=''
# 配置文件下載的臨時目錄,可以使用環境變量CONFIG_TMP_PATH注入
export AUTOZI_CONFIG_TMP_PATH='/tmp'

# 檢查配置參數,如果未注入,則使用默認值
if [ -z "$AUTOZI_CONFIG_URL" ]; then
    export AUTOZI_CONFIG_URL="$DEFAULT_AUTOZI_CONFIG_URL"
fi
if [ -z "$AUTOZI_CONFIG_REPO" ]; then
    export AUTOZI_CONFIG_REPO="$DEFAULT_AUTOZI_CONFIG_REPO"
fi
if [ -z "$AUTOZI_CONFIG_TARGET" ]; then
    export AUTOZI_CONFIG_TARGET="$DEFAULT_AUTOZI_CONFIG_TARGET"
fi
if [ -z "$AUTOZI_CONFIG_TOKEN" ]; then
    export AUTOZI_CONFIG_TOKEN="$DEFAULT_AUTOZI_CONFIG_TOKEN"
fi
if [ -z "$AUTOZI_CONFIG_TMP_PATH" ]; then
    export AUTOZI_CONFIG_TMP_PATH="$DEFAULT_AUTOZI_CONFIG_TMP_PATH"
fi
# 下載配置到臨時目錄
mkdir -pv ${AUTOZI_CONFIG_TMP_PATH}
$bash_dir/config --url=${AUTOZI_CONFIG_URL} --repo=${AUTOZI_CONFIG_REPO} --branch=${AUTOZI_CONFIG_TARGET} --token=${AUTOZI_CONFIG_TOKEN} --path=${AUTOZI_CONFIG_TMP_PATH}/config.tar
# 將配置文件展開
cd ${AUTOZI_CONFIG_TMP_PATH} && tar -xvf config.tar --strip-components=1 && rm -rf config.tar && ls -lR

更新配置文件 App_Configuration.sh

將倉庫中的app目錄下的配置文件全部拷貝到指定目錄,使用AUTOZI_CONFIG_PATH環境變量指定目錄。
#!/usr/bin/env bash
# 檢查目標環境
# 檢查原始配置文件目錄是否存在
if [ ! -d "$AUTOZI_CONFIG_TMP_PATH"  ] || [ ! -d "$AUTOZI_CONFIG_TMP_PATH/app"  ] ; then
    echo '配置文件不存在,將不處理任何配置';
fi
# 檢查目標配置文件目錄是否存在,不存在的話則創建目錄
if [ ! -d "$AUTOZI_CONFIG_PATH" ]; then
    mkdir -pv ${AUTOZI_CONFIG_PATH};
fi
# 拷貝配置文件到指定目錄
\cp -rv ${AUTOZI_CONFIG_TMP_PATH}/app/* ${AUTOZI_CONFIG_PATH}/
echo "完成APP配置文件處理。應用配置文件:$AUTOZI_CONFIG_TMP_PATH/app,目標路徑:$AUTOZI_CONFIG_PATH";

擴展腳本

通用啓動腳本 entrypoint.sh

#!/usr/bin/env bash
# 遇到任意命令返回非0則推出腳本
set -e
# 獲取腳本所在的路徑
bash_dir=$(cd `dirname $0`; pwd)
echo "啓動腳本所在路徑:$bash_dir";
# 設置默認參數
# 配置文件存儲路徑
export DEFAULT_AUTOZI_CONFIG_TMP_PATH='/tmp/config';
# 默認的配置文件路徑,公共配置
export DEFAULT_AUTOZI_CONFIG_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/classes';
# 處理公共配置文件
# 檢查目標環境
if [ -z "$AUTOZI_CONFIG_TMP_PATH" ]; then
    export AUTOZI_CONFIG_TMP_PATH="$DEFAULT_AUTOZI_CONFIG_TMP_PATH";
fi
if [ -z "$AUTOZI_CONFIG_PATH" ]; then
    export AUTOZI_CONFIG_PATH="$DEFAULT_AUTOZI_CONFIG_PATH";
fi
echo "完成公共配置參數處理。AUTOZI_CONFIG_TMP_PACH:$AUTOZI_CONFIG_TMP_PATH ; AUTOZI_CONF_PATH:$AUTOZI_CONFIG_PATH";
# 更新全部配置文件
. ${bash_dir}/Get_Configuration.sh
# 處理App配置
. ${bash_dir}/App_Configuration.sh
# 處理Jar包配置文件
. ${bash_dir}/Jar_Reconfigure.sh
# 處理Tomcat配置
. ${bash_dir}/Tomcat_Configuration.sh
# 處理各環境獨立腳本
. ${bash_dir}/Script_Configuration.sh

# 執行啓動命令
exec "$@"

處理Jar包內的配置文件 Jar_Reconfigure.sh

#!/usr/bin/env bash
# 默認的lib依賴路徑
export DEFAULT_APP_LIB_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/lib';
# 檢查原始配置文件目錄是否存在
# 檢查依賴資源目錄
if [ -z "$APP_LIB_PATH" ]; then
    export APP_LIB_PATH="$DEFAULT_APP_LIB_PATH";
fi
Reconfigure(){
    # 查找Service包
    export JAR_FILE=$(find ${APP_LIB_PATH} -iregex ${JAR_TARGET_REGEX} | xargs ls -ltr | awk {'print $9'} | tail -1);
    echo "找到Service包,路徑爲:$JAR_FILE";
    # 跳轉到配置文件目錄
    cd ${AUTOZI_CONFIG_TMP_PATH}/${JAR_CONF_PATH};
    # 重新Service配置
    jar -uvf ${JAR_FILE} ./*;
    echo "完成Jar: $JAR_CONF_PATH 配置文件處理。應用配置文件:$AUTOZI_CONFIG_TMP_PATH/$JAR_CONF_PATH,目標路徑:$AUTOZI_CLASS_PATH" 
}
# 處理Commons-Memcached的配置
export JAR_CONF_PATH='service-interface';
export JAR_TARGET_REGEX='.*/lzfinance-bt-service-interface-.*.jar';
Reconfigure;
# 處理Commons-Memcached的配置
export JAR_CONF_PATH='service-interface';
export JAR_TARGET_REGEX='.*/lzfinance-bt-service-interface-.*.jar';
Reconfigure;
.............

執行相關啓動腳本,並打印所執行命令 Script_Configuration.sh

需要執行的腳本可以通過注入環境變量AUTOZI_SCRIPT_FILE來啓動,腳本名稱使用都好分割,如AUTOZI_SCRIPT_FILE=link.sh,del.sh,mv.sh,nfs.sh
#!/usr/bin/env bash
# 默認執行的腳本
export DEFAULT_AUTOZI_SCRIPT_FILE=('links');
# 檢查腳本是否存在
if [ ! -d "$AUTOZI_CONFIG_TMP_PATH"  ] || [ ! -d "$AUTOZI_CONFIG_TMP_PATH/script"  ] ; then
    echo '配置腳本不存在,將不處理任何腳本!'
fi
# 檢查初始化腳本的環境變量
if [ -z "$AUTOZI_SCRIPT_FILE" ]; then
    AUTOZI_SCRIPT_FILE=${DEFAULT_AUTOZI_SCRIPT_FILE[@]}
else
    # 從環境變量獲取需要執行的腳本
    OLD_IFS="$IFS" 
    IFS="," 
    AUTOZI_SCRIPT_FILE=(${AUTOZI_SCRIPT_FILE})
    IFS="$OLD_IFS" 
fi
# 再次確認腳本
if [ ! ${AUTOZI_SCRIPT_FILE} ]; then
    AUTOZI_SCRIPT_FILE=()
fi
set -x
# 載入軟件環境變量配置
for script in ${AUTOZI_SCRIPT_FILE[@]};do
    if [ -f "$AUTOZI_CONFIG_TMP_PATH/script/$script.sh" ]; then
        source "$AUTOZI_CONFIG_TMP_PATH/script/$script.sh" 
    else
        echo "文件$AUTOZI_CONFIG_TMP_PATH/script/$script.sh不存在,不進行載入。" 
    fi
done
set +x

啓動後阻塞進程退出 sleep.sh

#!/usr/bin/env bash
# 遇到任意命令返回非0則推出腳本
set -e
echo '完成文件處理,啓動bash阻塞容器';
# 使用死循環,阻止容器退出
while true;
do
    sleep 24h;
done

啓動時處理Tomcat端口 Tomcat_Configuration.sh

#!/usr/bin/env bash
# Tomcat端口配置
export DEFAULT_TOMCAT_HTTP_PORT='8080';
export DEFAULT_TOMCAT_AJP_PORT='8009';
export DEFAULT_TOMCAT_SERVER_PORT='8005';
# 檢查目標環境
if [ -z "$TOMCAT_HTTP_PORT" ]; then
    export TOMCAT_HTTP_PORT="$DEFAULT_TOMCAT_HTTP_PORT";
fi
if [ -z "$TOMCAT_AJP_PORT" ]; then
    export TOMCAT_AJP_PORT="$DEFAULT_TOMCAT_AJP_PORT";
fi
if [ -z "$TOMCAT_SERVER_PORT" ]; then
    export TOMCAT_SERVER_PORT="$DEFAULT_TOMCAT_SERVER_PORT";
fi
# 打印並重寫配置
sed -n "s/Connector port=\"8080\"/Connector port=\"$TOMCAT_HTTP_PORT\"/"p /usr/local/tomcat/conf/server.xml
sed -i "s/Connector port=\"8080\"/Connector port=\"$TOMCAT_HTTP_PORT\"/" /usr/local/tomcat/conf/server.xml
sed -n "s/Connector port=\"8009\"/Connector port=\"$TOMCAT_AJP_PORT\"/"p /usr/local/tomcat/conf/server.xml
sed -i "s/Connector port=\"8009\"/Connector port=\"$TOMCAT_AJP_PORT\"/" /usr/local/tomcat/conf/server.xml
sed -n "s/Server port=\"8005\"/Server port=\"$TOMCAT_SERVER_PORT\"/"p /usr/local/tomcat/conf/server.xml
sed -i "s/Server port=\"8005\"/Server port=\"$TOMCAT_SERVER_PORT\"/" /usr/local/tomcat/conf/server.xml
echo "即將啓動Tomcat,並使用端口HTTP:$TOMCAT_HTTP_PORT,AJP:$TOMCAT_AJP_PORT,Server:$TOMCAT_SERVER_PORT";

啓動時解壓jar包指定文件到項目,優先加載從而解決加載順序問題 Jar_Uncompress.sh

#!/usr/bin/env bash
# 默認的類文件文件路徑
export DEFAULT_AUTOZI_CLASS_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/classes';
# 默認的lib依賴路徑
export DEFAULT_APP_LIB_PATH='/usr/local/tomcat/webapps/ROOT/WEB-INF/lib';
# 檢查需要解壓的資源目錄
if [ -z "$APP_LIB_PATH" ]; then
    export APP_LIB_PATH="$DEFAULT_APP_LIB_PATH";
fi
# 檢查解壓所需要的文件
if [ -z "$AUTOZI_CLASS_PATH" ]; then
    export AUTOZI_CLASS_PATH="$DEFAULT_AUTOZI_CLASS_PATH";
fi
# 檢查解壓所需要的文件
if [ -z "$JAR_UNCOMPRESS_REGEX" ]; then
    export JAR_UNCOMPRESS_REGEX='./*';
fi
# 解壓Jar文件
Uncompress(){
    # 查找Service包
    export JAR_FILE=$(find ${APP_LIB_PATH} -iregex ${SERVICE_TARGET_REGEX} | xargs ls -ltr | awk {'print $9'} | tail -1);
    echo "找到需要解壓的Jar包,路徑爲:$JAR_FILE";
    # 解壓相關Service
    # 創建臨時目錄
    mkdir -pv /tmp/uncompress && cd /tmp/uncompress;
    # 解壓並拷貝文件
    jar -xvf ${JAR_FILE};
    \cp -rv ${JAR_UNCOMPRESS_REGEX} ${AUTOZI_CLASS_PATH};
    # 清理文件
    cd /tmp && rm -rf /tmp/uncompress;
    echo "完成jar: $JAR_FILE 解壓處理。處理文件: $JAR_UNCOMPRESS_REGEX,目標路徑:$AUTOZI_CLASS_PATH";
}
# 處理文件配置
export JAR_TARGET_REGEX='.*/autozi-common-core-.*.jar';
export JAR_UNCOMPRESS_REGEX='./org';
Uncompress;
# 處理文件配置
export JAR_TARGET_REGEX='.*/autozi-common-core-.*.jar';
export JAR_UNCOMPRESS_REGEX='./org';
Uncompress;
.........
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章