对于基础设施来说,很多服务都有相似的架构、数据库交互和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多平台公布