Skip to content

microservice graceful up down

chengyouling edited this page Nov 7, 2023 · 23 revisions

微服务优雅上线、下线

服务注册时,容器可能还未就绪,但是已经对外提供服务,请求进来就会触发503服务不可用异常;微服务下线时,容器已进入销毁过程,但是注册中心还在健康检查时间范围没有剔除服务,仍然可以对外提供服务,请求进来也会触发503服务不可用异常。

针对上面两种情况,spring-cloud-huawei结合spring-boot-actuator实现微服务优雅上下线,以解决动态扩缩容服务不可用问题。

微服务pom依赖

  • 注册中心为cse(servicecomb)
<dependency>
  <groupId>com.huaweicloud</groupId>
  <artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
</dependency>
  • 注册中心为cse(nacos)
<dependency>
  <groupId>com.huaweicloud</groupId>
  <artifactId>spring-cloud-starter-huawei-nacos</artifactId>
</dependency>

注意:版本要求1.11.2-2021.0.x/1.11.2-2022.0.x及以上。

优雅上下线相关配置

  • Nacos作为注册中心

微服务启动时,关闭自动注册功能,外部持续检查/health情况,当返回200时,触发服务注册。

关闭自动注册配置:

spring:
  cloud:
    nacos:
      discovery:
        register-enabled: false

开启优雅上下线功能:

spring:
  cloud:
    servicecomb:
      graceful:
        nacosEngine:
          enabled: true

配置endpoint管理:

management:
  endpoints:
    web:
      exposure:
        include: "*"
      base-path: /
      path-mapping:
        nacos-service-registry: service-registry/nacos

management.endpoints.web.exposure.include内容可以是"*",也可以是"health,nacos-service-registry"。 management.endpoints.web.path-mapping.nacos-service-registry配置"nacos-service-registry"Endpoint的调用uri。

  • Servicecomb作为注册中心

微服务启动时,先注册一个DOWN状态实例,外部持续检查/health情况,当返回200时,触发服务状态更新。

关闭自动注册配置:

spring:
  cloud:
    servicecomb:
      instance:
        initial-status: DOWN

开启优雅上下线功能:

spring:
  cloud:
    servicecomb:
      graceful:
        servicecombEngine:
          enabled: true

配置endpoint管理:

management:
  endpoints:
    web:
      exposure:
        include: "*"
      base-path: /
      path-mapping:
        servicecomb-service-registry: service-registry/servicecomb

management.endpoints.web.exposure.include内容可以是"*",也可以是"health,servicecomb-service-registry"。 management.endpoints.web.path-mapping.servicecomb-service-registry配置"servicecomb-service-registry"Endpoint的调用uri。

实现优雅上下线

  • 虚拟机场景(servicecomb注册中心为例)

优雅上线

自动脚本持续检查/health接口,当/health接口返回200时,调用定义的path-mapping路径,通知微服务注册实现优雅上线。

结合上述设置配置,可以通过以下接口调用实现服务注册:调用http://127.0.0.1:8080/actuator/service-registry/servicecomb,端口号当前微服务设置的端口号,设置body内容如下:

{
  "status": "UP"
}

优雅下线

如果是通过平台部署,可以在点击服务下线时,优先调用http://127.0.0.1:8080/actuator/service-registry/servicecomb,status设置为DOWN,提前将服务从注册中心下线,实现优雅下线;如果是手动部署的,则通过手动调用链接方式实现优雅下线。

  • K8S容器场景(servicecomb注册中心为例)

优雅上线

实现容器pod的PostStart,并持续检查/health接口,当/health接口返回200时,调用定义的path-mapping路径,通知微服务注册实现优雅上线。

结合上述设置配置,可以通过以下接口调用实现服务注册:调用http://127.0.0.1:8080/actuator/service-registry/servicecomb,端口号当前微服务设置的端口号,设置body内容如下:

{
  "status": "UP"
}

优雅下线

实现容器pod的PreStop,调用http://127.0.0.1:8080/actuator/service-registry/servicecomb,status设置为DOWN,提前将服务从注册中心下线,实现优雅下线。

Clone this wiki locally