首页 > 其他分享 >ServiceStage集成Sermant实现应用的优雅上下线

ServiceStage集成Sermant实现应用的优雅上下线

时间:2024-09-03 17:55:00浏览次数:13  
标签:服务 ServiceStage 优雅 应用 下线 Sermant

作者:聂子雄 华为云高级软件工程师

摘要

优雅上下线旨在确保服务在进行上下线操作时,能够平滑过渡,避免对业务造成影响,保证资源的高效利用。Sermant基于字节码增强的技术实现了应用优雅上下线能力,应用发布与运维平台ServiceStage通过集成Sermant使得应用在进行持续发布时实现无侵入式地优雅上下线。

1. ServiceStage简介

ServiceStage(应用管理与运维平台)是华为云面向企业的应用管理与运维平台,提供应用发布、部署、监控与运维等一站式解决方案。整个平台支持一系列技术栈,包含Java、Node.js、Docker、Tomcat等。在微服务框架层面,支持Apache ServiceComb Java Chassis(Java Chassis)、Spring Cloud等框架的微服务应用,让企业应用上云更简单。

ServiceStage主要具备如下的一些能力模块:

  1. 应用管理:支持应用生命周期管理、环境管理。
  2. 微服务应用接入:支持Java Chassis、Spring Cloud微服务框架。配合微服务引擎可实现服务注册发现、配置管理和服务治理。
  3. 应用运维:通过日志、监控、告警支持应用运维管理。

ServiceStage集成Sermant实现应用的优雅上下线_Java

2. Sermant简介

Sermant 是基于Java字节码增强技术的云原生无代理服务网格,通过 JavaAgent 对宿主应用进行非侵入式增强,以解决Java应用的微服务治理问题。Sermant的初衷是建立一个面向微服务治理的对开发态非侵入的解决方案生态,降低服务治理开发和使用的难度,通过抽象接口、功能整合、插件隔离等手段,达到简化开发、功能即插即用的效果。

Sermant整体架构包括Sermant Agent、Sermant Backend、Sermant Injector、动态配置中心等组件。其中Sermant Agent是提供字节码增强基础能力及各类服务治理能力的核心组件,Sermant Backend、Sermant Injector、动态配置中心为Sermant提供其他能力的配套组件。

ServiceStage集成Sermant实现应用的优雅上下线_微服务_02

3. 应用上下线发布过程遇到的挑战

在应用上下线发布过程中,如何做到流量的无损上/下线,是一个系统能保证SLA的关键。如果应用上下线不平滑,就会出现短时间的服务调用报错,比如连接被拒绝、请求超时、没有实例和请求异常等问题。

在应用上线发布过程中,由于过早暴露服务,实例可能仍处在JVM JIT编译或者使用的中间件还在加载,若此时大量流量进入,可能会瞬间压垮新起的服务实例。

在应用下线过程中,服务消费者感知服务提供者下线有延迟,在一段时间内,被路由到已下线服务提供者实例的请求都抛连接被拒绝异常。其次服务实例在接收到停止服务信号时,会立即关闭,但是这时候可能在请求队列中存在一部分请求还在处理,如果立即关闭这些请求都会损失掉。

4. ServiceStage优雅上下线方案

为了保证应用正确上下线、流量不丢失,ServiceStage基于Sermant提供了一套优雅上下线的方案,包括预热、延迟下线等,避免了请求超时、连接拒绝、流量丢失等问题的发生。

4.1优雅上线实现机制

预热是优雅上线的核心机制,Sermant Agent提供了延迟注册机制,减少流量丢失,从而实现优雅上线。

ServiceStage集成Sermant实现应用的优雅上下线_运维_03

1.延迟注册

在服务启动成功之后不立刻注册,而是延迟一段时间再去注册,目的是虽然服务启动成功了,但可能还有一些框架或者业务的代码没有初始化完成,可能会导致调用报错,可以通过设置延迟注册,让服务充分初始化后再注册到注册中心对外提供服务。

2.预热

该方式主要用于解决当流量突然增加时,可能瞬间把实例压垮的问题。通过预热,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,目的是采用少流量对服务实例进行初始化,防止服务崩溃。预热是基于客户端实现的,当流量进入时,Sermant Agent会动态调整流量,根据服务的预热配置,对流量进行动态分配。对于开启服务预热的实例,在刚启动时,会给该实例分配较少的流量,随后流量将以曲线方式逐渐增加至与其他实例近乎持平。

4.2优雅下线实现机制

延迟下线是优雅下线的核心机制,且Sermant Agent还提供了流量统计机制,即服务处理完所有统计的请求后再下线,减少流量丢失,从而实现了优雅下线。

ServiceStage集成Sermant实现应用的优雅上下线_运维_04

1.延迟下线

当服务提供者实例下线时,无法避免仍有业务请求还未处理完成,从而可能会出现请求丢失的现象。延迟下线即对下线的实例提供保护,优雅下线插件基于下线实时通知+刷新缓存的机制快速更新上游的实例缓存,服务消费者能尽早感知服务。提供者实例下线的行为,同时基于流量统计的方式,确保即将下线的实例尽可能的将流量处理完成,尽量避免流量丢失。

2.流量统计

当服务即将下线时,为确保当前请求已全部处理完成,Sermant Agent会尝试等待30s(可配置),定时统计和判断当前实例请求是否均处理完成,处理完成后最终下线。

4.3   整体流程

使用ServiceStage完成应用优雅上下线流程示例如下:

ServiceStage集成Sermant实现应用的优雅上下线_Java_05

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 作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。

ServiceStage集成Sermant实现应用的优雅上下线_运维_06

标签:服务,ServiceStage,优雅,应用,下线,Sermant
From: https://blog.51cto.com/u_15950821/11909520

相关文章

  • 如何优雅的使用Optional类?
    在项目中我们是用Optional来判空的。//遍历打印userListfor(UserInfouserInfo:Optional.ofNullable(userList).orElse(newArrayList<>())){//printuserInfo}我们通常的做法,是先判断不为空,再遍历:if(!CollectionUtils.isEmpty(userInfoList)){for(UserInfo......
  • 开源优雅的API交互工具 HTTPie CLI
    #HTTPie CLI:现代、用户友好的命令行HTTP客户端 - 精选真开源,释放新价值。概览HTTPie CLI 是一款专为API时代设计的命令行HTTP客户端,以其简洁明了的语法和丰富的功能集,为开发者和系统管理员提供了一种高效与HTTP服务交互的方式。它支持JSON格式的自动解析和生成,使得与RESTfu......
  • Java服务端服务降级:优雅降级的实现
    Java服务端服务降级:优雅降级的实现大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,服务降级是一种常见的容错机制,用于在系统负载过高或服务不可用时,有意识地降低服务的级别,以保证核心服务的可用性。优雅降级是服务降级的一种策略,它通过......
  • 优雅谈大模型:白话ZeRO 下
    机器学习模型的复杂性和规模不断增长,分布式训练变得比以往任何时候都更加重要。训练具有数千亿参数的大型语言模型(LLMs)将是机器学习基础设施面临的挑战。与传统的分布式计算框架不同的地方在于GPU的分布式训练需要将数据传递给GPU芯片等物理硬件层。GPU设备之间会进行频繁、......
  • 一种优雅的方式整合限流、幂等、防盗刷
    大家在工作中肯定遇到过接口被人狂刷的经历,就算没有经历过,在接口开发的过程中,我们也需要对那些容易被刷的接口或者和会消耗公司金钱相关的接口增加防盗刷功能。例如,发送短信接口以及发送邮件等接口,我看了国内很多产品的短信登录接口,基本上都是做了防盗刷,如果不做的话,一夜之间,也许......
  • 最适合程序员的编程字体,好看、优雅!
    对于程序员来说,每天面对最多的就是代码了,选择一款赏心悦目的编程字体就显得尤为重要。那什么是好看的字体呢?基本要求就是相似符号要有明显区别,比如:0、O、o;l、I、1;全角和半角的()等,并且得看着舒服。还有些人认为输入和显示不要有太大的差异,比如:!=展示为≠;===展示为≡等,这个就......
  • 从匿名内部类到Lambda表达式:Java编程的优雅进化
    匿名内部类首先我们先来介绍一下什么是匿名内部类匿名内部类:java中一种特殊的类定义方式,它允许你在需要实现一个接口或继承一个类的地方直接定义一个该接口或类的匿名子类。若想创建一个派生类的对象,并且对象只创建一次,可以设计为匿名内部类,可以大大简化代码注意:匿名内部类......
  • 如何优雅的处理异常
    一、什么是异常Java语言按照错误严重性,从throwale根类衍生出Error和Exception两大派系。Error(错误):程序在执行过程中所遇到的硬件或操作系统的错误。错误对程序而言是致命的,将导致程序无法运行。常见的错误有内存溢出,jvm虚拟机自身的非正常运行,calss文件没有主方法......
  • Java后端分布式系统的服务降级:优雅降级与服务熔断
    Java后端分布式系统的服务降级:优雅降级与服务熔断大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,服务降级是一种应对高负载或服务不稳定情况的策略,目的是保证核心服务的可用性。优雅降级是指在系统负载过高时,有选择性地关闭一些服务或......
  • Go 程序如何实现优雅退出?来看看 K8s 是怎么做的——下篇
    Go程序如何实现优雅退出?来看看K8s是怎么做的——下篇GoCN  2024年08月27日08:02 浙江 以下文章来源于Go编程世界 ,作者江湖十年Go编程世界.不限于Golang、Docker、Kubernetes,技术博客https://jianghushinian.cn/的移动版。本文带大家一起来详细学习......