Spring Boot(Cloud) 优雅停机

为了解决在微服务重启的过程中,可能出现一部分 http 请求处理失败的问题,提供一下方案

拟用方案:

第一步:重启前先从主动将服务剔除,并等待一段时间
第二步:停止服务并重启

一、主动将服务剔除

该方案主要考虑因为服务下线的瞬间,如果服务信息更新不及时,导致复杂均衡算法依然转发到已经停掉的实例上发生一些服务不可用的情况

在每个项目增加一个接口(例如 /discovery/deregister ),在项目重启的脚本中主动调用接口剔除这个服务,shell 大致改动如下:

function stop()
{    
    echo "deregister [${PROJECT}]."
    curl -X POST "127.0.0.1:${SERVER_PORT}/discovery/deregister"
    echo ""
    echo "deregister [${PROJECT}] then sleep 10 seconds."
    sleep 10
    kill xxxxxxxxxxxxxxxxxxxx
}

接口代码示例

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.client.serviceregistry.ServiceRegistry;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("discovery")
@Slf4j
public class DeregisterInstanceController {

  @Autowired
  @Lazy
  private ServiceRegistry serviceRegistry;

  @Autowired
  @Lazy
  private Registration registration;

  @PostMapping("deregister")
  public void deregister() {

    log.info("deregister serviceName:{}, ip:{}, port:{}",
        registration.getServiceId(),
        registration.getHost(),
        registration.getPort());
    try {
      serviceRegistry.deregister(registration);
    } catch (Exception e) {
      log.error("deregister error", e);
    }
  }
}

二、Spring Boot 自带的优雅停机方案

要求 Spring Boot 的版本大于等于 2.3

在配置文件中增加如下配置:

application.yaml

server:
	shutdown: graceful
spring:
	lifecycle:
		timeout-per-shutdown-phase: 10s

当使用 server.shutdown=graceful启用时,在 Web 容器关闭时,Web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。缓冲器默认是 30s, 具体项目时间根据具体情况而定

不同 web 容器优雅停机行为区别

容器停机行为取决于具体的 web 容器行为

web 容器名称行为说明
tomcat 9.0.33+停止接收请求,客户端新请求等待超时。
Reactor Netty停止接收请求,客户端新请求等待超时。
Undertow停止接收请求,客户端新请求直接返回 503。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值