Spring boot 2.3优雅下线,距离生产还有多远?( 三 )


Spring boot 2.3优雅下线,距离生产还有多远?
本文插图
我们看到 , 当一个Spring Cloud服务端通过SpringBoot提供的graceful shutdown下线时 , 它会拒绝客户端新的请求 , 并且等待已经在处理的线程处理完成后 , 或者在配置的应用最长等待时间到了之后进行下线 。
但是在服务端重启开始拒绝客户端新的请求的时刻开始 , 即执行了Connectors.stop开始 , 到客户端感知到服务端该实例下线这段时间内 , 客户端向该实例发起的所有请求都会被拒绝 , 从而引起服务调用异常 。
Spring boot 2.3优雅下线,距离生产还有多远?
本文插图
如果客户端考虑增加重试能力 , 这一定程度上可以缓解发布过程中服务调用报错的问题 , 但是无法根本上保证下线过程的无损 , 如果服务调用报错期过程 , 或者分批发布时候同一批次下线的节点数过多 , 无法保证仅仅增加多次重试就能够调用到未下线的节点上 。 这不能根本解决问题!同时需要考虑配置重试带来的业务上存在不幂等的风险 。
EDAS 3.0 无损下线
EDAS 3.0 通过Java Agent技术无侵入增强您的应用 , 使其具备无损下线能力 。 ? 您无需修改一行代码与配置 , 天然具备无侵入特点? 同时支持 ECS 、K8s 场景? 全面兼容开源 , 支持开源Dubbo、Spring Cloud 以及开源微服务网关
Spring boot 2.3优雅下线,距离生产还有多远?
本文插图
EDAS的应用如何做到无损下线?
Spring boot 2.3优雅下线,距离生产还有多远?
本文插图
如图看到 , 我们通过3个步骤的增强 , 主动注销、服务提供者通知下线信息、服务消费者调用其他服务提供者 。
可以看到 , 真正做到无损下线能力是需要客户端增强一起联动的

  • 主动注销我们在应用服务下线前 , 主动通知注册中心注销该实例
  • 通知下线信息我们会在服务端实例下线前主动通知客户端 , 该服务节点下线的信息
  • 调用其他提供者我们在客户端增强其负载均衡能力 , 在服务端下线后 , 客户端主动调用其他服务提供者节点同时我们提供应用等待的逻辑 , 使要下线的服务端等待已经收到的请求处理完成再关闭 Spring 容器 。

Spring boot 2.3优雅下线,距离生产还有多远?
本文插图
完整的解决方案
EDAS 3.0无损下线不仅仅支持 Spring Cloud 与 Dubbo 服务 , 我们还打通了消息、网关等微服务组件 , 让您的应用在EDAS中做到全链路的下线无损 。
【Spring boot 2.3优雅下线,距离生产还有多远?】EDAS 3.0支持端到端的无损下线
  • 云上客户存在多种微服务网关 , 支持主流开源微服务网关(Spring Cloud Gateway、Zuul等)的无损下线
  • 有些用户的流量是通过 Ingress、SLB、Nginx 等方式打到服务端的场景
  • MQ消息等异步订阅关系的微服务场景
  • K8s 使用 Service 服务发现的微服务场景为了做到全链路的无损下线 , EDAS 3.0 通过无侵入的方式涵盖多种场景的完整解决方案 , 确保您的发布平滑无损 。
即使面对白天大流量的场景 , 发布依旧风轻云淡 。
作者信息:
泮圣伟(花名:十眠)阿里云智能开发工程师 , 负责 Dubbo / Spring Cloud 商业化产品开发相关工作 , 目前主要关注云原生、微服务等技术方向 。
本文为阿里云原创内容 , 未经允许不得转载 。