四畳半神话大系

Spring Cloud 疑难杂症(5): docker swarm 环境下优雅更新服务

微服务更新如果使用 docker stop 来强制停止,会使线上服务发生短暂的服务不可用。
避免这个问题,让服务更新平滑过渡,需要在docker-compose 中设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.6'
services:
gateway-server:
# 手动修改镜像版本 gateway:0.1.0 -> gateway:0.1.1
image: gateway:0.1.1
container_name: sc-gateway
restart: always
deploy:
mode: replicated
replicas: 2
resources:
limits:
memory: 1g
cpus: "0.5"
restart_policy:
condition: on-failure
update_config:
parallelism: 1 # 每次更新几个分片
delay: 10s # 更新间隔
order: start-first # 更新顺序为新任务启动优先
volumes:
- /var/log:/var/log
ports:
- 9000:9000
env_file: .env.base
environment:
- SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
- SERVER_HOST_NAME=gateway-server
networks:
- docker_net-es

(docker swarm环境下) 替换之前的镜像版本,使用如下命令更新

1
docker stack deploy -c docker-compose.yml server-name

Dockerfile 文件中需要配置 curl,去请求服务内的接口。当接口请求成功时认定为服务启动成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM openjdk:8-jre-alpine
VOLUME /tmp
ADD article-service-1.0-SNAPSHOT.jar app.jar
# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \
echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories

# 安装需要的软件
RUN apk update && \
apk add --no-cache ca-certificates && \
apk add --no-cache curl bash && \
apk --no-cache add fontconfig ttf-dejavu
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV JAVA_OPTS="-Xmx512m -Xms256m"
ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap", "-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
EXPOSE 8016
# 健康检查
HEALTHCHECK --interval=3m --timeout=10s --start-period=3m --retries=3 CMD curl -f http://localhost:8016/actuator/health || exit 1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
00182aad8000 gateway:0.4.3 “java -XX:+UnlockExp…” 2 weeks ago Up 2 weeks (healthy) 9000/tcp
db2867d62000 deco-common-service:0.4.2 “java -XX:+UnlockExp…” 3 weeks ago Up 3 weeks (healthy) 8012/tcp
06dcb35ec000 admin-system-service:0.4.0 “java -XX:+UnlockExp…” 3 weeks ago Up 3 weeks (healthy) 8020/tcp
5ceed8db0000 deco-rendering-service:0.4.0 “java -XX:+UnlockExp…” 3 weeks ago Up 3 weeks (healthy) 8013/tcp
这样配置下来,每次更新服务时会先启动新服务,等服务健康检查通过时就会关闭旧服务,达到平滑升级的目的

专题:

本文发表于 2020-04-04,最后修改于 2020-04-04。

本站永久域名blog.amoyiki.com,也可搜索「 四畳半神话大系 」找到我。

期待关注我的 ,查看最近的文章和动态。


上一篇 « Spring Cloud 疑难杂症(4): Feign 访问缓慢及调用出错 下一篇 » Spring Cloud 疑难杂症(6): OpenJDK 字体库缺失

推荐阅读

Big Image