本文目录导读:

我来详细介绍Java滚动发布的实操案例,从基础概念到具体实现步骤。
滚动发布基本概念
滚动发布(Rolling Update)是指逐步替换旧版本应用实例,新版本实例逐渐增加,直到全部完成更新的部署策略。
实操案例:Spring Boot微服务滚动发布
环境准备
# 项目结构 my-app/ ├── Dockerfile ├── kubernetes/ │ ├── deployment.yaml │ ├── service.yaml │ └── rolling-update.sh ├── src/ │ └── main/ │ └── java/ │ └── com/example/demo/ └── pom.xml
Dockerfile配置
FROM openjdk:11-jre-slim COPY target/demo-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]
Kubernetes部署配置
deployment.yaml - 包含滚动更新策略
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3
# 滚动更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最大额外实例数
maxUnavailable: 0 # 最大不可用实例数
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-registry/my-app:v1.0.0 # 初始版本
ports:
- containerPort: 8080
# 健康检查
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 20
periodSeconds: 5
# 资源限制
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
滚动发布执行步骤
步骤1:构建新版本
# 修改代码后构建新版本 mvn clean package -DskipTests # 构建Docker镜像 docker build -t my-registry/my-app:v2.0.0 . # 推送镜像到仓库 docker push my-registry/my-app:v2.0.0
步骤2:执行滚动更新
# 方法1:直接更新镜像版本 kubectl set image deployment/my-app my-app=my-registry/my-app:v2.0.0 # 方法2:更新配置文件后apply kubectl apply -f deployment.yaml
步骤3:监控更新过程
# 查看更新状态 kubectl rollout status deployment/my-app # 实时监控Pod变化 kubectl get pods -w # 查看详细更新信息 kubectl rollout history deployment/my-app
滚动发布shell脚本
rolling-update.sh
#!/bin/bash
# 配置变量
APP_NAME="my-app"
NAMESPACE="default"
NEW_VERSION=$1
REGISTRY="my-registry"
if [ -z "$NEW_VERSION" ]; then
echo "Usage: ./rolling-update.sh <new-version>"
exit 1
fi
echo "Starting rolling update for $APP_NAME to version $NEW_VERSION"
# 1. 构建新版本
echo "Building new version..."
mvn clean package -DskipTests
docker build -t $REGISTRY/$APP_NAME:$NEW_VERSION .
docker push $REGISTRY/$APP_NAME:$NEW_VERSION
# 2. 执行滚动更新
echo "Performing rolling update..."
kubectl set image deployment/$APP_NAME $APP_NAME=$REGISTRY/$APP_NAME:$NEW_VERSION -n $NAMESPACE
# 3. 监控更新进度
echo "Monitoring update progress..."
while true; do
STATUS=$(kubectl rollout status deployment/$APP_NAME -n $NAMESPACE 2>&1)
echo $STATUS
if echo "$STATUS" | grep -q "successfully rolled out"; then
echo "Rolling update completed successfully!"
break
fi
sleep 5
done
# 4. 验证更新
echo "Verifying update..."
kubectl get pods -n $NAMESPACE -l app=$APP_NAME -o wide
Java代码层面的健康检查
Application配置
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
自定义健康检查
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 检查应用状态
boolean isHealthy = checkApplicationHealth();
if (isHealthy) {
return Health.up()
.withDetail("service", "running")
.build();
}
return Health.down()
.withDetail("service", "degraded")
.build();
}
private boolean checkApplicationHealth() {
// 实现具体的健康检查逻辑
return true;
}
}
滚动发布控制与回滚
更新暂停/恢复
# 暂停更新 kubectl rollout pause deployment/my-app # 恢复更新 kubectl rollout resume deployment/my-app
版本回滚
# 回滚到上一个版本 kubectl rollout undo deployment/my-app # 回滚到指定版本 kubectl rollout undo deployment/my-app --to-revision=2 # 查看版本历史 kubectl rollout history deployment/my-app
高级滚动发布策略
蓝绿部署式滚动更新
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 3 # 允许创建所有新实例
maxUnavailable: 3 # 先创建新版本,再删除旧版本
灰度发布(金丝雀发布)
# 先部署1个实例的新版本
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
监控与日志
查看Pod日志
# 实时查看日志 kubectl logs -f deployment/my-app # 查看特定Pod日志 kubectl logs pod/my-app-xxx-yyy
应用监控配置
@Configuration
public class MonitoringConfig {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("application", "my-app");
}
}
最佳实践
滚动更新前注意事项
# 检查当前部署状态 kubectl describe deployment my-app # 确保有足够的集群资源 kubectl describe nodes | grep -A 5 "Capacity" # 备份当前配置 kubectl get deployment my-app -o yaml > deployment-backup.yaml
生产环境配置示例
spec:
# 分阶段滚动更新
strategy:
rollingUpdate:
maxSurge: 2 # 根据集群规模调整
maxUnavailable: 0 # 保证服务可用性
# 优雅关闭
terminationGracePeriodSeconds: 60
# 更新过程等待时间
minReadySeconds: 30
通过以上实操步骤,你可以实现Java应用的滚动发布:
- 配置Docker和Kubernetes:准备容器化和编排环境
- 部署应用:使用deployment配置滚动更新策略
- 执行更新:逐步替换实例,监控健康状态
- 回滚机制:快速恢复到稳定版本
- 监控验证:确保更新过程服务不中断
这种发布方式能最大限度地减少停机时间,实现零宕机部署。