对于基础设施来说,很多服务都有相似的架构、数据库交互和 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 格局定义的,这样咱们的动静代码生成模块就能够为零碎的各个局部生成代码。下图显示了这个过程:
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 文档理解更多细节。
因为 Terraform Provider 是一个结构良好的库,咱们的代码生成引擎能够基于 Jinja 模板生成基于 golang 的 Provider 程序,而后将这些代码构建到一个可插拔模块中,该模块能够装置到正在运行的 terraform 实例中。一旦实现,用户就能够在 GNS 服务上进行规范的 terraform 操作,就像任何其余服务一样。
论断
自动化任何网络服务所需的大部分工作曾经由咱们的代码生成引擎生成,从而容许咱们只专一于服务的外围逻辑。转向微服务体系架构以及采纳基于模板的代码生成和模型驱动的体系架构使咱们可能以更快的速度生产服务。在撰写本文时,咱们能够在一天之内实现任何服务的工作框架,从而帮忙团队能够专一于外围逻辑,并在更短的工夫内产生更多的服务。
References: \
[1] The Art of Automating Automation: https://medium.com/paypal-tech/the-art-of-automating-automati…你好,我是俞凡,在 Motorola 做过研发,当初在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。\
微信公众号:DeepNoMind
本文由 mdnice 多平台公布