(十六)优雅停机

dubbo的优雅停机,借助于java虚拟机的关闭钩子来实现。
打开关闭钩子需要配置dubbo启动参数dubbo.shutdown.hook为true,才会使用关闭钩子启用优雅停机。
在钩子里,调用dubbo的容器(有spring,log4j,jetty等容器,即com.alibaba.dubbo.container.Container的实现类)的stop方法,释放相关资源。
spring在关闭时,会调用bean的destroy方法,dubbo的bean是扩展spring的,dubbo的bean会实现spring的接口DisposableBean的destroy方法:
不管是service,还是reference,都会将停机标记destroyed属性设为true
service:

public void destroy() {
    if (isDestroyed()) {
        return;
    }
    destroyed = true;
    setAvailable(false);
}

reference:

public synchronized void destroy() {
    if (ref == null) {
        return;
    }
    if (destroyed){
        return;
    }
    destroyed = true;
    try {
        invoker.destroy();
    } catch (Throwable t) {
        logger.warn("Unexpected err when destroy invoker of ReferenceConfig(" + url + ").", t);
    }
    invoker = null;
    ref = null;
}

dubbo在调用服务时,会判断服务是否已经销毁,用一个destroyed标记来标明,下面源码:
com.alibaba.dubbo.rpc.protocol.AbstractInvoker<T>

public Result invoke(Invocation inv) throws RpcException {
    if(destroyed) {
        throw new RpcException("Rpc invoker for service " + this + " on consumer " + NetUtils.getLocalHost()
                                        + " use dubbo version " + Version.getVersion()
                                        + " is DESTROYED, can not be invoked any more!");
    }
    //other source code...
}

 

如果服务已经停用了,会抛出异常,客户端会根据配的集群策略调用其他的服务。

 


停机时:
客户端不再发起新的调用请求,新的调用请求都会报错,如果还有请求未返回结果,会等待一段时间(停机超时时间),超时则强制停机;
服务端不会接收新的请求,检查线程池是否还有任务未完成,有则等待一段时间(停机超时时间),超时则强制停机。

停机超时时间,dubbo默认是10秒,也可以配置指定超时时间:

# dubbo.properties
dubbo.service.shutdown.wait=10000


除了使用ShutdownHook,还可以通过调用:ProtocolConfig.destroyAll();

自己写了个RPC:

https://github.com/nytta

可以给个star,^0^.

 

### Apisix 优雅停机的配置步骤 在使用 Apache APISIX 时,确保服务能够优雅停机是维护系统稳定性和用户体验的重要部分。以下是实现优雅停机的具体方法和相关配置步骤: #### 1. 使用 `apisix stop` 命令 APISIX 提供了内置的命令来停止服务,可以通过以下命令优雅地关闭服务: ```bash [root@localhost conf]# apisix stop ``` 此命令会触发 NGINX 的平滑停止机制,确保当前正在处理的请求完成后再终止进程[^1]。 #### 2. 配置超时时间以支持优雅停机 在 APISIX 的配置文件中(通常是 `conf/config.yaml`),可以设置 NGINX 的 `worker_shutdown_timeout` 参数。该参数定义了工作进程在接收到停止信号后允许完成现有请求的最大时间(单位为毫秒)。例如: ```yaml nginx_config: worker_shutdown_timeout: 10000 ``` 上述配置将超时时间设置为 10 秒。如果在此时间内所有请求都已完成,则 NGINX 将优雅退出;否则,强制终止进程[^1]。 #### 3. 在容器化环境中实现优雅停机 如果 APISIX 运行在 Kubernetes 或其他容器编排平台中,可以通过调整 Pod 的终止策略来实现优雅停机。例如,在 Deployment 的 YAML 文件中添加以下配置: ```yaml spec: terminationGracePeriodSeconds: 30 ``` 此配置项定义了 Kubernetes 在发送 SIGKILL 信号前等待 Pod 完成清理工作的最大时间(单位为秒)。结合 APISIX 的 `worker_shutdown_timeout` 参数,可以确保服务在容器化环境中也能优雅停机[^2]。 #### 4. 监控健康状态 为了进一步确保优雅停机的成功,可以结合健康检查机制监控 APISIX 的运行状态。例如,通过 APISIX 提供的 `/apisix/admin/healthcheck` 接口或自定义脚本验证服务是否已完全停止。 ### 示例代码:完整配置文件示例 以下是一个完整的 `config.yaml` 配置文件示例,展示如何设置优雅停机相关的参数: ```yaml nginx_config: worker_processes: auto worker_connections: 10240 worker_cpu_affinity: "auto" worker_shutdown_timeout: 10000 # 设置优雅停机超时时间为 10 秒 admin_key: - name: "admin" key: "edd1c9f034335f136f87ad84b625c8f1" role: "admin" ``` ### 注意事项 - 确保配置文件修改后重新加载 APISIX 配置:`apisix reload`。 - 如果使用的是 RPM 包安装方式,请确认配置文件路径是否正确[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值