配置微服务治理

在EDAS中部署的SpringCloud和Dubbo应用能够无侵入对接MSE微服务治理能力。当前EDAS支持您在创建和部署应用时为应用配置服务注册与发现、推空保护和无损上线微服务治理能力。本文介绍如何配置微服务治理。

说明

EDAS的应用配置微服务治理相关参数,使用云效流水线部署EDAS应用时,以EDAS控制台配置为准,云效流水线无法进行参数的配置。

背景信息

服务注册与发现

Java微服务架构中常见的注册中心包含Eureka、ZooKeeper和Nacos等,用于实现服务的注册与发现,能够屏蔽、解耦服务之间的相互依赖,以便对微服务进行动态管理。

推空保护

推空保护功能用于处理客户端在请求注册中心订阅服务端地址列表时,在服务端注册异常的场景下,注册中心返回了空列表,此时客户端忽略该空返回的变更,从缓存中获取上一次正常的服务端地址进行服务访问。能够在注册中心在进行变更(变配、升降级)或遇到突发情况(例如,可用区断网断电)或其他不可预知情况下的列表订阅异常时,增加客户端可靠性。

服务消费者(Consumer)会从注册中心上订阅服务提供者(Provider)的实例列表。当注册中心在进行变更(变配、升降级)或遇到突发情况(例如,可用区断网断电)时,都有可能导致订阅异常,影响服务消费者(Consumer)的可用性。为了应对在不可预知的情况下订阅列表异常,可以在Consumer侧配置推空保护。

proconfig

无损上线

对于任何一个线上应用来说,发布、扩容、缩容和重启等操作不可避免,EDAS集成了MSE提供的一套无损上线方案,针对应用启动的多个阶段提供了相应的保护能力,具体功能包含服务预热、服务延迟注册以及无损滚动发布等。

  • 服务预热:通过设置预热时间和预热曲线,降低新上线的服务在短时间内无法处理突增流量导致进程异常的风险。

  • 延迟注册:延迟注册能够在应用启动时进行延时等待,在等待延迟时间后,再将服务注册到注册中心。能够为应用提供异步请求、计算资源的准备时间,降低在应用发布时由于资源未初始化成功的请求异常。

    对于初始化过程繁琐的应用,由于注册通常与应用初始化过程同步进行,从而出现应用还未完全初始化就已经被注册到注册中心供外部消费者调用,此时直接调用可能会导致请求报错。通过设置延迟注册,可让应用在充分初始化后再注册到注册中心对外提供服务。

  • 无损滚动发布:Health接口为微服务体系外的客户端提供应用就绪状态检查的方法,基于该接口能够同步微服务框架下与非微服务框架下的服务状态检查。支持服务注册状态检查和服务预热状态检查。

    K8s的滚动发布是将一次完整的发布过程分成多个批次,每次发布一个批次,成功后,再发布下一个批次,最终完成所有批次的发布。EDAS能够为K8s应用打通微服务生命周期与K8s服务生命周期,通过提供确保在通过就绪检查前完成服务注册以及确保在就绪检查前完成服务预热等无损上线能力,帮助您在应用的滚动发布过程中,始终保证有可用的服务实例(副本)在运行,从而实现应用的无损滚动发布。

    • 通过就绪检查前完成服务注册:微服务生命周期关联K8s就绪检查功能开启后,可通过Agent无侵入为应用提供一个检测其是否完成注册的端口,当应用注册完成返回200帮助K8s判定应用已就绪,未完成注册返回500帮助K8s判定应用未就绪。

    • 通过就绪检查前完成服务预热:除了可以单独使用服务预热,还可以将其关联K8s就绪检查机制。当应用服务预热完成后,K8s才将应用置为就绪状态。

无损下线

在EDAS上部署的K8s应用默认开启无损下线能力。应用可以在实例停止前先在注册中心注销,等待一段时间后再执行下线流程。对于Java应用,额外支持配置下线通知开关,下线的实例能够主动通知消费者不再向本实例发起请求,一定程度上避免实例下线时仍然有未处理完成的请求被中断。

使用限制

  • 仅Spring Cloud和Dubbo应用支持无侵入接入推空保护和无损上线微服务治理能力,对应支持的版本如下:

    限制项

    推空保护

    无损上线

    Spring Cloud

    支持Spring Cloud Edgware及以上版本

    支持Spring Cloud Edgware及以上版本

    Dubbo

    支持Dubbo 2.5.3~2.7.8版本

    说明

    如需使用Dubbo 3.0及以上版本,请加入钉群(钉群号:31723701)联系产品技术专家咨询处理。

    支持Dubbo 2.7.3~2.7.8版本

    说明

    如需使用Dubbo 2.6或Dubbo 3.0及以上版本,请加入钉群(钉群号:31723701)联系产品技术专家咨询处理。

  • 支持Nacos、Eureka和Zookeeper注册中心类型。

  • 网关应用一般不通过注册中心调用,而是通过直接对外暴露API的方式调用,因此MSE当前所支持的小流量预热功能对该类应用不生效。另一方面,网关应用本身很少变更而且没有太多业务逻辑,因此也不太需要服务预热功能。

  • 金丝雀发布第一批灰度批次的流量不支持进行服务预热,后续批次才能进行服务预热。

在创建应用时配置微服务治理

  1. 登录EDAS控制台,在左侧导航栏,单击应用管理 > 应用列表,在顶部菜单栏选择地域并在页面上方选择所属微服务空间,然后在应用列表页面左上角,单击创建应用

  2. 应用基本信息页签,选择集群类型和应用运行环境,然后在页面最下方单击下一步

    配置项

    描述

    集群类型

    选择Kubernetes集群

    应用运行环境

    根据选择的托管应用类型选择应用运行环境。

    • Java:

      • 自定义:适用于在K8s集群中使用自定义的镜像部署应用。

      • Java:支持通用的JAR包部署,适用于Dubbo和Spring Boot应用。在选择后可更改Java环境。

      • Tomcat:支持通用的WAR包部署,适用于Dubbo和Spring应用。在选择后可更改Java环境和容器版本。

      • EDAS-Container(HSF):适用于使用WAR或者FatJar部署HSF应用。在选择后可更改Java环境、Pandora版本和Ali-Tomcat版本。

    • PHP:适用于运行在Apache HTTP Server中的PHP应用程序。

    • 多语言Node.js、C++、Go...:适用于在K8s集群中使用自定义的镜像部署应用。

    说明
    • 选择EDAS-Container(HSF)部署应用时,微服务治理仅支持配置服务注册与发现。

    • 选择PHP多语言Node.js、C++、Go...部署应用时,不支持配置微服务治理

  3. 应用配置页签,设置应用的环境信息、基本信息、部署方式和资源参数,设置完成后单击下一步

  4. 应用高级设置页签,展开微服务治理,根据您的业务需求配置服务注册于发现、推空保护和无损上线。

    配置项

    描述

    服务注册与发现配置

    注册中心运维方式。您可以选择使用EDAS共享注册中心或使用应用程序配置的注册中心。具体操作,请参见选择注册中心运维方式

    推空保护

    是否开启推空保护。

    • 开启推空保护:Consumer订阅到空列表,推空保护生效,丢弃变更,保障业务服务可用。

    • 不开启推空保护:Consumer订阅到空列表,业务中断报错。

    无损上线

    是否开启无损上线。开启时,需配置以下参数:

    • 预热时长(秒):应用实例下一次启动的预热时间,默认预热时长为120秒。服务预热时长设置范围为0~86400秒(即24小时)。

    • 预热曲线:基于已配置的预热时长,被预热的应用流量权重会根据配置的预热曲线呈指数型增长。在指定预热时长内,预热曲线值越大被预热应用刚启动时分配的流量权重越小,以满足需要较长时间进行预热的复杂应用的预热需求。

      默认为2(适合于一般预热场景),表示在预热周期内服务提供者的流量接收曲线形状呈2次曲线形状。预热曲线设置范围为0~20。相同预热时间,预热曲线值越大,表示预热开始将接收的流量越小,临近预热结束时接收的流量增幅越大。

    • 延迟注册时间(秒):设置范围为0~86400秒(即24小时)。

    • 无损滚动发布:配置应用无损滚动发布。

      • 通过就绪检查前完成服务注册:为应用无侵入提供55199端口用于检查微服务是否已经完成注册,如果已注册完成,端口返回200,否则返回500。

      • 通过就绪检查前完成服务预热:为应用无侵入提供55199端口用于检查微服务是否已经完成预热,如果已预热完成,端口返回200,否则返回500。

        说明

        若同时开启了通过就绪检查前完成服务注册、通过就绪检查前完成服务预热,则55199端口会检查服务是否已完成预热。

    无损下线

    本开关支持配置无损下线主动通知功能。开启后,应用在收到下线请求后,会主动通知消费方自己即将下线。

    说明
    • EDAS应用默认启用无损下线能力。

    • 需生产者和消费者均开启无损下线主动通知开关。

    • 确保集群中的ack-onepilot版本大于3.X,如果低于该版本,需升级。具体操作,请参见如何安装ack-onepilot和卸载arms-pilot

    • EDAS实现无损下线能力依赖应用的preStop探针。如果您的应用需自定义preStop探针,请在preStop探针中添加以下脚本:

      wget http://127.0.0.1:54199/offline; sleep 30;
  5. 应用高级设置页签,展开应用生命周期管理,选择Readiness配置选项,单击开启开关,使Readiness探针配置生效。

    serviceLifecycle

    应用未配置就绪探针时,启用无损上线的无损滚动发布配置后,会在就绪探针模式中新增无损滚动发布模式,选择该模式会为您的应用默认配置路径为/health,端口为55199的就绪状态检查。您可以直接使用该无损滚动发布模式以打通微服务与K8s的生命周期,也可以结合业务需求使用其他模式结合/health接口配置更严谨的业务就绪检查方法。

  6. 完成设置后单击创建应用

  7. 应用创建完成页签确认应用基本信息应用配置应用高级设置等信息,确认完毕后单击确定创建应用

    应用总览页面顶部提示信息中,单击查看详情,可在变更记录页面查看变更流程。应用部署需要几分钟,请您耐心等待。变更完成后在应用总览页面的基本信息区域查看实例的运行状态,如果显示为Pod运行中,说明应用部署成功。

在更新应用时配置微服务治理

如果您在创建应用时没有配置应用的服务注册与发现、推空保护或无损上线,可以在部署应用时进行配置。

  1. 登录EDAS控制台

  2. 在左侧导航栏,单击应用管理 > 应用列表,在顶部菜单栏选择地域并在页面上方选择所属微服务空间,在集群类型下拉列表,选择K8s集群,然后在页面单击具体的应用名称。

  3. 应用总览基本信息页面的右上角,选择部署 > 部署

  4. 选择部署模式页面,选择具体的部署方式,然后在所选方式区域的右上角,单击开始部署

  5. 设置应用的环境和部署包信息后,展开配置管理,根据您的需求完成配置后单击确定

    1. 展开微服务治理,根据您的业务需求配置服务注册与发现、推空保护和无损上线。

      配置项

      描述

      服务注册与发现配置

      注册中心运维方式。您可以选择使用EDAS共享注册中心或使用应用程序配置的注册中心。具体操作,请参见选择注册中心运维方式

      推空保护

      是否开启推空保护。

      • 开启推空保护:Consumer订阅到空列表,推空保护生效,丢弃变更,保障业务服务可用。

      • 不开启推空保护:Consumer订阅到空列表,业务中断报错。

      无损上线

      是否开启无损上线。开启时,需配置以下参数:

      • 预热时长(秒):应用实例下一次启动的预热时间,默认预热时长为120秒。服务预热时长设置范围为0~86400秒(即24小时)。

      • 预热曲线:基于已配置的预热时长,被预热的应用流量权重会根据配置的预热曲线呈指数型增长。在指定预热时长内,预热曲线值越大被预热应用刚启动时分配的流量权重越小,以满足需要较长时间进行预热的复杂应用的预热需求。

        默认为2(适合于一般预热场景),表示在预热周期内服务提供者的流量接收曲线形状呈2次曲线形状。预热曲线设置范围为0~20。相同预热时间,预热曲线值越大,表示预热开始将接收的流量越小,临近预热结束时接收的流量增幅越大。

      • 延迟注册时间(秒):设置范围为0~86400秒(即24小时)。

      • 无损滚动发布:配置应用无损滚动发布。

        • 通过就绪检查前完成服务注册:为应用无侵入提供55199端口用于检查微服务是否已经完成注册,如果已注册完成,端口返回200,否则返回500。

        • 通过就绪检查前完成服务预热:为应用无侵入提供55199端口用于检查微服务是否已经完成预热,如果已预热完成,端口返回200,否则返回500。

          说明

          若同时开启了通过就绪检查前完成服务注册、通过就绪检查前完成服务预热,则55199端口会检查服务是否已完成预热。

      无损下线

      本开关支持配置无损下线主动通知功能。开启后,应用在收到下线请求后,会主动通知消费方自己即将下线。

      说明
      • EDAS应用默认启用无损下线能力。

      • 需生产者和消费者均开启无损下线主动通知开关。

      • 确保集群中的ack-onepilot版本大于3.X,如果低于该版本,需升级。具体操作,请参见如何安装ack-onepilot和卸载arms-pilot

      • EDAS实现无损下线能力依赖应用的preStop探针。如果您的应用需自定义preStop探针,请在preStop探针中添加以下脚本:

        wget http://127.0.0.1:54199/offline; sleep 30;
    2. 展开限流降级配置,开启AHAS接入开关。

    重要

    单击确定后,该应用将会被重启,请在业务较少的时间段进行。

结果验证

在应用的变更记录页面中查看应用变更详情,如果显示执行成功,则表示部署成功,即配置已生效。

无损上线在应用部署后,可以查看预热效果。

  1. 登录AHAS控制台

  2. 在AHAS控制台左上角,选择应用接入的地域。

  3. 在控制台左侧导航栏中选择流量防护 > 应用防护

  4. 应用防护页面的应用卡片页签单击目标应用卡片。

  5. 在左侧导航栏中选择机器监控

  6. 机器监控页面,查看应用的预热效果。

    服务预热

    应用部署选择分批发布,并配置应用在部署时开启服务预热,同时应用接入AHAS,应用的预热效果示例如下:

    viewPrehotResult

    在稳定的业务流量下,可以看到新发布的应用所占流量比率呈预热曲线缓慢增长。

    无损上线功能通过配置应用的预热时长和预热曲线来控制新发布的应用流量百分比,用户可以根据业务需求按需配置预热时长,并根据程序复杂度控制预热曲线来调整应用刚启动时分配的流量权重,预热效果函数曲线如下:RreHotWeight

    应用部署时,配置不同的预热曲线效果展示示例如下:

    • 预热时长为120秒,预热曲线为2。prehot-120s2

    • 预热时长为120秒,预热曲线为5。prehot-120s5

    无损滚动发布

    开启无损滚动发布后能将微服务的生命周期与K8s的生命周期打通,在分批发布时选择配置服务预热并开启无损滚动发布,可以在发布过程中看到以下效果:

    • 新发布的应用接收的流量呈预热曲线缓慢增长。无损滚动-新应用

    • 旧的应用流量缓慢下降。无损滚动-旧应用

    在应用发布的过程中可在应用事件中看到Unhealthy告警事件,由于应用的就绪探针未检查通过,此时新旧版本实例共存,旧实例在预热过程中接收额外流量。在预热结束后,就绪探针请求返回200,旧实例才被删除以实现服务预热并打通与K8s的生命周期。告警事件

    延迟注册

    配置延迟注册后,能够让应用在启动后等待指定的延迟时间后再注册到注册中心以提供服务,能够给应用充分的启动时间,以避免应用未完全加载完成导致的流量损失。

    例如,配置应用单批部署时,同时配置300秒延迟注册和120秒服务预热,并开启应用无损滚动发布,效果如下:delayRegister

    在应用的变更记录页面中查看应用变更记录。changeResult

    可以看到应用在11:17:59进行变更,在11:24:44前新建的Pod都没有接收任何流量,且在11:24:44时间点后开始进行流量预热。观察应用变更事件能够找到Unhealthy告警事件。考虑到应用启动过程包含Pod调度、镜像拉取、程序启动等事件,从应用的发布时间到变更流程结束时间大致满足应用启动进行延迟注册和服务预热的时间。