全链路灰度新功能:MSE 上线配置标签推送

背景

微服务场景下,全链路灰度作为一种低成本的新功能验证方式,得到了越来越广泛的应用。除了微服务实例和流量的灰度,微服务应用中的配置项也应该具备相应的灰度能力,以应对灰度应用对特殊配置的诉求。

为什么需要配置标签推送

从全链路灰度谈起

在微服务场景中,应用的灰度发布迎来了新的挑战。不同于单体架构中将应用整体打包即可发布测试版本,微服务应用往往由多个服务组合而成。这些服务通常由不同的团队负责,独立进行开发。一个新功能通常只涉及到部分服务,在测试新特性时,我们只需要对这部分服务进行发布即可。为了让微服务应用正常运行,还需要设计一种方案,让灰度流量也能正常经过其他不需要发布的服务。

这一功能通常有物理环境隔离和逻辑环境隔离两种解决方案。前者需要为每套灰度环境都搭建一套网络隔离、资源独立的环境,为了应用能正常运行,还需要在环境中为未被灰度到的服务、各种中间件等做冗余发布,如图所示:

物理环境隔离这一方案存在着大量的机器资源浪费。因此业界普遍采用后者,即逻辑环境隔离的方式做为全链路灰度的解决方案。只需部署灰度服务,通过调用链路上的流量控制使得灰度流量能在灰度环境和正式环境间流转,实现灰度微服务应用的正常运行,帮助业务方进行新功能验证。如图所示:

配置灰度的应用场景

在许多业务场景中都可能涉及到配置灰度能力的应用,下面是几个典型场景。

  • 金丝雀发布

金丝雀发布已经在业界广泛落地,是新版本发布的常用手段。金丝雀发布会对流量进行比例分隔,一开始为新版本的实例分配较小比例的流量,经过一段时间的运行,确认新版本运行正常后再逐步提高所分配流量的比例,直到最终全量切流。通过这种方式做发布可以在新版本出现问题时控制影响面,提高系统的稳定性。

金丝雀发布通常通过流量染色和机器打标来实现。新版本的机器被打上金丝雀版本标记,同时让部分流量携带上金丝雀版本标记,最终还是演变成全链路灰度的解决方案。金丝雀版本的应用中的配置项可能需要使用和旧版本中不同的配置值,这就需要配置灰度的能力。

  • 新功能上线

在改动涉及较大的功能上线时,往往会通过逐步放量的方式来验证功能的稳定性。一种典型的放量方式就是白名单,即配置在白名单中的用户/设备可以使用新功能,未在白名单中的用户仍然使用旧版本。在线上运行一段时间后收集白名单用户的反馈,对功能做优化的同时逐步增加白名单中的用户/设备数,等功能到达最终的稳定状态后再全量发布。

来自于白名单中的用户/设备会被打上特殊的标记,被路由到灰度环境中。如果新功能中的配置需要使用不同于旧版本中的配置值,就需要同步用到配置灰度。

  • 数据库迁移

数据库迁移也是业务发展中的常见问题。随着业务的快速增长,原有的数据库可能在容量/性能上都不再能满足未来的业务需要,这时就需要做数据库迁移。为了保证迁移过程的稳定性,迁移通常是渐进式的,这个过程中会存在部分流量写新库,部分流量写老库,待迁移完全完成后再将所有流量切到新库上。迁移过程中我们可以通过流量染色配合配置灰度来实现对不同数据库的操作。

问题及解决方案

微服务应用通常会引入配置中心做配置管理,其提供动态的配置推送能力使得应用无需重启就可以动态地改变运行逻辑。然而配置中心的管理维度仅仅是配置项本身,并不能感知到前来获取配置的服务实例的环境信息,即无法区分请求配置的是正式环境的实例还是灰度环境的实例。在这种背景下,如果某项配置在正式环境和灰度环境中需要使用不同值,它们在配置中心中必须作为不同的配置项,我们可能需要写出这样的代码:

...
if (env == "gray") {cfg = getConfig('cfg1');
} else {cfg = getConfig('cfg2');
}
...

假如有多个配置项在灰度环境中存在不同的配置值,这样的代码还需要重复多次。更极端的场景下,如果在测试的灰度环境还有多套,每套环境中的配置值都不同,负责获取配置项的代码还会更复杂。此外,一套灰度环境中往往存在多个服务,每个服务都需要独立维护一套类似的代码。最终的解决方案如图所示,同一配置项在不同环境中使用的配置值需要在用户应用中主动进行区分。

究其原因,还是来自于配置中心无法感知服务实例的环境信息,使得我们必须在代码中代替配置中心行使这一任务,从而导致了环境信息对业务代码产生了侵入。尽管我们可以通过对获取配置的代码做一些封装来降低业务代码的使用复杂度,但只要配置中心无法感知服务实例的环境信息这一事实存在,这种环境信息对业务代码的侵入性就无法避免。

功能介绍

MSE 新上线的配置标签推送功能将配置管理场景下的环境信息的感知下沉到平台侧,由 Agent 负责。用户只需接入 MSE,就可轻松在全链路灰度场景中使用配置推送能力,免去业务代码中繁琐的环境信息检测逻辑。如图所示:

配置标签推送提供的功能包括:

  • 标签维度的配置管理

在配置列表页中可以查看应用中的各种配置项。目前 MSE 支持对三类配置进行采集:

    1. 使用 SDK 提供的注解@Switch 标记的配置类
    2. 使用 Spring 的注解 @Value 标记的配置项
    3. 使用 SpringBoot 的注解 @ConfigurationProperties 标记的配置类

每个配置项下会展示所有服务实例的配置值,用户可以通过标签名直观地看到不同实例所处的灰度环境,还可以查看不同灰度环境下的配置值分布

  • 标签维度的应用配置推送能力

通过“按标签推送”,用户可以便捷地为指定灰度环境中的所有服务实例推送持久化的新配置值。持久化意味着即使应用重启,针对该环境的配置项也不会丢失。

  • 配置场景下的实例动态打标

除了在应用启动时通过 MSE 的打标方式为服务实例设置标签,用户可以在 MSE 控制台动态地为服务实例新增/删除标签,以适配不同灰度环境下的配置项管理。

  • 围绕整个配置标签推送流程的溯源能力

MSE 为标签推送提供了全流程的溯源能力,包括实例标签变动记录,标签推送记录,帮助用户便捷地排查标签推送流程中的问题。

配置标签推送实践

接下来,我们通过实践来演示配置标签推送的使用流程,只需简单的三步即可完成。

  • 准备工作
  1. 将应用接入 MSE 微服务治理
  2. 进入 MSE 控制台,选择地域
  3. 进入 治理中心 > 应用治理,进入刚刚接入的应用
  • Step 1:新增标签

配置标签推送的第一步是为服务实例设置标签。服务实例的标签可以在启动时通过 -Dalicloud.service.tag 设置,同时也可以在 MSE 控制台动态设置。

接下来我们演示为服务实例动态打标的过程。选择 应用配置 > 标签列表,这里会展示当前应用下所有的服务实例。点击左上角的“新增标签”按钮,在弹出的节点打标窗口中我们可以选择一批服务实例进行打标。用户可以通过节点 IP 来筛选需要打标的实例。除了按节点 IP 筛选,MSE 提供了按主机名称筛选服务实例的能力。选中需要打标的机器后,输入标签的名称,点击“新增标签”即可完成机器打标。

  • Step 2:按标签推送

完成机器打标后,我们可以为指定的标签推送配置值。回到 应用配置 > 配置列表,选择“customName”配置项,点击“按标签推送”。在弹出的推送窗口中,我们选择需要推送的标签,并设置待推送的配置值,点击“下一步:值对比”,可以看到新老配置项的差异。之后点击“标签推送”,完成配置下发。

背景

微服务场景下,全链路灰度作为一种低成本的新功能验证方式,得到了越来越广泛的应用。除了微服务实例和流量的灰度,微服务应用中的配置项也应该具备相应的灰度能力,以应对灰度应用对特殊配置的诉求。

为什么需要配置标签推送

从全链路灰度谈起

在微服务场景中,应用的灰度发布迎来了新的挑战。不同于单体架构中将应用整体打包即可发布测试版本,微服务应用往往由多个服务组合而成。这些服务通常由不同的团队负责,独立进行开发。一个新功能通常只涉及到部分服务,在测试新特性时,我们只需要对这部分服务进行发布即可。为了让微服务应用正常运行,还需要设计一种方案,让灰度流量也能正常经过其他不需要发布的服务。

这一功能通常有物理环境隔离和逻辑环境隔离两种解决方案。前者需要为每套灰度环境都搭建一套网络隔离、资源独立的环境,为了应用能正常运行,还需要在环境中为未被灰度到的服务、各种中间件等做冗余发布,如图所示:

物理环境隔离这一方案存在着大量的机器资源浪费。因此业界普遍采用后者,即逻辑环境隔离的方式做为全链路灰度的解决方案。只需部署灰度服务,通过调用链路上的流量控制使得灰度流量能在灰度环境和正式环境间流转,实现灰度微服务应用的正常运行,帮助业务方进行新功能验证。如图所示:

配置灰度的应用场景

在许多业务场景中都可能涉及到配置灰度能力的应用,下面是几个典型场景。

  • 金丝雀发布

金丝雀发布已经在业界广泛落地,是新版本发布的常用手段。金丝雀发布会对流量进行比例分隔,一开始为新版本的实例分配较小比例的流量,经过一段时间的运行,确认新版本运行正常后再逐步提高所分配流量的比例,直到最终全量切流。通过这种方式做发布可以在新版本出现问题时控制影响面,提高系统的稳定性。

金丝雀发布通常通过流量染色和机器打标来实现。新版本的机器被打上金丝雀版本标记,同时让部分流量携带上金丝雀版本标记,最终还是演变成全链路灰度的解决方案。金丝雀版本的应用中的配置项可能需要使用和旧版本中不同的配置值,这就需要配置灰度的能力。

  • 新功能上线

在改动涉及较大的功能上线时,往往会通过逐步放量的方式来验证功能的稳定性。一种典型的放量方式就是白名单,即配置在白名单中的用户/设备可以使用新功能,未在白名单中的用户仍然使用旧版本。在线上运行一段时间后收集白名单用户的反馈,对功能做优化的同时逐步增加白名单中的用户/设备数,等功能到达最终的稳定状态后再全量发布。

来自于白名单中的用户/设备会被打上特殊的标记,被路由到灰度环境中。如果新功能中的配置需要使用不同于旧版本中的配置值,就需要同步用到配置灰度。

  • 数据库迁移

数据库迁移也是业务发展中的常见问题。随着业务的快速增长,原有的数据库可能在容量/性能上都不再能满足未来的业务需要,这时就需要做数据库迁移。为了保证迁移过程的稳定性,迁移通常是渐进式的,这个过程中会存在部分流量写新库,部分流量写老库,待迁移完全完成后再将所有流量切到新库上。迁移过程中我们可以通过流量染色配合配置灰度来实现对不同数据库的操作。

问题及解决方案

微服务应用通常会引入配置中心做配置管理,其提供动态的配置推送能力使得应用无需重启就可以动态地改变运行逻辑。然而配置中心的管理维度仅仅是配置项本身,并不能感知到前来获取配置的服务实例的环境信息,即无法区分请求配置的是正式环境的实例还是灰度环境的实例。在这种背景下,如果某项配置在正式环境和灰度环境中需要使用不同值,它们在配置中心中必须作为不同的配置项,我们可能需要写出这样的代码:

...
if (env == "gray") {cfg = getConfig('cfg1');
} else {cfg = getConfig('cfg2');
}
...

假如有多个配置项在灰度环境中存在不同的配置值,这样的代码还需要重复多次。更极端的场景下,如果在测试的灰度环境还有多套,每套环境中的配置值都不同,负责获取配置项的代码还会更复杂。此外,一套灰度环境中往往存在多个服务,每个服务都需要独立维护一套类似的代码。最终的解决方案如图所示,同一配置项在不同环境中使用的配置值需要在用户应用中主动进行区分。

究其原因,还是来自于配置中心无法感知服务实例的环境信息,使得我们必须在代码中代替配置中心行使这一任务,从而导致了环境信息对业务代码产生了侵入。尽管我们可以通过对获取配置的代码做一些封装来降低业务代码的使用复杂度,但只要配置中心无法感知服务实例的环境信息这一事实存在,这种环境信息对业务代码的侵入性就无法避免。

功能介绍

MSE 新上线的配置标签推送功能将配置管理场景下的环境信息的感知下沉到平台侧,由 Agent 负责。用户只需接入 MSE,就可轻松在全链路灰度场景中使用配置推送能力,免去业务代码中繁琐的环境信息检测逻辑。如图所示:

配置标签推送提供的功能包括:

  • 标签维度的配置管理

在配置列表页中可以查看应用中的各种配置项。目前 MSE 支持对三类配置进行采集:

    1. 使用 SDK 提供的注解@Switch 标记的配置类
    2. 使用 Spring 的注解 @Value 标记的配置项
    3. 使用 SpringBoot 的注解 @ConfigurationProperties 标记的配置类

每个配置项下会展示所有服务实例的配置值,用户可以通过标签名直观地看到不同实例所处的灰度环境,还可以查看不同灰度环境下的配置值分布

  • 标签维度的应用配置推送能力

通过“按标签推送”,用户可以便捷地为指定灰度环境中的所有服务实例推送持久化的新配置值。持久化意味着即使应用重启,针对该环境的配置项也不会丢失。

  • 配置场景下的实例动态打标

除了在应用启动时通过 MSE 的打标方式为服务实例设置标签,用户可以在 MSE 控制台动态地为服务实例新增/删除标签,以适配不同灰度环境下的配置项管理。

  • 围绕整个配置标签推送流程的溯源能力

MSE 为标签推送提供了全流程的溯源能力,包括实例标签变动记录,标签推送记录,帮助用户便捷地排查标签推送流程中的问题。

配置标签推送实践

接下来,我们通过实践来演示配置标签推送的使用流程,只需简单的三步即可完成。

  • 准备工作
  1. 将应用接入 MSE 微服务治理
  2. 进入 MSE 控制台,选择地域
  3. 进入 治理中心 > 应用治理,进入刚刚接入的应用
  • Step 1:新增标签

配置标签推送的第一步是为服务实例设置标签。服务实例的标签可以在启动时通过 -Dalicloud.service.tag 设置,同时也可以在 MSE 控制台动态设置。

接下来我们演示为服务实例动态打标的过程。选择 应用配置 > 标签列表,这里会展示当前应用下所有的服务实例。点击左上角的“新增标签”按钮,在弹出的节点打标窗口中我们可以选择一批服务实例进行打标。用户可以通过节点 IP 来筛选需要打标的实例。除了按节点 IP 筛选,MSE 提供了按主机名称筛选服务实例的能力。选中需要打标的机器后,输入标签的名称,点击“新增标签”即可完成机器打标。

  • Step 2:按标签推送

完成机器打标后,我们可以为指定的标签推送配置值。回到 应用配置 > 配置列表,选择“customName”配置项,点击“按标签推送”。在弹出的推送窗口中,我们选择需要推送的标签,并设置待推送的配置值,点击“下一步:值对比”,可以看到新老配置项的差异。之后点击“标签推送”,完成配置下发。

可以看到配置项已经被成功推送到了两个带有“gray”标签的机器实例上。

之后,我们对“gray2”标签也执行同样的操作,推送“testGray2”配置值。

针对标签的配置值推送都是持久化的。用户只需要在控制台上操作一次,之后指定标签的服务实例重启时 MSE 会通过 Agent 将持久化的配置值下发到应用。

  • Step 3:查看配置值分布

回到 应用配置 > 配置列表,选择“customName”配置项,我们可以看到刚刚为标签“gray”和“gray2”推送的两个配置值都已经生效。

点击“值分布”。在弹出的窗口中可以看到该配置项的配置值在所有机器实例上的分布,也能看到其在不同标签下的持久化值。

结束语

本文介绍了全链路灰度场景给配置管理带来的问题,介绍了 MSE 针对这一场景的解决方案,并通过实践的方式展示了配置标签推送的使用流程。后续,MSE 还会针对配置治理做更多的探索,帮助用户更好地解决微服务配置管理中的难题,提高微服务应用的稳定性。

作者:洵沐、流士

原文链接

本文为阿里云原创内容,未经允许不得转载。

可以看到配置项已经被成功推送到了两个带有“gray”标签的机器实例上。

之后,我们对“gray2”标签也执行同样的操作,推送“testGray2”配置值。

针对标签的配置值推送都是持久化的。用户只需要在控制台上操作一次,之后指定标签的服务实例重启时 MSE 会通过 Agent 将持久化的配置值下发到应用。

  • Step 3:查看配置值分布

回到 应用配置 > 配置列表,选择“customName”配置项,我们可以看到刚刚为标签“gray”和“gray2”推送的两个配置值都已经生效。

点击“值分布”。在弹出的窗口中可以看到该配置项的配置值在所有机器实例上的分布,也能看到其在不同标签下的持久化值。

结束语

本文介绍了全链路灰度场景给配置管理带来的问题,介绍了 MSE 针对这一场景的解决方案,并通过实践的方式展示了配置标签推送的使用流程。后续,MSE 还会针对配置治理做更多的探索,帮助用户更好地解决微服务配置管理中的难题,提高微服务应用的稳定性。

作者:洵沐、流士

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdu3527spy(STL,map)

Description The NationalIntelligence(情报工作) Council(委员会) of X Nation receives a piece ofcredible(可靠的) informationthat Nation Y will send spies(间谍) to stealNation X’s confidential(机密的) paper. So thecommander(指挥官) of TheNational Intelligen…

万节点规模云服务的 SRE 能力建设

背景及现状 系统架构简介 上图为阿里云内部实际使用的系统架构,系统主要用途为实时数据流的计算和存储。使用阿里云的容器服务 ACK 作为系统底座,容器化的部署、发布、管控等全部基于 K8s 标准。使用自己开发的 Gateway service 作为系统流量入口&#…

HDU 3532 Max Angle(计算几何——极角排序)

Description Given manypoints in a plane, two players are playing an interesting game. Player1 selects one point A as the vertex(顶点) of an angle. Then player2 selects other two points Band C. A, B and C are different with each other. Now they get an an…

阿里云 ACK 容器服务生产级可观测体系建设实践

ACK 可观测体系介绍 全景概要介绍 上图为 ACK 可观测体系全景图金字塔,从上至下可分为四层: 最上层是最接近用户业务的 Business Monitoring,包括用户业务的前端的流量、PV、前端性能、JS 响应速度等监控。通过容器服务的 IngressDashboard…

中仑网络全站 Dubbo 2 迁移 Dubbo 3 总结

中仑网络在 2022 年完成了服务框架从 Dubbo 2 到 Dubbo 3 的全站升级,深度使用了应用级服务发现、Kubernetes 原生服务部署、服务治理等核心能力。来自中仑网络的技术负责人来彬彬对整个 Dubbo 3 的选型、升级过程及收益等做了深入总结。 来彬彬,2020 年…

hdu3526(最小费用流)

Description Xiao A isbecoming more and more unsatisfied with his computer since he is learninghacker(黑客技术) technologiesthese days but his computer always fails whenever he changes the configurationsof the NIC. He buys a new NIC but the motherboard doe…

hdu3530Subsequence【单调队列优化dp】2010多校联合

Description There is asequence(顺序,序列) of integers.Your task is to find the longest subsequence(子序列) that satisfies the following condition: the differencebetween the maximum element and the minimum element of the subsequence is nosmaller…

基于 OpenYurt 和 EdgeX 的云边端协同新可能

2022 EdgeX 中国挑战赛暨中关村国际前沿科技创新大赛 EdgeX 专题赛正式拉开帷幕。本次大赛分设两大赛道:医疗、教育、消费行业赛道和能源、工业、供应链赛道。大赛致力于构建一个物联网及边缘计算的学习和分享平台,基于 EdgeX Foundry、OpenYurt 等开源技…

OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓

9月16日,OSCAR 2022 开源产业大会在京召开,会议由中国信息通信研究院、中国通信标准化协会主办,中国通信标准化协会云计算标准和开源推进委员会承办。此次会议以“千行百业 可信开源”为主题,邀请上百位专家大咖和国内主流的开源社…

C链表(顺序表、静态链表区别)

#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 1000 //线性表存储空间的初始分配量 #define LISTINCRESEMENT 100 //线性表存储空间的分配增量 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int elemType;//元素类型…

HDU3534 给你一个树让你找出其中最长路径以及个数数

Description In the Datastructure class of HEU, the teacher asks one problem: How to find the longestpath(路径) of one treeand the number of such longest path? Input There are several test cases. The firstline of each case contains only one integer N, m…

国庆训练赛

Description Consider the following programming language. This language contains only two types of statements: simple statements and compound statements. The simple statement is in the form “write (literal)”, where “write” is a key word indicating that …

App 隐私合规“免费”自动化检测

一、为什么要进行App隐私合规检测 2021年11月1日《个人信息保护法》正式生效&#xff1b;今年6月14日&#xff0c;国家互联网信息办公室公布《移动互联网应用程序信息服务管理规定》&#xff0c;这是针对App的最强监管新规&#xff0c;于8月1日起正式实施。新规要求应用程序提…

POJ3420 Quad Tiling(模板+矩阵快速幂)

Quad Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4107 Accepted: 1878 Description Tired of(厌烦) the Tri Tiling gamefinally, Michael turns to(转向) a morechallengeable game, Quad Tiling: In how many ways can you tile(铺瓷砖) a 4 …

跨模态学习能力再升级,EasyNLP 电商文图检索效果刷新 SOTA

导读 多模态内容&#xff08;例如图像、文本、语音、视频等&#xff09;在互联网上的爆炸性增长推动了各种跨模态模型的研究与发展&#xff0c;支持了多种跨模态内容理解任务。在这些跨模态模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#x…

EasyNLP 带你实现中英文机器阅读理解

导读 机器阅读理解是自然语言处理&#xff08;NLP&#xff09;&#xff0c;特别是自然语言理解&#xff08;NLU&#xff09;领域最重要的研究方向之一。自1977年首次被提出以来&#xff0c;机器阅读理解已有近50年的发展史&#xff0c;历经“人工规则”、“传统机器学习”、“…

开关问题(模板+高斯消元)

开关问题Time Limit: 1000MS Memory Limit: 30000KTotal Submissions: 7771 Accepted: 3058 Description 有N个相同的开关&#xff0c;每个开关都与某些开关有着联系&#xff0c;每当你打开或者关闭某个开关的时候&#xff0c;其他的与此开关相关联的开关也会相应地发生变化&am…

一文剖析 PolarDB HTAP 的列存数据压缩

前言 数据库迁移上云是大数据时代的一大趋势&#xff0c;PolarDB MySQL是阿里云自研的云原生数据库&#xff0c;主要处理在线事务负载(OLTP, OnLine Transactional Processing)&#xff0c;深受企业用户的青睐。当下&#xff0c;数据分析对于企业的重要性越发显著&#xff1a;…

技术解读:现代化工具链在大规模 C++ 项目中的运用

编者按&#xff1a;C 语言与编译器一直都在持续演进&#xff0c;出现了许多令人振奋的新特性&#xff0c;同时还有许多新特性在孵化阶。除此之外&#xff0c;还有许多小更改以提高运行效率与编程效率。本文整理自全球 C 及系统软件技术大会上的精彩分享&#xff0c;接下来由作者…

扩展的欧几里得算法

任务&#xff1a; 求出A,B的最大公约数&#xff0c;且求出X&#xff0c;Y满足AXBYGCD(A,B). 模板代码&#xff1a; int extendGcd(int a,int b,int &x,int &y) {if(!b){x1;y0;return a;}else{int rextendGcd(b,a%b,y,x);y-x*(a/b);return r;} }