技术栈
Java 版本: 17
Spring Boot 版本: 3.x
MyBatis-Plus: 简化 MyBatis 操作的增强工具
PostgreSQL: 关系型数据库
Redis: 分布式缓存解决方案
RabbitMQ: 消息队列
现状
在jenkins打包项目重启的时候,此时请求会出现502的错误,影响使用
扩容,缩容,健康检测等很难实现
自动化滚动升级很难实现
改造
使用容器部署
使用docker-swarm作为容器管理调度工具,使用portainer可视化工具管理容器
改造步骤
1. 安装docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum -y install docker-ce sudo systemctl start docker
2. docker-swarm 集群构建
2.1 构建
构建后,会输出令牌token,当前节点为管理主节点,其他节点想要加入需要使用
docker swarm init
2.2 查看令牌
docker swarm join-token manager docker swarm join-token worker
2.3 加入集群
docker swarm join --token SWMTKN-1-2kqe46td148u22yale6e6mqfd1w2jvtt51frny4r399fskko5m-ct1ixb6627voy3niwjl227d3y 172.29.214.124:2377
2.4 查看节点
docker node ls
3. 网络搭建
在 Swarm 中创建一个 Overlay 网络,使各个服务能够跨节点通信:
docker network create -d overlay nhis-service-network
4. 创建docker镜像
4.1 编写dockerfile
FROM openjdk:17-jdk-slim LABEL authors="boht" WORKDIR /app RUN mkdir -p /app/logs RUN mkdir -p /app/config COPY ./nhis-service.jar /app/nhis-service.jar ENTRYPOINT ["java", "-jar", "-Xmx1024M", "-Xms256M", "/app/nhis-service.jar"]
4.2 构建镜像
docker build -t myregistry.com/nhis-service:latest .
4.3 推送镜像到私有仓库 (非必须)
如果是单机器的话,只需要在本地就可以,给每个镜像一个唯一的tag
docker push myregistry.com/nhis-service:latest
5. 配置docker compose
创建docker-compose.yml
version: '3.8' services: springboot-app: image: nhis-service deploy: replicas: 2 # 部署容器数量 update_config: parallelism: 1 # 每次更新一个容器 delay: 5s # 每个容器更新间隔10秒 order: start-first # 滚动升级时先把新容器启动后,再干掉旧容器 restart_policy: condition: on-failure # 健康检测相关 healthcheck: # 需要提供一个健康检测接口,只需要httpcode返回200即可 test: curl -f http://localhost:12555/nhapi/healthcheck/ping || exit 0 interval: 10s # 失败后延迟多久重试 timeout: 3s # 一次请求等待时间 retries: 3 # 重试次数,超过后容器标识为unhealthy ports: - "12555:12555" volumes: - ./logs:/app/logs - ./config:/app/config networks: - nhis-service-network networks: nhis-service-network: external: true
6. 部署Docker Stack
6.1 部署Stack
在主节点上,执行
docker stack deploy -c docker-compose.yml nhis-service-stack
6.2 检查服务状态
docker service ls
7. 滚动升级
执行后,会按照docker-compose.yml里面指定的规则滚动升级,不会中断服务
docker service update --image nhis-service:$VERSION nhis-service-stack_springboot-app
8. 常用命令
大部分可以直接在portainer操作
8.1 查看服务日志
docker service logs nhis-service-stack_springboot-app
8.2 扩展或缩减副本数
docker service scale nhis-service-stack_springboot-app=5 # 将副本数调整为 5
8.3 删除 Stack
如需删除 Stack,运行:
docker stack rm nhis-service-stack
8.4 清理操作
清除未使用image Docker images purne docker container prune
9. jenkins部署脚本示例
#!/bin/bash APP_NAME="nhis-service" DEPLOY_DIR="/home/zrapi/nhis-service" GIT_COMMIT_HASH="$GIT_COMMIT" VERSION="${GIT_COMMIT_HASH}" cd $DEPLOY_DIR echo "deploy gitCommitHash: $GIT_COMMIT_HASH" echo "docker build..." docker build -t "$APP_NAME:$VERSION" . echo "docer-swarm deploy..." rm nhis-service.jar docker service update --image nhis-service:$VERSION nhis-service-stack_springboot-app