Apollo入门使用手册

Apollo

一、介绍

Apollo是携程开源的配置中心,配置中心还有Alibaba的Nacos、Spring Config等。Apollo可以进行灰度发布、本地缓存配置、配置回滚、还能对用户进行权限划分等特点。

官方使用文档地址:www.apolloconfig.com

二、使用

官方案例

官方提供了快速启动的案例,首先就是下载官方提供的apollo-quick-start压缩包,解压后将里面的Sql脚本执行创建好Apollo需要的数据库,如果是Windows环境的小伙伴进入到demo.sh命令脚本所在的目录在空白处鼠标右键进入Git Bash Here窗口,然后执行启动命令./demo.sh start,等待启动成功后,我们就可以去浏览器访问localhost:8500,Apollo默认的用户名apollo,密码是admin。登录成功后就可以看到Apollo的配置页面了,我们可以在里面创建和项目对应的应用,APP-ID和我们项目中配置的APP-ID需要一致,否则的话会读取不到配置文件。停止官方案例的命令是 ./demo stop。

官方内置了eureka作为注册中心,如果需要更换注册中心的话,更加官方文档说明就是在script目录下的build.bat或者build.sh脚本中修改执行脚本语句,其实本质上就是将spring.profile.active切换成指定注册中心的配置文件,因为内置的eureka服务会根据eureka.client.enabled属性去决定是否启动eureka服务,而我们指定的配置中心的配置文件就是将eureka.client.enabled属性设置为false,让内置的eureka不启动。

如果不通过docker启动apollo的话,那我们有可能需要修改它原来的端口,原来Apollo的三个服务占用的是8070、8080、8090,而8080是比较重要的,一般普通服务都不占用它,所以我们需要对端口进行修改。

修改AdminService、ConfigService、Portal服务端口

修改文件端口,有的小伙伴可能认为说很简单,在配置文件里面改一下不就行了吗?其实不然,有个小坑,就是我们是通过官方提供的script脚本进行启动的,而这个脚本里面也有指定端口,所以光改项目中配置文件可不太行!

#!/bin/bash
SERVICE_NAME=apollo-adminservice
LOG_DIR=/opt/logs/100003172
SERVER_PORT=${SERVER_PORT:=8001}
mkdir -p $LOG_DIR
export JAVA_OPTS="$JAVA_OPTS -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
if [ "$DS_URL"x != x ]
then
    export SPRING_DATASOURCE_URL=$DS_URL
    export SPRING_DATASOURCE_USERNAME=$DS_USERNAME
    export SPRING_DATASOURCE_PASSWORD=$DS_PASSWORD
fi
export JAVA_OPTS="$JAVA_OPTS -Dserver.port=$SERVER_PORT -Dlogging.file.name=$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"
export APP_NAME=$SERVICE_NAME

PATH_TO_JAR=$SERVICE_NAME".jar"
SERVER_URL="http://localhost:$SERVER_PORT"

function checkPidAlive {
    for i in `ls -t $APP_NAME/$APP_NAME.pid 2>/dev/null`
    do
        read pid < $i

        result=$(ps -p "$pid")
        if [ "$?" -eq 0 ]; then
            return 0
        else
            printf "\npid - $pid just quit unexpectedly, please check logs under $LOG_DIR and /tmp for more information!\n"
            exit 1;
        fi
    done

    printf "\nNo pid file found, startup may failed. Please check logs under $LOG_DIR and /tmp for more information!\n"
    exit 1;
}

if [ "$(uname)" == "Darwin" ]; then
    windows="0"
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
    windows="0"
elif [ "$(expr substr $(uname -s) 1 5)" == "MINGW" ]; then
    windows="1"
else
    windows="0"
fi

# for Windows
if [ "$windows" == "1" ] && [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
    tmp_java_home=`cygpath -sw "$JAVA_HOME"`
    export JAVA_HOME=`cygpath -u $tmp_java_home`
    echo "Windows new JAVA_HOME is: $JAVA_HOME"
fi

# Find Java
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
    javaexe="$JAVA_HOME/bin/java"
elif type -p java > /dev/null 2>&1; then
    javaexe=$(type -p java)
elif [[ -x "/usr/bin/java" ]];  then
    javaexe="/usr/bin/java"
else
    echo "Unable to find Java"
    exit 1
fi

if [[ "$javaexe" ]]; then
    version=$("$javaexe" -version 2>&1 | awk -F '"' '/version/ {print $2}')
    version=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}')
    # now version is of format 009003 (9.3.x)
    if [ $version -ge 011000 ]; then
        JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
    elif [ $version -ge 010000 ]; then
        JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
    elif [ $version -ge 009000 ]; then
        JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:$LOG_DIR/gc.log:time,level,tags -Xlog:safepoint -Xlog:gc+heap=trace"
    else
        JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
        JAVA_OPTS="$JAVA_OPTS -Xloggc:$LOG_DIR/gc.log -XX:+PrintGCDetails"
        JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:+CMSClassUnloadingEnabled  -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=5M"
    fi
fi

cd `dirname $0`/..

for i in `ls $SERVICE_NAME-*.jar 2>/dev/null`
do
    if [[ ! $i == *"-sources.jar" ]]
    then
        PATH_TO_JAR=$i
        break
    fi
done

if [[ ! -f $PATH_TO_JAR && -d current ]]; then
    cd current
    for i in `ls $SERVICE_NAME-*.jar 2>/dev/null`
    do
        if [[ ! $i == *"-sources.jar" ]]
        then
            PATH_TO_JAR=$i
            break
        fi
    done
fi

# For Docker environment, start in foreground mode
if [[ -n "$APOLLO_RUN_MODE" ]] && [[ "$APOLLO_RUN_MODE" == "Docker" ]]; then
    exec $javaexe -Dsun.misc.URLClassPath.disableJarChecking=true $JAVA_OPTS -jar $PATH_TO_JAR
else
    if [[ -f $SERVICE_NAME".jar" ]]; then
      rm -rf $SERVICE_NAME".jar"
    fi

    printf "$(date) ==== Starting ==== \n"

    ln $PATH_TO_JAR $SERVICE_NAME".jar"
    chmod a+x $SERVICE_NAME".jar"
    ./$SERVICE_NAME".jar" start

    rc=$?;

    if [[ $rc != 0 ]];
    then
        echo "$(date) Failed to start $SERVICE_NAME.jar, return code: $rc"
        exit $rc;
    fi

    declare -i counter=0
    declare -i max_counter=48 # 48*5=240s
    declare -i total_time=0

    printf "Waiting for server startup"
    until [[ (( counter -ge max_counter )) || "$(curl -X GET --silent --connect-timeout 1 --max-time 2 --head $SERVER_URL | grep "HTTP")" != "" ]];
    do
        printf "."
        counter+=1
        sleep 5

        checkPidAlive
    done

    total_time=counter*5

    if [[ (( counter -ge max_counter )) ]];
    then
        printf "\n$(date) Server failed to start in $total_time seconds!\n"
        exit 1;
    fi

    printf "\n$(date) Server started in $total_time seconds!\n"

    exit 0;
fi
Docker启动Apollo

通过dokcer启动Apollo,首先是要先构建成镜像,然后再去启动,Dockerfile官方已经提供给我们了,但是在官方提供的Dockerfile中有个VERSION变量在执行Dockerfile时需要传递一下,或者直接在Dockerfile中写死(不太建议),除了Dockerfile启动,还可以通过docker-compose.yaml来启动(推荐),docker-compose.yaml的话官方文档有提供模板,但是不通用,需要自己进行编写,通过容器编排启动我们可以直接指定它们之间依赖关系,如果不指定的话,我们需要先启动configservice服务,再启动adminservice服务,最后才启动portal服务,而通过dokcer-compose.yaml来启动的话可以在文件里面直接指定依赖关系,在docker-compose.yaml文件中需要传递VERSION参数。

Dokcer网卡问题
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱敲代码_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值