
# 升级零中断
要实现升级零中断，通常需要解决如下问题：
1. 停止服务的时候，可能引起业务中断。在停止服务的过程中，可能服务正在处理请求，新的请求可能持续地发送到该服务。
2. 在微服务架构下，一般都会通过注册中心进行服务发现，客户端会缓存实例地址。停止服务的时候，使用者可能无法及时感知实例下线，并继续使用错误的实例进行访问，导致失败。
3. 实现升级零中断，需要进行滚动升级，在新版本功能就绪后，才能够停止老版本。
实现升级零中断需要很多的措施进行配合，比如[滚动升级](https://support.huaweicloud.com/bestpractice-cse/cse_05_0025.html)，实现零中断，建议保证最少有2个可用的实例。在本章节里面，主要描述从微服务的角度进行设置，更好地配合升级零中断。Java Chassis实现零中断的核心机制包括如下几个：
1. 优雅停机。服务停止的时候，需要等待请求完成，并拒绝新请求。 Java Chassis优雅停机默认提供，在进程退出前，会进行一定的清理动作，包括等待正在处理的请求完成、拒绝未进入处理队列的新请求、调用注册中心接口进行注销等动作。Java Chassis进程退出前，先将实例状态修改为DOWN，然后等待一段时间再进行后续的退出过程：
   ```
   servicecomb:
     boot:
       turnDown:
         # 实例状态修改为DOWN以后等待时间，默认值为0，即不等待。
         waitInSeconds: 30
   ```
   
2. 重试：客户端对于网络连接错误，以及被拒绝等请求，需要选择新服务器进行重试。 开启重试策略：
   ```
   servicecomb:
     loadbalance:
       retryEnabled: true # 是否开启重试策略
       retryOnNext: 1  # 重新寻找一个实例重试的次数（不同于失败实例，依赖于负载均衡策略）
       retryOnSame: 0  # 在失败的实例上重试的次数
   ```
   
3. 隔离：对于失败超过一定次数的服务实例，进行隔离。 开启实例隔离策略：
   ```
   servicecomb:
     loadbalance:
       isolation:
         enabled: true
         enableRequestThreshold: 5 # 统计周期内实例至少处理的请求数，包括成功和失败。
         singleTestTime: 60000 # 实例隔离后，经过这个时间，会尝试访问。如果访问成功，则取消隔离，否则继续隔离。
         continuousFailureThreshold: 2 # 实例隔离的条件，连续两次失败。
   ```
   
 
