作者:聂子雄 华为云高级软件工程师
摘要
优雅上下线旨在确保服务在进行上下线操作时,能够平滑过渡,避免对业务造成影响,保证资源的高效利用。Sermant基于字节码增强的技术实现了应用优雅上下线能力,应用发布与运维平台ServiceStage通过集成Sermant使得应用在进行持续发布时实现无侵入式地优雅上下线。
1. ServiceStage简介
ServiceStage(应用管理与运维平台)是华为云面向企业的应用管理与运维平台,提供应用发布、部署、监控与运维等一站式解决方案。整个平台支持一系列技术栈,包含Java、Node.js、Docker、Tomcat等。在微服务框架层面,支持Apache ServiceComb Java Chassis(Java Chassis)、Spring Cloud等框架的微服务应用,让企业应用上云更简单。
ServiceStage主要具备如下的一些能力模块:
- 应用管理:支持应用生命周期管理、环境管理。
- 微服务应用接入:支持Java Chassis、Spring Cloud微服务框架。配合微服务引擎可实现服务注册发现、配置管理和服务治理。
- 应用运维:通过日志、监控、告警支持应用运维管理。
2. Sermant简介
Sermant 是基于Java字节码增强技术的云原生无代理服务网格,通过 JavaAgent 对宿主应用进行非侵入式增强,以解决Java应用的微服务治理问题。Sermant的初衷是建立一个面向微服务治理的对开发态非侵入的解决方案生态,降低服务治理开发和使用的难度,通过抽象接口、功能整合、插件隔离等手段,达到简化开发、功能即插即用的效果。
Sermant整体架构包括Sermant Agent、Sermant Backend、Sermant Injector、动态配置中心等组件。其中Sermant Agent是提供字节码增强基础能力及各类服务治理能力的核心组件,Sermant Backend、Sermant Injector、动态配置中心为Sermant提供其他能力的配套组件。
3. 应用上下线发布过程遇到的挑战
在应用上下线发布过程中,如何做到流量的无损上/下线,是一个系统能保证SLA的关键。如果应用上下线不平滑,就会出现短时间的服务调用报错,比如连接被拒绝、请求超时、没有实例和请求异常等问题。
在应用上线发布过程中,由于过早暴露服务,实例可能仍处在JVM JIT编译或者使用的中间件还在加载,若此时大量流量进入,可能会瞬间压垮新起的服务实例。
在应用下线过程中,服务消费者感知服务提供者下线有延迟,在一段时间内,被路由到已下线服务提供者实例的请求都抛连接被拒绝异常。其次服务实例在接收到停止服务信号时,会立即关闭,但是这时候可能在请求队列中存在一部分请求还在处理,如果立即关闭这些请求都会损失掉。
4. ServiceStage优雅上下线方案
为了保证应用正确上下线、流量不丢失,ServiceStage基于Sermant提供了一套优雅上下线的方案,包括预热、延迟下线等,避免了请求超时、连接拒绝、流量丢失等问题的发生。
4.1优雅上线实现机制
预热是优雅上线的核心机制,Sermant Agent提供了延迟注册机制,减少流量丢失,从而实现优雅上线。
1.延迟注册
在服务启动成功之后不立刻注册,而是延迟一段时间再去注册,目的是虽然服务启动成功了,但可能还有一些框架或者业务的代码没有初始化完成,可能会导致调用报错,可以通过设置延迟注册,让服务充分初始化后再注册到注册中心对外提供服务。
2.预热
该方式主要用于解决当流量突然增加时,可能瞬间把实例压垮的问题。通过预热,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,目的是采用少流量对服务实例进行初始化,防止服务崩溃。预热是基于客户端实现的,当流量进入时,Sermant Agent会动态调整流量,根据服务的预热配置,对流量进行动态分配。对于开启服务预热的实例,在刚启动时,会给该实例分配较少的流量,随后流量将以曲线方式逐渐增加至与其他实例近乎持平。
4.2优雅下线实现机制
延迟下线是优雅下线的核心机制,且Sermant Agent还提供了流量统计机制,即服务处理完所有统计的请求后再下线,减少流量丢失,从而实现了优雅下线。
1.延迟下线
当服务提供者实例下线时,无法避免仍有业务请求还未处理完成,从而可能会出现请求丢失的现象。延迟下线即对下线的实例提供保护,优雅下线插件基于下线
实时通知+刷新缓存的机制快速更新上游的实例缓存,服务消费者能尽早感知服务。提供者实例下线的行为,同时基于流量统计的方式,确保即将下线的实例尽可能的将流量处理完成,尽量避免流量丢失。
2.流量统计
当服务即将下线时,为确保当前请求已全部处理完成,Sermant Agent会尝试等待30s(可配置),定时统计和判断当前实例请求是否均处理完成,处理完成后最终下线。
4.3 整体流程
使用ServiceStage完成应用优雅上下线流程示例如下:
1.资源准备
通过云平台以及ServiceStage提供的能力,快速创建应用所需要的计算(ECS,CCE等),存储(OBS,EVS等),网络(VPC,ELB等)以及一些中间件资源(DCS,DMS,CSE等)。
2.创建环境
在ServiceStage的控制台,找到环境创建页面,完成环境创建,随后将提前准备好的资源纳管到新创建的环境当中。
3.安装Sermant Injector
ServiceStage为了简化Sermant Agent的安装流程,专门集成了Sermant Injector,通过Sermant Injector,ServiceStage可以实现宿主应用自动挂载Sermant的快速部署方式,只需在应用部署的yaml中的labels添加sermant-injection: enabled即可快速将Sermant Agent安装到应用实例上。
在ServiceStage上,只需在界面勾选Sermant Injector选项,即可自动完成Sermant Injector的安装。
4.创建应用
在ServiceStage的控制台,找到应用创建页面,完成应用创建。
5.部署待实现优雅上下线应用
选择2中已创建好的环境,将准备好的应用代码通过ServiceStage的组件部署功能快速部署到该环境中。
6.验证优雅上下线
针对应用中的实例,在ServiceStage上对其进行部分重启或者下线,随后通过脚本文件,持续调用实例接口,查看流量请求情况,并与未开启优雅上下线开关情况下的数据进行对比,验证优雅上下线的实际效果。
5. 总结
Sermant基于Java字节码增强的技术为微服务应用提供了稳定可靠的优雅上下线能力,而ServiceStage本身作为一个高效的应用发布与运维平台,通过集成Sermant,提供了微服务应用优雅上下线的端到端解决方案,为广大使用者提供更高效更便捷的使用体验。
--------------------------------------------------------------------
Sermant 作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。
- Sermant 官网:https://sermant.io
- GitHub 仓库地址:https://github.com/sermant-io/Sermant
- 扫码加入 Sermant 社区交流群