springboot项目 + rancher管理 实现用户无感知部署

springboot项目 + rancher管理 实现用户无感知部署

rancher/yaml设置

在rancher找到对应服务的config,将Minimum Ready设置为合适的时间(单位为秒)

springboot项目 + rancher管理 实现用户无感知部署_第1张图片

或者以yaml文件修改配置,但是在yaml配置中是叫minReadySeconds

spec: # 定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
  minReadySeconds: 60 # 滚动升级时60s后认为该pod就绪,默认0s,如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了,在某些极端情况下可能会造成服务不正常运行
  progressDeadlineSeconds: 600 # 部署升级的最大时间,如果没完成将变成超时状态
  replicas: 1 # 定义副本数量
  revisionHistoryLimit: 10 # 定义保留几个历史版本记录

此时新编译打包的镜像启动后,旧版本的镜像将会在60s后才被kill掉,避免了新镜像刚启动未注册到服务发现配置就把旧镜像kill掉后导致的空窗期。

但是这样又会引发一个新问题:旧镜像在60s后被kill掉会不会导致一部分负载到此镜像的流量异常(此时相当于两个节点在服务发现上)

由此可以引申出服务优雅下线

优雅下线

简单的说,就是向应用进程发出停止指令之后,能保证正在执行的业务操作不受影响,直到操作运行完毕之后再停止服务。应用程序接收到停止指令之后,会进行如下操作:

  • 1.停止接收新的访问请求
  • 2.正在处理的请求,等待请求处理完毕;对于内部正在执行的其他任务,比如定时任务、mq 消费等等,也要等当前正在执行的任务执行完毕,并且不再启动新的任务
  • 3.当应用准备关闭的时候,按需向外发出信号,告知其他应用服务准备接手,以保证服务高可用

如果暴力的关闭应用程序,比如通过kill -9 命令强制直接关闭应用程序进程,可能会导致正在执行的任务数据丢失或者错乱,也可能会导致任务所持有的全局资源等不到释放,比如当前任务持有 redis 的锁,并且没有设置过期时间,当任务突然被终止并且没有主动释放锁,会导致其他进程因无法获取锁而不能处理业务。

如何使用:

在pom文件引入

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-actuatorartifactId>
dependency>

在服务bootstrap.yaml文件配置

server:
  ##开启优雅停机,默认等待30s处理剩余任务
  shutdown: graceful
  
# 优雅下线配置
management:
  endpoint:
    shutdown:
      enabled: true #启用 shutdown 端点,默认是未启用的
  endpoints:
    web:
      exposure:
        include: health,info,shutdown #对外公开 health,info,shutdown 端点,默认只会公开前两个  

于是现在关闭日志就会有如下日志,说明就成功了

springboot项目 + rancher管理 实现用户无感知部署_第2张图片

你可能感兴趣的:(spring,boot,rancher,java)