[大厂实践] Chick-fil-A的服务API流程实践

本文介绍了美国快餐连锁巨头Chick-fil-A在技术团队中引入Buf和Connect解耦API依赖并实现了良好的API定义模式。原文: Connect(ing) Chick-fil-A

背景

2018年,Chick-fil-A的客户技术团队遇到了一些API问题。该团队擅长构建API,这些API可以实现一些了不起的事情,比如将客户订单从手机通过迷宫般的网络发送到销售点的遗留系统,但与这些API交互需要团队之间的大量协作。更准确的说,我们遇到的是API契约问题。团队很少有明确、完备的合约。大多数合约要么缺乏文件记录,要么完全不明确。这在我们电子商务项目最初几年的创业环境中可以预料。我们团队最初在2016年推出了移动应用和电子商务平台,由于营销团队的努力以及新冠疫情的影响,电商业务从很小的一部分增长到销售额的重要部分。

随着业务越来越成熟,缺乏明确的、记录良好的合约就成了一个问题。前端开发人员经常需要直接联系后端开发人员,以确定某个值是否应该作为字符串或整数传递,或者某个字段是否真的需要。后端开发人员要么依赖记忆,要么必须深入研究源代码,以了解后端在做什么、需要什么、什么类型等等。这是一个显而易见的问题。随着团队数量增加,情况变得越来越糟。我们的目标是优化以"X-as-a-service"模式运行的团队,这种模式只需要团队之间有限的合作就可以集成。相反,我们发现所有团队都在"协作"交互模式下操作(参见: 团队拓扑[1])。

改变

所以你可能会想:"为什么不把合约文件写得更好呢?"公平的说,我们当然是这样做的。我们从团队编写简单的markdown文件开始,这些markdown文件以直接从Basecamp API文档中提取的方式深入介绍他们的API(感谢Jason Fried)。这对我们来说很有效,特别适用于拥有技术分析师的团队,这些技术分析师可以帮助消除开发人员必须清理历史文档的一些负担。然而,这个过程并没有应用于各个团队,并且严重依赖于人的记忆来确保文档保持最新。举个例子,我们的Location API团队有一个强大的技术分析师来保存文档,但是许多团队没有相同的技能。这一尝试帮助我们将几个关键API做得更好,但给团队增加了许多开销,并且仍然可能出现不可接受的人为错误。

尝试了几个月之后,我们渴望找到一个更适合我们组织的方法。我们开始寻找其他选择:

  • 靠近代码(Proximity to code): 这是必须的。文档离代码(真实来源)越远,它在脆弱曲线上的位置就越远。我们发现,脆弱的文档可能会导致比单独依赖协作更糟糕的结果。
随时间变化的文档脆弱性
随时间变化的文档脆弱性
  • 功能所有权(Functional ownership): 如果技术后端系统的产品所有者拥有的"经验"是API(强调接口),那么他们的客户是前端团队和其他后端团队,而不是传统的Chick-fil-A客户。因此,为了更好的为客户服务,这些API团队的SLO应该是基于可测量的东西,比如P95延迟和可用性,而不是像开发人员体验和易于集成这样难以测量的目标。但是,如果产品负责人对这些"模糊"的东西缺乏可视性,那就没有真正的所有权。将它们从代码中抽象出来,放到产品负责人可以可视化的视图中,他们就可以更好的负责整个产品。

  • 契约优先的规范接口定义(Contract-first, canonical interface definitions): 这是迄今为止我们所尝试的最不一样的东西。我们需要引导契约,而不是简单的从后端实现的类中派生。在处理隐式契约时,很容易发生复制传递,例如前端团队认为客户标识符字段命名为customerId,而实际上后端团队将其命名为userId。哦,不是说我们做过这种蠢事,但理论上可能会发生。如果我们能够推动接口定义规范化,那将是一大步。生成的SDK是首选,这样就无法引入错误。

有了这些启发,我们开始评估几种技术,这些技术已经帮助数百个组织解决了同样的问题。

GraphQL

GraphGQ有很多让人喜欢的地方。这是一项引人注目的技术,具有许多附加功能,特别是如果API是基于Node.js构建的时候。因为我们的API主要用Java和Go构建,所以工具支持并不像Node.js那样完善,而且服务器到服务器调用的人机工程让人感觉不舒服。此外,当我们可以同时控制前端和后端实现时,灵活性所带来的好处就不那么有价值了。

OpenAPI规范

OpenAPI几乎征服了我们,我们用在DTT(数字转换和技术,Digital Transformation & Technology)部门的其他部分。我们已经通过Springfox使用了Swagger。然而,我们并没有充分利用Swagger注释,这使得我们的文档感觉平淡无奇。零星注释也会让代码感觉有点混乱,并把所有责任都推给开发人员去更新。这可以通过团队流程和整体期望来解决,但没有给API功能的所有者足够的控制权。

gRPC

gRPC是Google设计的一个远程过程调用框架,有一些非常引人注目的优点。我们可以从包含接口和服务的一些基本定义的protocol buffer文件开始,在Service中定义schema,并使用Message定义接口。总的来说,这是一种相对简单的语法,比yaml更容易阅读。

gRPC有很多让人喜欢的地方:

  • ✅通过生成的代码定义规范化接口。
  • ✅靠近代码,能够在实现API的同时提交契约。
  • ✅业务所有权,具有易于理解的语法,允许业务人员理解并为契约做出贡献。

看起来是全方位的胜利。

直到我们开始在概念验证之外使用。然后对话就成了这样:

"protoc",这个CLI是由一些业余人员构造的吗?哦,等等,不,它是由谷歌构造的。为什么这么笨重?不知道。好吧,我们能解决。等等,我究竟如何获得生成Java代码的"protoc"?好的,明白了,通过Maven插件,这似乎不同于其他语言使用"协议"的方式。现在我们可以生成一些代码,让我们把它放到Spring API中。哦,这里的支持似乎有点问题。让我们在Go API中试试。

alt

最后,我们用Go语言构建了一个服务,并在环境中运行。

好吧,我们把一些外部流量引到这东西上。嗯,AWS中对gRPC的ALB支持是全新的,而且没有很好的文档。让我们看看能做些什么来让这个跑起来。哦,天哪,我们终于从前端客户端获得了流量!欧耶。

退一步说,让所有网络节点都支持gRPC并不是一件容易的事。最重要的是,gRPC建在一个有围墙的花园里,我们不能用以前的中间件,不能用curl,不能用常规调试代理,也不能用相同的HTTP库。我们被困住了。所有被吹捧的好处都换来了糟糕的开发者体验,这并不是一个理想的权衡,但我们仍在继续努力。在生产环境中运行后,我们最终得出结论,尽管我们喜欢Protobuf带来的许多好处,但无法忍受Protobuf和gRPC为前后端团队带来的糟糕的开发体验。

Connect

最后,我们遇到了一个更新的技术产品,Connect。那是多么美好的一天啊。当时,Buf有一个漂亮的CLI工具,承诺比"protoc"更快,更重要的是,比竞争对手提供了更好的人体工程学。他们也有一个疯狂的愿景,让Protobuf的整个世界变得更好、更干净、更容易使用,而不是一个有围墙的花园。当然,他们兑现了这一承诺。

alt

Buf最终实现了将世界Connect起来的宏伟愿景。Connect是一个允许三种交互模式的协议:

  • gRPC互操作性: 向后兼容gRPC客户端和服务器(如果用作客户端)。
  • HTTP POST + Protobuf: 提供了Protobuf的序列化优势,并充分理解了POST(或者现在可选的 GET [2])请求的本质。
  • HTTP POST + JSON: 提供JSON的可见性,同时仍然具有强制的、可检测破坏性更改的契约。对于可追溯性远比延迟重要的低优先级环境,是一个完美的选择。

使用Connect和Buf使我们能够采用一种对我们来说非常有效的流程,并使我们远离"协作"模式,更接近"X-as-a-service"交互模式。

整个流程是这样的:

  1. 团队在Protobuf中定义API模型和契约。在开发新API时,Proto文件可以保留在分支中。该分支每次被推送到Github时都会自动同步到Buf Schema Registry作为"草案"。允许前端客户端或后端消费者在"测试"模式下生成代码,而合约仍在开发中。如果需要的话,还可以允许团队并行化工作。

  2. 发起Pull request,供接口的负责团队和消费团队进行审查。这一阶段将运行破坏性变更检测并验证检查规则。到目前为止,破坏性变更检测是我们最喜欢的好处,确保了API的前向和后向兼容性。后端团队可以放心发布产品,因为他们知道合约变更不会影响到消费者。

  3. 一旦团队对契约感觉良好,就会被合并到实现API团队的主分支中。然后与Buf Schema Registry同步,并允许消费团队查看API文档并使用生成的代码。

  4. 重复以上步骤。

Buf + Connect给了我们Protobuf和gRPC所承诺的许多好处,而且没有任何缺点。我们的许多团队现在都采用"契约优先的API设计",极大改善了我们构建API的方式和团队交互方式。

总结

随着Chick-fil-A客户技术团队的成长,我们经历了沟通渠道数量的指数级增长,因为团队依赖于紧密"协作"作为交互模式。很明显,我们需要努力使团队能够在可能的情况下对需求实现自助服务,以"X-as-a-service"的方式运作。这使我们发现了Protobuf以及Buf在其Buf Schema Registry (BSR)和Connect[3]中提供的工具。这些工具帮助团队朝着提供自助交互模式的方向发展,并帮助我们在Chick-fil-A数字商务的复杂世界中优化构建、记录和集成API的方式。

如果只是运营一个小团队,我们可以忍受团队互动的低效,因为沟通矩阵小而简单。然而,随着组织规模扩大,应该强烈考虑对Protobuf、Buf和Connect等工具进行投资,这些工具有助于提供一种媒介来简化团队交互模式。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

参考资料

[1]

三种团队交互模式: https://itrevolution.com/articles/the-three-team-interaction-modes

[2]

Introducing Connect Cacheable RPCs: https://buf.build/blog/introducing-connect-cacheable-rpcs

[3]

Connect: A better RPC: https://buf.build/blog/connect-a-better-grpc

- END -

本文由 mdnice 多平台发布

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

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

相关文章

【Spring实战】13 Security+Thymeleaf自定义登录页面

文章目录 1. 执行流程2. 为什么要自定义登录页面3. 创建登录页面4. 配置 Spring Security5. 创建请求 API6. 启动服务7. 验证8. 代码详细总结 Spring Security 是一个强大的身份验证和访问控制框架,而 Thymeleaf 是一个用于构建动态 Web 页面的强大模板引擎。结合它…

django基础学习

django基础学习 文章目录 django基础学习django框架urls.py将请求发送到正确的视图views.py处理请求models.py定义数据模型根据models查询数据HTML模板呈现数据 Django项目结构创建虚拟环境下载django创建站点创建应用settings.py项目设置 通用类别视图会话框架身份验证视图使用…

python+django校园篮球论坛交流系统v5re9

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中 技术栈 系统权限按管理员和用户这两类涉及用户划分。 (a) 管理员;管理员使用本系统涉到的功能主要有:首页、个人中…

【docker实战】安装tomcat并连接mysql数据库

本节用docker来安装tomcat,并用这个tomcat连接我们上一节安装好的mysql数据库 一、拉取镜像 [rootlocalhost data]# docker pull tomcat:8.5.69二、运行tomcat bitnami的tomcat的根目录在/opt/bitnami/tomcat/webapps下面,所以我们为了方便部署我们的…

【http】缓存协议

✨ 专栏介绍 在当今互联网时代,计算机网络已经成为了人们生活和工作中不可或缺的一部分。而要实现计算机之间的通信和数据传输,就需要依靠各种网络协议来进行规范和约束。无论是浏览网页、发送电子邮件还是进行在线交流,都离不开各种各样的网…

【owt-server】一些构建项目梳理

【owt-server】清理日志:owt、srs、ffmpeg 【owt】p2p client mfc 工程梳理【m98】webrtc vs2017构建带符号的debug库【OWT】梳理构建的webrtc和owt mfc工程 m79的mfc客户端及owt-client

【MySQL变更】gh-ost原理解读

gh-ost简介 gh-ost是处理MySQL在线表结构变更的工具,与pt-osc 不同,gh-ost不会使用触发器。 gh-ost 可以进行测试,暂停,动态控制和重新配置,审计还有其他许多操作perks。 命名 最初它被命名为gh-osc:Git…

C语言课程设计参考题目

一、工资管理系统 需求分析 工资信息存放在文件中,提供文件的输入、输出等操作;要实现浏览功能,提供显示、排序操作;而查询功能要求实现查找操作;另外还应该提供键盘式选择菜单以实现功能选择。 2、总体设计 整个系统可…

虚拟化技术和云计算的关系

1、云计算底层就是虚拟化技术。 (1)常见的虚拟化技术:VMware(闭源的,需要收费)、XEN、KVM (2)大部分公司用的虚拟化方案:XEN、KVM 2、虚拟化的历史 (1&am…

redhat 8 安装openstack

redhat 8 安装openstack 1、安装文档2、redhat 8 安装openstack3、使用openstack 1、安装文档 openstack官方安装文档 https://docs.openstack.org/install-guide/ 2、redhat 8 安装openstack 3、使用openstack

华为hcia之ipv6实验手册

R3: dhcp enable ipv6 dhcpv6 pool test address prefix 2000:23::/64 excluded-address 2000:23::2 dns-server 2000:23::2 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address 2000:12::2/64 ipv6 address auto link-local undo ipv6 nd ra halt //无状态配置 inter…

思维训练-怎样设计一个MQ

架构师需要做各种设计,要不断地提高自己的设计能力。这有没有方法可以训练呢?有的,就是看到什么、想到什么,就假设对面坐着产品经理,一起讨论怎么把它设计出来。比如怎样设计一个MQ 我:首先我确认一下需求。…

基于Python的电商手机数据可视化分析和推荐系统

1. 项目简介 本项目旨在通过Python技术栈对京东平台上的手机数据进行抓取、分析并构建一个简单的手机推荐系统。主要功能包括: 网络爬虫:从京东获取手机数据;数据分析:统计各厂商手机销售分布、市场占有率、价格区间和好评率&am…

SQL Server 存储过程 触发器 事务处理

CSDN 成就一亿技术人! 难度指数:* * CSDN 成就一亿技术人! 目录 1. 存储过程的作用 创建存储过程 2. 触发器 触发器的种类 insert触发器 update触发器 delete触发器 测试 3. 事务 开始事务 提交事务 回滚事务 举个实例 在 SQ…

java设计模式实战【策略模式+观察者模式+命令模式+组合模式,混合模式在支付系统中的应用】

引言 在代码开发的世界里,理论知识的重要性毋庸置疑,但实战经验往往才是知识的真正试金石。正所谓,“读万卷书不如行万里路”,理论的学习需要通过实践来验证和深化。设计模式作为软件开发中的重要理论,其真正的价值在…

VMvare虚拟机中文件夹共享防火墙设置

目录 一、虚拟机jdk及tomcat配置 1.1 JDK配置 1.2 tomcat配置 二、文件夹共享 2.1 为什么需要配置文件夹共享功能 2.2 高级共享和普通共享 三、防火墙设置 入站规则和出站规则 四、思维导图 一、虚拟机jdk及tomcat配置 1.1 JDK配置 (1) 双击jdk (2&#xf…

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉

文章目录 前言相关文章Nlog配置HandyControl配置简单使用显示效果文本内容 全局异常捕捉异常代码运行结果 前言 我将简单的HandyControl的消息打印系统和Nlog搭配使用,简化我们的代码书写 相关文章 .NET 控制台NLog 使用 WPF-UI HandyControl 控件简单实战 C#更改…

1、gdb基本功能

文章目录 1、gdb1.1、运行1.1.1、程序入参 1.2、断点及观察点1.2.1、设置断点1.2.2、禁用、删除断点1.2.3、观察点 1.3、打印1.3.1、设定打印参数1.3.2、打印数据1.3.3、自动打印1.3.4、按照地址打印 linux下我现在接触到的常用调试工具如下. gbdgdbguicmake-tools gdb是最为通…

python+vue高校体育器材管理信息系统5us4g

优秀的高校体育馆场地预订系统能够更有效管理体育馆场地预订业务规范,帮助管理者更加有效管理场地的使用,有效提高场地使用效率,可以帮助提高克服人工管理带来的错误等不利因素,所以一个优秀的高校体育馆场地预订系统能够带来很大…

霹雳吧啦Wz《pytorch图像分类》-p2AlexNet网络

《pytorch图像分类》p2AlexNet网络基础及代码 一、零碎知识点1.过拟合2.使用dropout后的正向传播3.正则化regularization4.代码中所用的知识点 二、总体架构分析1.ReLU激活函数2.手算3.模型代码 三、训练花分类课程代码1.model.py2.train.py3.predict.py 一、零碎知识点 1.过拟…