如何建设彩票私人网站,工信部icp备案管理系统,农产品大宗交易平台,网站开发工程师php岗位职责文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时#xff0c;需要首先从注册中心设置为下线#xff0c;避免该服务的消费者继续请求该服务实例#xff0c;导致请求失败如果我们在服务实例从注册中心取消注册后#xff… 文章目录 场景解决下线请求效果如图贴一个可用的部署脚本 场景 在 Spring Cloud 项目的微服务实例关闭时需要首先从注册中心设置为下线避免该服务的消费者继续请求该服务实例导致请求失败如果我们在服务实例从注册中心取消注册后立即销毁其它 Spring Bean 的话会导致当前在处理的请求又或者服务消费者因为注册中心延迟期间继续打进来的请求产生处理失败的情况在 Spring 容器关闭时Spring Cloud 内置的 AbstractAutoServiceRegistration 会将当前实例从注册中心取消注册但是并不能保证这个步骤最先执行在所有 Bean 的销毁之前。同时虽然当前服务实例已经从注册中心取消注册但是服务消费者从注册中心中拉取到最新的注册信息是存在延迟的只是长短的差别。 解决 通过actuator/service-registry/ 接口完成接口下线sleep 30秒之后 再进行微服务jar包的启停进行健康检查 下线请求效果如图 贴一个可用的部署脚本
#!/bin/bash
set -e# 基础
# export JAVA_HOME/work/programs/jdk/jdk1.8.0_181
# export PATHPATH$PATH:$JAVA_HOME/bin
# export CLASSPATH$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE$(date %Y%m%d%H%M)
# 基础路径
BASE_PATH/home/vagrant/data/workProjects/JenkinsSpringCloudDemo
# 编译后 jar 的地址。部署时Jenkins 会上传 jar 包到该目录下
SOURCE_PATH$BASE_PATH/build
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAMEJenkinsSpringCloudDemo
# 环境
PROFILES_ACTIVEprod
# 健康检查 URL
HEALTH_CHECK_URLhttp://127.0.0.1:8078/actuator/health/
# 修改状态 URL
STATUS_URLhttp://127.0.0.1:8078/actuator/service-registry/# heapError 存放路径
HEAP_ERROR_PATH$BASE_PATH/heapError
# JVM 参数
JAVA_OPS-Xms1024m -Xmx1024m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath$HEAP_ERROR_PATH
# JavaAgent 参数。可用于配置 SkyWalking 等链路追踪
JAVA_AGENT# 备份
function backup() {# 如果不存在则无需备份if [ ! -f $BASE_PATH/$SERVER_NAME.jar ]; thenecho [backup] $BASE_PATH/$SERVER_NAME.jar 不存在跳过备份# 如果存在则备份到 backup 目录下使用时间作为后缀elseecho [backup] 开始备份 $SERVER_NAME ...cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jarecho [backup] 备份 $SERVER_NAME 完成fi
}# 最新构建代码 移动到项目环境
function transfer() {echo [transfer] 开始转移 $SERVER_NAME.jar# 删除原 jar 包if [ ! -f $BASE_PATH/$SERVER_NAME.jar ]; thenecho [transfer] $BASE_PATH/$SERVER_NAME.jar 不存在跳过删除elseecho [transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成rm $BASE_PATH/$SERVER_NAME.jarfi# 复制新 jar 包echo [transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ....cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATHecho [transfer] 转移 $SERVER_NAME.jar 完成
}# 停止
function stop() {echo [stop] 开始停止 $BASE_PATH/$SERVER_NAMEPID$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v grep | awk {print $2})# 如果 Java 服务启动中则进行关闭if [ -n $PID ]; then# 从注册中心下线echo [stop] 从注册中心下线当前实例并 sleep 20 秒curl -X POST $STATUS_URL -d {status: DOWN} -H content-type: application/jsonsleep 20# 正常关闭echo [stop] $BASE_PATH/$SERVER_NAME 运行中开始 kill [$PID]kill -15 $PID# 等待最大 60 秒直到关闭完成。for ((i 0; i 60; i))dosleep 1PID$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v grep | awk {print $2})if [ -n $PID ]; thenecho -e .\celseecho [stop] 停止 $BASE_PATH/$SERVER_NAME 成功breakfidone# 如果正常关闭失败那么进行强制 kill -9 进行关闭if [ -n $PID ]; thenecho [stop] $BASE_PATH/$SERVER_NAME 失败强制 kill -9 $PIDkill -9 $PIDfi# 如果 Java 服务未启动则无需关闭elseecho [stop] $BASE_PATH/$SERVER_NAME 未启动无需停止fi
}# 启动
function start() {# 开启启动前打印启动参数echo [start] 开始启动 $BASE_PATH/$SERVER_NAMEecho [start] JAVA_OPS: $JAVA_OPSecho [start] JAVA_AGENT: $JAVA_AGENTecho [start] PROFILES: $PROFILES_ACTIVE# 开始启动BUILD_IDdontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active$PROFILES_ACTIVE echo [start] 启动 $BASE_PATH/$SERVER_NAME 完成
}# 健康检查
function healthCheck() {# 如果配置健康检查则进行健康检查if [ -n $HEALTH_CHECK_URL ]; then# 健康检查最大 60 秒直到健康检查通过echo [healthCheck] 开始通过 $HEALTH_CHECK_URL 地址进行健康检查;for ((i 0; i 60; i))do# 请求健康检查地址只获取状态码。resultcurl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo 000# 如果状态码为 200则说明健康检查通过if [ $result 200 ]; thenecho [healthCheck] 健康检查通过;break# 如果状态码非 200则说明未通过。sleep 1 秒后继续重试elseecho -e .\csleep 1fidone# 健康检查未通过则异常退出 shell 脚本不继续部署。if [ ! $result 200 ]; thenecho [healthCheck] 健康检查不通过可能部署失败。查看日志自行判断是否启动成功;tail -n 10 nohup.outexit 1;# 健康检查通过打印最后 10 行日志可能部署的人想看下日志。elsetail -n 10 nohup.outfi# 如果未配置健康检查则 slepp 60 秒人工看日志是否部署成功。elseecho [healthCheck] HEALTH_CHECK_URL 未配置开始 sleep 60 秒;sleep 60echo [healthCheck] sleep 60 秒完成查看日志自行判断是否启动成功;tail -n 50 nohup.outfi
}# 部署
function deploy() {cd $BASE_PATH# 备份原 jarbackup# 停止 Java 服务stop# 部署新 jartransfer# 启动 Java 服务start# 健康检查healthCheck
}deploy