Adobe服务运行时:微服务架构的规模化实践

本文详细介绍了Adobe Service Runtime(ASR)如何通过微服务底盘模式实现规模化生产,涵盖性能基准测试、安全特性、连接器设计和实际应用效果,为大型企业微服务架构提供宝贵经验。

Adobe服务运行时:保持冷静,向下迁移!

Adobe的微服务转型

Adobe从桌面应用程序向云服务的转型引发了微服务的爆炸式增长。无论是Acrobat、Photoshop还是Adobe Experience Cloud,都由主要用Java编写的微服务套件提供支持。

随着大量微服务的创建,每个开发人员都必须经历相同的痛苦过程(安全、合规、可扩展性、弹性等)来创建生产级微服务。这就是Adobe服务运行时的起源。

什么是ASR?

ASR(Adobe服务运行时)是微服务底盘模式的实现。Adobe超过80%的微服务使用ASR基础库。它提供了每个生产级微服务都应具备的横切关注点。

ASR库包含的横切关注点亮点:

  • Java和Python基础库:提供日志掩码、请求缝合、面包屑跟踪、异常处理、异步调用、弹性等功能
  • 点菜式库:用于与内部Adobe服务通信的ASR连接器库/SDK
  • 受祝福的基础容器:安全认证的容器,加速任何语言应用程序的容器采用
  • 引导代码和基础设施模板:快速入门
  • 固执己见的构建系统:如何构建Java应用程序、运行测试、启动调试设置并打包到容器中
  • 可配置的安全默认值:确保团队使用经过测试的基线开始

为什么选择ASR?

大型组织通常有严格的安全性、合规性、弹性和可扩展性要求。ASR提供了一套基础库、组件、工具和最佳实践(12要素),支持快速开发具有四个9能力、创新且安全的服务,同时支持容器优先的部署系统。

价值主张

我们对内部团队进行了研究,以得出ASR的价值主张:

类别 任务 使用ASR 不使用ASR
开发速度 选择框架和库、使其工作、设置项目结构和构建系统,解决依赖和构建问题 少于1小时 1-2周
开发速度 实现日志掩码、请求缝合等功能 所有功能"开箱即用" 4-6周
安全性 核心代码和库的法律和安全审查(不包括业务逻辑) 2-3天 3-6周
社区 强大的社区,支持服务团队对功能优先级进行分散决策 通用框架便于在项目间共享代码和开发人员 多样化框架使跨项目共享代码变得困难

使用ASR为开发人员节省了时间,并通过不重复造轮子提高了安全状况。

性能基准测试

RPS(每秒请求数)

我们进行了一些基准测试,以查看ASR是否比普通应用程序有任何开销。例如,我们运行了一个十分钟的Gatling脚本来模拟500个用户。

应用 请求/秒(RPS) ASR开销 响应时间(p95) ASR开销
非ASR 21678.506 n/a 46 n/a
ASR 23969.383 7% 48 4%

ASR过滤器

一些横切关注点作为过滤器提供,这可能会增加一些开销。我们的基线比较是20474.225的平均请求/秒。以下部分显示禁用各个过滤器时的性能变化:

  • ASR日志记录过滤器:禁用代价是ASR服务不会记录传入请求和传出响应。性能:平均请求/秒21260.143,提高3.8%
  • ASR异常过滤器:禁用代价是堆栈跟踪可能在异常中逃逸,违反ASSET。性能:平均请求/秒20988.308,提高2.5%
  • ASR请求ID过滤器:禁用代价是ASR服务不会为每个请求提供唯一的请求ID进行跟踪。性能:平均请求/秒21354.042,提高4.3%
  • ASR请求响应过滤器:禁用代价是ASR服务不会自动验证传入请求中的Authorization头。性能:平均请求/秒20896.923,提高2%

基准测试显示,与它提供的功能相比,使用ASR增加的开销很小。

安全性

CVE扫描通常会在大型组织的代码库中发现数百万个漏洞。如果Adobe开发人员必须手动修复每一个漏洞,他们将把大部分时间花在修补上而不是构建功能。通过提供安全默认值和强化组件,ASR作为一个基础库,减少了漏洞暴露并为开发人员节省了宝贵时间。

CVE处理

Log4J事件证明了ASR的成功。当CVE发布时,ASR用户只需升级到一个ASR版本。非ASR仓库不得不匆忙将其库从Log4j迁移出来。这清楚地展示了ASR在公司内部创造的显著乘数效应。

日志中的敏感数据

日志掩码是另一个在组织内经常被重新创建的热门功能。ASR带有一个模块化日志掩码库,可以掩码敏感信息。包含信用卡、SSN或任何Adobe定义的敏感信息的日志默认会自动掩码。开发人员还可以扩展它以自定义其他用例的掩码。这确保了所有应用程序中PII的一致保护。

ASR连接器和弹性

ASR具有连接器,可用于使用Adobe内部其他服务公开的API。ASR连接器是应用程序环境感知的,即连接器会根据应用程序环境自动选择正确的服务根URL。例如,如果应用程序在stage环境中运行,身份连接器将使用身份stage URL;当应用程序在prod环境中运行时,身份连接器将使用prod URL。这得益于ASR为所有连接器提供的自动配置。

微服务的挑战之一是不同服务遵守不同的SLA。您的服务可能有更高的标准,并且必须经常容忍其他服务。通过使用ASR连接器,微服务可以获得开箱即用的容错通信。ASR连接器利用Resilience4j实现这一点。每个连接器都带有弹性功能,如舱壁线程池、断路器、重试、指数退避等。

通过使用ASR连接器,微服务的状态得到了极大增强。线程池中的防护栏确保不会出现线程雪崩。通过默认使用重试,当依赖服务的可用性降低时,Adobe网络的压力大大减轻。这是将横切关注点下推到公共层如何释放大量价值并减少冗余的经典例子。

ASR在Adobe的采用

Adobe几乎每个Java服务都至少使用一个ASR库。ASR完整套件被Adobe 80%或大约7000多个服务使用,并且持续增长。随着使产品更具代理性的需求不断增长,我们看到对支持此类用例的库有强烈需求。ASR可以在实现伤害和偏见防护栏方面成为强大的乘数,这对当今公司和行业都高度相关。

保持冷静,向下迁移!

受左移的启发,下移是平台工程中的一种范式。许多横切关注点必须由平台开箱即用地管理和提供。平台用户可以专注于其功能,而不必担心Adobe设定的基线标准。ASR实现了规模化的下移理念。

由于最佳实践的中心化和ASR的规模化采用,安全团队和高管可以保持冷静。由于开销在基础层处理,开发人员也很轻松。

每个对开发人员生产力和卓越运营感兴趣的公司都应采用像ASR这样的下移策略。多年来,投资回报率不断复合,帮助公司在为开发人员旅程提供动力的铺平道路上快速前进。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计