zoukankan      html  css  js  c++  java
  • CentOS7-部署测试Apollo

    linux部署apollo环境要求:jdk1.8、mysql5.7

    centos7安装jdk1.8跟mysql5.7可以参考我这两篇文章

    https://www.cnblogs.com/reasonzzy/p/11149530.html

    https://www.cnblogs.com/reasonzzy/p/11150131.html

    从github上将源码down下来

    https://github.com/ctripcorp/apollo.git

    这两个是打包脚本,都可以执行,sh脚本可以用git bash面板执行,

    执行前可以修改eureka注册ip跟数据库账号密码参数,如果是本地,

    可不做修改,打包方式有两种,一种是quick start方式,另一种是打成三个压缩包形式

    quick start方式参考如下文档:

    https://github.com/ctripcorp/apollo/wiki/Quick-Start

    源码地址:

    https://github.com/nobodyiam/apollo-build-scripts.git

    主要步骤

    修改apollo-configservice, apollo-adminservice和apollo-portal的pom.xml,注释掉spring-boot-maven-plugin和maven-assembly-plugin

    在根目录下执行mvn clean package -pl apollo-assembly -am -DskipTests=true

    复制apollo-assembly/target下的jar包,rename为apollo-all-in-one.jar

    第二种方式压缩包github上面也有现成的,如果不需要调整源码,直接从github上下载

    https://github.com/ctripcorp/apollo/releases 

     数据库脚本在source code.zip这个压缩包里面,源代码scripts/db/migration文件夹里面的sql文件也可以

    压缩包下载好之后,只需要修改下配置文件即可

    #!/bin/bash
    
    # apollo config db info
    apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
    apollo_config_db_username=root
    apollo_config_db_password=
    
    # apollo portal db info
    apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
    apollo_portal_db_username=root
    apollo_portal_db_password=
    
    # =============== Please do not modify the following content =============== #
    
    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
    
    # meta server url
    config_server_url=http://localhost:8080
    admin_server_url=http://localhost:8090
    eureka_service_url=$config_server_url/eureka/
    portal_url=http://localhost:8070
    
    # JAVA OPTS
    BASE_JAVA_OPTS="-Denv=dev"
    CLIENT_JAVA_OPTS="$BASE_JAVA_OPTS -Dapollo.meta=$config_server_url"
    SERVER_JAVA_OPTS="$BASE_JAVA_OPTS -Dspring.profiles.active=github -Deureka.service.url=$eureka_service_url"
    PORTAL_JAVA_OPTS="$BASE_JAVA_OPTS -Ddev_meta=$config_server_url -Dspring.profiles.active=github,auth -Deureka.client.enabled=false -Dhibernate.query.plan_cache_max_size=192"
    
    # executable
    JAR_FILE=apollo-all-in-one.jar
    SERVICE_DIR=./service
    SERVICE_JAR_NAME=apollo-service.jar
    SERVICE_JAR=$SERVICE_DIR/$SERVICE_JAR_NAME
    SERVICE_LOG=$SERVICE_DIR/apollo-service.log
    PORTAL_DIR=./portal
    PORTAL_JAR_NAME=apollo-portal.jar
    PORTAL_JAR=$PORTAL_DIR/$PORTAL_JAR_NAME
    PORTAL_LOG=$PORTAL_DIR/apollo-portal.log
    CLIENT_DIR=./client
    CLIENT_JAR=$CLIENT_DIR/apollo-demo.jar
    
    # go to script directory
    cd "${0%/*}"
    
    function checkJava {
      if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
          if [ "$windows" == "1" ]; 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
          _java="$JAVA_HOME/bin/java"
      elif type -p java > /dev/null; then
        _java=java
      else
          echo "Could not find java executable, please check PATH and JAVA_HOME variables."
          exit 1
      fi
    
      if [[ "$_java" ]]; then
          version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
          if [[ "$version" < "1.8" ]]; then
              echo "Java version is $version, please make sure java 1.8+ is in the path"
              exit 1
          fi
      fi
    }
    
    function checkServerAlive {
      declare -i counter=0
      declare -i max_counter=24 # 24*5=120s
      declare -i total_time=0
    
      SERVER_URL="$1"
    
      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
      done
    
      total_time=counter*5
    
      if [[ (( counter -ge max_counter )) ]];
      then
        return $total_time
      fi
    
      return 0
    }
    
    checkJava
    
    if [ "$1" = "start" ] ; then
      echo "==== starting service ===="
      echo "Service logging file is $SERVICE_LOG"
      export JAVA_OPTS="$SERVER_JAVA_OPTS -Dlogging.file=./apollo-service.log -Dspring.datasource.url=$apollo_config_db_url -Dspring.datasource.username=$apollo_config_db_username -Dspring.datasource.password=$apollo_config_db_password"
    
      if [[ -f $SERVICE_JAR ]]; then
        rm -rf $SERVICE_JAR
      fi
    
      ln $JAR_FILE $SERVICE_JAR
      chmod a+x $SERVICE_JAR
    
      $SERVICE_JAR start --configservice --adminservice
    
      rc=$?
      if [[ $rc != 0 ]];
      then
        echo "Failed to start service, return code: $rc. Please check $SERVICE_LOG for more information."
        exit $rc;
      fi
    
      printf "Waiting for config service startup"
      checkServerAlive $config_server_url
    
      rc=$?
      if [[ $rc != 0 ]];
      then
        printf "
    Config service failed to start in $rc seconds! Please check $SERVICE_LOG for more information.
    "
        exit 1;
      fi
    
      printf "
    Config service started. You may visit $config_server_url for service status now!
    "
    
      printf "Waiting for admin service startup"
      checkServerAlive $admin_server_url
    
      rc=$?
      if [[ $rc != 0 ]];
      then
        printf "
    Admin service failed to start in $rc seconds! Please check $SERVICE_LOG for more information.
    "
        exit 1;
      fi
    
      printf "
    Admin service started
    "
    
      echo "==== starting portal ===="
      echo "Portal logging file is $PORTAL_LOG"
      export JAVA_OPTS="$PORTAL_JAVA_OPTS -Dlogging.file=./apollo-portal.log -Dserver.port=8070 -Dspring.datasource.url=$apollo_portal_db_url -Dspring.datasource.username=$apollo_portal_db_username -Dspring.datasource.password=$apollo_portal_db_password"
    
      if [[ -f $PORTAL_JAR ]]; then
        rm -rf $PORTAL_JAR
      fi
    
      ln $JAR_FILE $PORTAL_JAR
      chmod a+x $PORTAL_JAR
    
      $PORTAL_JAR start --portal
    
      rc=$?
      if [[ $rc != 0 ]];
      then
        echo "Failed to start portal, return code: $rc. Please check $PORTAL_LOG for more information."
        exit $rc;
      fi
    
      printf "Waiting for portal startup"
      checkServerAlive $portal_url
    
      rc=$?
      if [[ $rc != 0 ]];
      then
        printf "
    Portal failed to start in $rc seconds! Please check $PORTAL_LOG for more information.
    "
        exit 1;
      fi
    
      printf "
    Portal started. You can visit $portal_url now!
    "
    
      exit 0;
    elif [ "$1" = "client" ] ; then
      if [ "$windows" == "1" ]; then
        java -classpath "$CLIENT_DIR;$CLIENT_JAR" $CLIENT_JAVA_OPTS com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
      else
        java -classpath $CLIENT_DIR:$CLIENT_JAR $CLIENT_JAVA_OPTS com.ctrip.framework.apollo.demo.api.SimpleApolloConfigDemo
      fi
    
    elif [ "$1" = "stop" ] ; then
      echo "==== stopping portal ===="
      cd $PORTAL_DIR
      ./$PORTAL_JAR_NAME stop
    
      cd ..
    
      echo "==== stopping service ===="
      cd $SERVICE_DIR
      ./$SERVICE_JAR_NAME stop
    
    else
      echo "Usage: demo.sh ( commands ... )"
      echo "commands:"
      echo "  start         start services and portal"
      echo "  client        start client demo program"
      echo "  stop          stop services and portal"
      exit 1
    fi
    View Code

    quick start方式修改下demo.sh这个文件,将localhost改成对应的ip,还有数据库账号密码。

    第二种方式,如果是部署在linux系统上,有且只有一个网卡的情况,只需要修改下数据库配置文件,

    如果是用的virtualbox安装的centos7系统,并且有两个网卡的情况,类似于云主机,同样适用我下面

    这种方法,详情请参考官方文档分布式部署指南:

    https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97

     1.4节网络策略

    在启动脚本里面强制指定eureka注册的ip

    -Deureka.instance.ip-address=${指定的IP}

    官方文档写是写得很详细,但是对于我这种小白来说,一脸懵逼,

    我当时看到这里,一脸黑人问号,这行代码加在哪,后来群里各种

    寻求帮助,终于有大神告诉我了,详细操作看代码,

    修改apollo-adminservice或apollo-configservice的startup.sh

    #!/bin/bash
    SERVICE_NAME=apollo-configservice
    ## Adjust log dir if necessary
    LOG_DIR=/opt/logs/100003171
    ## Adjust server port if necessary
    #SERVER_PORT=8080
    SERVER_PORT=${SERVER_PORT:=8080}
    
    ## Create log directory if not existed because JDK 8+ won't do that
    mkdir -p $LOG_DIR
    
    ## Adjust memory settings if necessary
    #export JAVA_OPTS="-Xms6144m -Xmx6144m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8"
    
    ## Only uncomment the following when you are using server jvm
    #export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"
    
    ########### The following is the same for configservice, adminservice, portal ###########
    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 -Deureka.instance.ip-address=${指定的IP}"
    # DataSource URL USERNAME PASSWORD
    if [ "$DS_URL"x != x ]
    then
        export JAVA_OPTS="$JAVA_OPTS -Dspring.datasource.url=$DS_URL -Dspring.datasource.username=$DS_USERNAME -Dspring.datasource.password=$DS_PASSWORD"
    fi
    export JAVA_OPTS="$JAVA_OPTS -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"
    
    PATH_TO_JAR=$SERVICE_NAME".jar"
    SERVER_URL="http://localhost:$SERVER_PORT"
    
    function checkPidAlive {
        for i in `ls -t $SERVICE_NAME*.pid 2>/dev/null`
        do
            read pid < $i
    
            result=$(ps -p "$pid")
            if [ "$?" -eq 0 ]; then
                return 0
            else
                printf "
    pid - $pid just quit unexpectedly, please check logs under $LOG_DIR and /tmp for more information!
    "
                exit 1;
            fi
        done
    
        printf "
    No pid file found, startup may failed. Please check logs under $LOG_DIR and /tmp for more information!
    "
        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
    
    if [[ -f $SERVICE_NAME".jar" ]]; then
      rm -rf $SERVICE_NAME".jar"
    fi
    
    printf "$(date) ==== Starting ==== 
    "
    
    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 "
    $(date) Server failed to start in $total_time seconds!
    "
        exit 1;
    fi
    
    printf "
    $(date) Server started in $total_time seconds!
    "
    
    exit 0;
    View Code

    修改apollo-portal里面的apollo-env.properties文件

    dev.meta=http://{内网ip}:{端口}

    修改完之后,依次执行apollo-configservice、apollo-adminservice、apollo-portal

    如果报错请查看日志,日志在opt/logs/目录下

     如果是本地开发做测试的话,需要引入maven依赖

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

    创建配置文件application.properties

    app.id=SimpleAapp
    apollo.meta=http://192.168.56.6:8080

     

    启动类加上@EnableApolloConfig注解

    app.id对应如图的AppId

     

    如果启动项目报错说不能注册未知的服务,拒绝连接eureka,

    可以强制指定下IDEA或者Eclipse的启动参数

    -Dapollo.configService=http://config-service的公网IP:端口

    至此,部署算完成了,如有不懂,请详细阅读下官方文档。

  • 相关阅读:
    testing
    mysql的collation
    使用elk+redis搭建nginx日志分析平台
    安装logstash,elasticsearch,kibana三件套
    技术晨读_2014_12_22
    laravel中的错误与日志
    maven仓库--私服(Nexus的配置使用)
    Youtube的论文《Deep Neural Networks for YouTube Recommendations》
    2018中国区块链应用生态发展报告
    阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量
  • 原文地址:https://www.cnblogs.com/reasonzzy/p/11242865.html
Copyright © 2011-2022 走看看