自动化的艺术

简介: 自动化的艺术

对于基础设施来说,很多服务都有类似的架构、数据库交互和 UI,本文介绍了 Paypal 通过模板自动化基础设施微服务脚手架代码的实践,最大化节约了开发服务的时间并保证了服务的一致性。原文:The Art of Automating Automation[1]


简介


作为 PayPal 网站可靠性和云工程(SRCE, Site Reliability & Cloud Engineering)团队的一部分,我们一直致力于通过自动化提升效率。然而,编写能够让人凭直觉自动化完成工作的软件并不是一件简单的任务。在 PayPal 基础设施中,任何操作的自动化组件都必须提供最高级别的可靠性、安全性、效率和自助服务能力。本文我们将讨论如何在全球网络服务(GNS, Global Network Services)中实现自动化。


GNS 团队有大量的操作需要自动化,范围从需要几小时人力投入的普通任务,到需要运维团队投入很多天精力的复杂任务。对我们来说,最大的挑战是如何在不消耗大量开发周期的情况下自动化这些大大小小的操作,我们需要努力证明“ROI(投资回报)”的合理性,这点特别重要。


软件服务需求


要将任何网络功能转变为服务,需要完成以下一系列任务:


用户界面开发


  • 开放给 PayPal 开发社区的所有服务都必须具有某种形式的用户界面(UI),以便用户像使用任何其他服务一样使用网络。


数据库交互和表管理


  • 大多数服务需要设计数据库表以及编写数据库交互代码来操作数据。


核心业务逻辑


  • 需要编写和测试特定服务的实际业务逻辑。


与自动化工具 Terraform 集成


  • 我们的基础用户包括网络运营团队,他们不会使用基于 UI 的服务。相反,他们基于 GitOps 模式运作,这意味着我们开发的所有服务都需要通过开发 Terraform provider 与 Terraform 集成。


认证和授权


  • 这涉及到与标准的企业身份验证(如单点登录、多因素身份验证、角色管理等)的集成。


服务帐户,API 消费者的节流和限速


  • 我们决定为所有东西提供 API。因此,我们开发的所有服务都必须提供服务帐户,并确保能够节流和限速。


从上面的列表可以看出,构建一个可行的网络服务需要花费大量时间开发重要的外围组件。在理想情况下,我们能够只把时间花在编写核心业务逻辑上,而不做其他事情。通过两种方式,我们达到了编写更少代码的理想状态。


解决这个问题的第一种方法是迁移到真正的微服务组件以及构建可插拔的库架构,第二种方法是基于模板的自动代码生成,可以基于通用模板生成 UI、后端和数据库层代码。


代码生成


长期以来,数据建模一直是设计良好的软件产品的支柱。一旦确定了基本数据构建块,构建围绕数据工作的软件组件就比较容易了。如果数据是以标准格式获取的,那么围绕数据的各种软件组件就有很大的自动化空间。


这正是我们采用的方法。我们团队的所有项目都从识别数据模型开始。数据模型是用 YAML 格式定义的,这样我们的动态代码生成模块就可以为系统的各个部分生成代码。下图显示了这个过程:

image.png

GNS 软件架构


UI 代码生成


React 框架已经被包括 PayPal 在内的业界广泛采用。PayPal 应用程序团队有一个非常模块化的 React 库,用于构建面向客户的应用程序。我们以该库为基础,在任何合适的地方使用。


大多数系统程序员都不熟悉 UI 编程。为了促进快速 UI 组件开发,我们依赖于模型驱动设计。使用模型驱动设计,典型的 GNS 开发人员只需指定 UI 布局,不用编写任何 UI 代码。


GNS 代码生成引擎采用用户定义的模型,并使用 React 框架,生成一个独立的 React 代码容器,带有功能完整的 UI。这种方法允许开发人员专注于应用程序的业务逻辑。


后端代码生成


过去,开发提供 REST API 功能的微服务非常繁琐,开发人员需要为每个端点编写软件并配置 web 服务网关。然而,Flask 框架作为标准框架已经得到了 Python 开发人员的广泛认可。类似的,Golang 除了内置支持之外,还有 gorilla/mux 框架。


大多数 GNS 服务是用 Golang 或 Python 编写的。我们在上述框架的帮助下,设计了基于 Jinja 模板生成通用代码的 GNS 代码生成引擎。


基于以 YAML 格式定义的数据模型,代码生成引擎使用预定义的 Jinja 模板来生成服务的基础代码。GNS 开发人员可以在这些代码的基础上实现精确的业务逻辑,从而减少编程错误,并消除从头编写所有内容的乏味工作。


数据库层代码生成


大多数 GNS 服务需要某种形式的数据库来存储建模阶段所描述的信息。编写代码来添加、删除和修改数据库中的条目是很繁琐的,而且容易出现 bug、风格不统一等。Python 和 Golang 拥有处理对象关系映射(ORM, Object Relationship Mapper )的开源库,我们选择采用 sqlalchemy 来规范化数据库操作。


由于模型是用 YAML 格式定义的,我们的代码生成引擎除了生成后端代码外,还生成数据库处理方法。


Terraform Provider 代码生成


Terraform 已经成为自动化基础设施的最常用工具。作为 GNS 服务提供商,我们已经决定所有自动化服务都将有针对 Terraform 的接口,从而能够适配正被不断采用的持续部署流水线。


Terraform 体系架构灵活且方便扩展,能够为我们喜欢的任何自动化添加 Provider。请参阅 terrform 文档了解更多细节。


image.png

Terraform Provider 架构


由于 Terraform Provider 是一个构造良好的库,我们的代码生成引擎可以基于 Jinja 模板生成基于 golang 的 Provider 程序,然后将这些代码构建到一个可插拔模块中,该模块可以安装到正在运行的 terraform 实例中。一旦完成,用户就可以在 GNS 服务上进行标准的 terraform 操作,就像任何其他服务一样。


结论


自动化任何网络服务所需的大部分任务已经由我们的代码生成引擎生成,从而允许我们只专注于服务的核心逻辑。转向微服务体系架构以及采用基于模板的代码生成和模型驱动的体系架构使我们能够以更快的速度生产服务。在撰写本文时,我们可以在一天之内完成任何服务的工作框架,从而帮助团队可以专注于核心逻辑,并在更短的时间内产生更多的服务。


References:

[1] The Art of Automating Automation: https://medium.com/paypal-tech/the-art-of-automating-automation-17b32594a41f

目录
相关文章
|
2月前
|
测试技术 持续交付 API
软件测试的艺术:从基础到高级的探索之旅
本文通过一个新手QA工程师小张的成长故事,展现了软件测试的丰富世界。从最初的困惑和迷茫,到逐步掌握测试的基本原则、设计策略,再到深入理解自动化测试的精髓,小张的经历象征着每一位测试人员技能提升的旅程。文章旨在鼓励所有软件测试从业者不断学习和成长,以适应不断变化的技术环境。
|
8天前
|
搜索推荐 开发者 UED
技术与艺术的碰撞:探索软件开发中的美学##
【10月更文挑战第29天】 在本文中,我们将探讨软件开发不仅是一种技术实践,更是一门艺术。通过分析软件设计、用户体验和代码质量的重要性,本文旨在揭示如何在编程过程中融入美学元素,从而提升软件的整体质量和用户满意度。 ##
31 4
|
14天前
|
测试技术 持续交付
软件测试的艺术:从基础到精通
在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着软件应用的广泛性,软件测试的重要性也日益凸显。本文将深入探讨软件测试的基本概念、重要性以及如何从基础到精通掌握软件测试的技能。我们将通过分析软件测试的不同阶段、方法和工具,帮助读者理解并提升自己的软件测试能力。
|
1月前
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
【10月更文挑战第3天】在软件开发的海洋里,自动化测试犹如一艘航船,引领着项目向着质量的彼岸航行。本文将揭开自动化测试框架的神秘面纱,从理论到实践,深入浅出地探讨如何构建和运用这一工具,确保软件产品的稳定性和可靠性。我们将通过一个实际案例,展示自动化测试框架的搭建过程,以及它如何在提高测试效率、减少人力成本等方面发挥巨大作用。无论你是测试新手还是资深开发者,这篇文章都将为你提供宝贵的知识和启示。
|
3月前
|
监控 测试技术 Python
软件测试的艺术与科学:探索测试自动化的奥秘
【8月更文挑战第30天】在软件开发的海洋中,测试是那把确保航船不偏离航线的罗盘。本文将带您一探究竟,从测试的基础到高级自动化策略,揭示如何通过代码和工具提升测试效率。准备好启航,因为我们将深入探讨软件测试的核心,以及如何利用自动化技术来优化您的测试流程。
25 4
|
3月前
|
jenkins 测试技术 持续交付
探索软件测试的艺术:从基础到高级
【8月更文挑战第27天】在软件开发的世界中,测试是确保产品稳定性和可靠性的关键步骤。本文将深入探讨软件测试的多个方面,包括基本概念、测试类型、测试用例设计方法,以及如何利用自动化工具提高测试效率。通过具体的代码示例,我们将展示如何在真实场景中应用这些测试技术,帮助读者构建更稳固的软件产品。
|
3月前
|
测试技术
软件测试的艺术与科学:探索自动化测试的最佳实践
【8月更文挑战第31天】在软件开发的海洋中,测试是确保航船稳健前行的罗盘。本文将带你揭开软件测试的神秘面纱,深入探讨自动化测试的魅力和挑战。我们将一起航行于代码的波浪之中,学习如何构建稳固的测试框架,以及如何利用这些框架来捕捉那些潜藏在深处的缺陷。加入我们,让我们一起提升软件质量,确保每一次航行都能抵达成功的彼岸。
|
3月前
|
Web App开发 安全 测试技术
软件测试的艺术:探索自动化测试框架
【8月更文挑战第31天】在软件开发的海洋中,测试是确保船只安全航行的灯塔。本文将带你领略自动化测试框架的魅力,通过深入浅出的方式,让你快速掌握如何搭建和运用这一工具来提升软件质量。我们将从基础概念讲起,逐步深入到实战应用,最终实现代码与理论的完美结合。让我们启航,共同探索自动化测试的世界!
|
4月前
|
数据采集 算法 大数据
代码之舞:探索软件开发的艺术与科学
在软件工程的广阔天地里,编程不仅仅是一系列指令的堆砌,它更像是一场精心编排的舞蹈。本文将深入探讨软件开发中的艺术性和科学性如何交织在一起,通过实际案例分析,揭示高效编码背后的逻辑美学和创造性思维。我们将一同穿梭于代码行间,体验技术与创新的完美融合,感受那些让软件项目从平凡走向卓越的微妙之处。 【7月更文挑战第21天】
58 1
|
3月前
|
安全 测试技术 定位技术
探索式测试:软件质量保证的艺术与科学
在软件开发的海洋中,探索式测试是一艘灵活的帆船,它允许测试人员像探险家一样,在没有明确地图的情况下发现未知的错误和漏洞。本文将揭示探索式测试背后的原理,探讨它如何与传统的脚本测试方法相辅相成,并通过实例分析其在现代软件开发生命周期中的关键作用。
25 0