驱动api_消费者驱动契约已死?

吐槽文一篇。

契约的一些问题

在实践前后端分离的这些年来,已经诞生了一些技术与工具让前后端进行沟通:

  • 契约的 Mock 服务(Mock Server)。用于模拟一个服务器,为特定的接口返回特定的值。
  • 契约测试。对前后端协定的 API 进行测试。
  • 前后端胶水层。如 BFF (Backends for Frontends),根据客户端的需要对 API 进行聚合、适配、裁剪等。

而使用这些工具的时候,往往容易出现一些问题。

6ee4d5276f1047db74404a81792619a7.png

消费者无法驱动的契约

消费者驱动,顾名思义就是在我们协定契约的时候,按消费者的业务实现角度,与生产者一起协定契约。在实践上,往往由于后端在项目中的主导地位导致:协商的结果不会按消费者需要,而是按生者需要来生成契约。造成这种结果的因素有很多:

  1. 后端才是实现方。所以,你常会听见:『你行,你上』,笑~。
  2. 从实施成本考虑。诸如于跨服务调用的成本等等
  3. 后端的职级高——毕竟后端已经有了几十年历史了。
  4. 为了更『美』的后端架构——导致了更『差的』前端架构。

我的意思并不是说,按生产者来主导有什么问题,而是配不上『消费者驱动』这五个字。诸如于我们获取某个 API 的时候,前端所需要的是相关的信息,而不是对应的实体 ID。而后,再由前端去获取对应实体的信息。从逻辑上来说,由前端获取或者后端获取,从技术上来说,并没有多大的问题。但是从用户体验上来说,并没有那么友好。后端间的 API 调用,可以是几十 ms 级别的;而前端多调用一个后端 API,在网络上的传输时间,往往都是几百 ms,乃至几秒。

生产者的契约测试

2862bd2a65f948601c92274fd583292f.png

所以,让我们再看看各个团队所宣称的消费者驱动的契约测试

消费者驱动的契约测试(Consumer-Driven Contracts,简称CDC),是指从消费者业务实现的角度出发,驱动出契约,再基于契约,对提供者验证的一种测试方式。

如果你不是消费者驱动的契约,而是后端一口气定出来的接口,你怎么能叫『消费者驱动的契约测试』????按这样的做法,它只能叫生产者的契约测试。

既然是生产者的契约测试,那么它就无法保证说:API 修改不影响消费者使用——因为消费者压根就没有参与到契约的制定,生产者可以按照自己的需要来修改契约。

所以,生产者到底是在给谁测试?又是在测试什么东西?

契约测试的契约作为 Mock Server——不行

在大部分的项目中,对于契约的使用存在问题,即模式错了。契约测试需要围绕业务流程施展,而不应该相互隔离。如果契约的用例不丰富,便无法串起整个系统的流程。而作为 API 的提供方,应该保证业务逻辑是可以串联起来的。从用户的登录开始,到用户获取数据,展示列表页,能进入详情页等等。

我们做契约测试的目标是,让代码修改不影响 API 输出。后端需求一改,契约测试会挂,后端知道出现问题,会进行修复。如果前端用的是契约测试的契约提供的 Mock Server,前端的测试也会挂,这样问题就不会往后流。

所以,契约不应当给前端做本地开发和测试 。

没有契约的 Mock Server——不行

c181d27ce1566c413f3f6882aa653b37.png

对于小团队来说,去采用原始的 API 方式反而更加有效率;对于大团队来说,这样的方式并不可行。

既然,沟通那么麻烦,那么我们就分开吧。如果契约和 Mock Server 是分开的,那么维护前端 Mock Server 的人很很难识别到修改。相关的问题,在测试不及时的情况下,有可能在上线后才发现。

也因此,从理想情况来说,这个 Mock Server 是契约动态生成的,并能根据后端现有最新的契约更新。或者,后端在实现契约测试时,要做的是只测试部分数据,而不是为了测试而测试。

只有 DDD 的微服务——不行

尽管 DDD 模型不一定非要与 API 绑定,但是由于种种原因,真正在实践的时候,就不是这么一回事。我们可以看到在很多的项目里,DDD 返回的实体资源,最后可能与 API 的字段一致的。但是它并非是业务上想要返回的逻辑,各个客户端(PC Web、小程序、Android 端、iOS 端等)还都需要进行二次的处理。

这就是为什么,DDD + 微服务,一定要配合一下 BFF 的原因。

缺少前端、后端的 BFF——不行

实施 BFF,大家并没有啥问题。可一谁来维护这一层胶水层的时候,大家都问题都来了——前后端都不愿意维护这个 BFF。对于前端来说,开发者只是 API 的消费者,突然间又变身成为生产者;对于后端来说,开发者原本不需要了解显示逻辑,现在也要涉及到这部分的内容。

不过呢,我们可以保持一致的是:后端是 API 的生产者。而如果生产者没有参与到 BFF 的开发,那么就会引发另外一个问题,API 发生变更的时候,可能没有同步到 BFF——尽管每个项目都有自己的规范,但是只要是由人来执行的,都可能会出现问题。

那么,我们就需要一个 BFF 的契约测试,那在第一时间知道 API 的变化。虽然感觉怪怪的,但是我们还是将客户端的契约测试,前移至了 BFF 层。

所以,消费者驱动的契约在哪里呢?

解决方案

092ebd9c8902332247af39275105358a.png

BFF

大家都懂了。

前端为主写 BFF

前端写 BFF 并不是一件容易的事。你要懂微前端,要懂主流的微服务框架,如 Spring Cloud,要懂 Java。与此同时,还需要了解各个 API 的变化 情况。对于前后端分离团队而言,要做样的工作太难了。

而尽管你可以采用 Node.js + TypeScript,但是它也意味着你要成为一个 Node.js 专家。如果让我用 Node.js 写 BFF,那我还是宁愿和以前的项目一样,写 Scala 来作为 BFF。

所以,我并不推荐使用 Node.js 作为 BFF。一来,没有阿里巴巴强大的 Node.js 专家群;二来,我对于成为 Node.js 没有兴趣。用擅长于某一领域的语言去做某一领域的事,而非用擅长的语言去做每一领域的事——兴趣和爱好除外。

GraphQL as BFF

大家都懂了。

前端防腐层

参考《整洁前端架构》。

消费者的契约测试

我们在诸多项目实现了:针对于生产者的契约测试。其中也包含了之前我写的 mest 框架,它是通过结合 TypeScript 的 Interface 来验证后端接口是否一致。

当你没有办法的时候,这也是一个不那么差的做法。换个问题来思考的话,就是以生产者来解决这些问题。

直接转换模型为 Java Class 和 TypeScript 是一种更简单的做法。

结论

dbd9cf21bc8a928df13e20fde2ea09d7.png

没有银弹。

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

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

相关文章

php表单提交邮箱_最全实现dede订单表单提交发送到指定邮箱(附前台设置)

打造销售型网站的订单系统。不是所有销售都有权限登陆网站后台查看订单,特别是外地出差时,用户下了订单后不能及时服务用户,可能会造成订单丢失。但dedecms默认的订单提交后只能在后台看到的,每次都要登陆到后台去查看很麻烦。以下…

鸢尾花python贝叶斯分类_机器学习-利用三种分类器实现鸢尾花分类

利用决策树,KNN和朴素贝叶斯三种分类器,对鸢尾花数据集进行分类。下面是具体的流程和代码:1、 数据读取:实验数据是直接加载的sklearn内置的鸢尾花数据集,共150条数据,包含4个特征,而且是一个三…

用php创建一相册文件_php文件创建

PHP-创建文件在您可以做任何一份档案,它已存在!在这一课您将学习如何建立一个档案使用PHP 。广告Tizag.comPHP的-制造混乱在PHP中,某个文件创建使用的命令也被用来打开文件。这似乎有点混乱,但我们会努力澄清这一难题。在PHP的打开…

python编辑邮件格式_python发送邮件模板

python发送邮件(不带附件)模板import smtplibfrom email.mime.text import MIMETextfrom email.header import Headersender xxxxxxxxx163.comreceiver xxxxxx126.comsubject 报警username xxxxxxxx163.compassword xxxxmsg MIMEText(strs, plain, utf-8)msg[Subject] H…

php ckeditor 配置,Laravel5.6框架使用CKEditor5相关配置详解

本文实例讲述了Laravel5.6框架使用CKEditor5相关配置。分享给大家供大家参考,具体如下:Laravel 相关配置文件的上传与存储参考文档:创建符号链接php artisan storage:linkproject/public/storage -> project/storage/app/public修改配置文…

python通讯录运用的知识点_案例驱动式Python学习--通讯录存取

驱动案例通讯录:要求打印出企业全部十名员工通讯录。(要求有文件相关操作)内置函数自定义函数函数指被封装起来的、实现某种功能的一段代码。Python安装包、标准库中自带的函数统称为内置函数,用户自己编写的函数称为自定义函数,不管是哪种函…

udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?

分析痛点笔者线上有一个 Flink 任务消费 Kafka 数据,将数据转换后,在 Flink 的 Sink 算子内部调用第三方 api 将数据上报到第三方的数据分析平台。这里使用批量同步 api,即:每 50 条数据请求一次第三方接口,可以通过批…

php 没有libmysql.dll,PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰

有朋友下载了PHP5.3,PHP5.4版本想加载mysql支持的时候发现没有libmysql.dll文件,无法完成mysql配置,其实PHP5.3版本开始,使用mysqlnd库,不再使用libmysql.dll用来访问MySQL数据库,大大提升了PHP的数据库访问…

堆排序时间复杂度_图解堆结构、堆排序及堆的应用

前言这次我们介绍另一种时间复杂度为 O(nlogn) 的选择类排序方法叫做堆排序。我将从以下几个方面介绍:堆的结构堆排序优化的堆排序原地堆排序堆的应用堆的结构什么是堆?我给出了百度的定义,如下:堆(Heap)是计算机科学中一类特殊的…

农历php,PHP农历公历转换

/*云南省曲靖师范学院计算机科学与工程学院-杨海熙编写2009-9-3*/class Lunar{private $_SMDay array(1 > 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//定义公历月分天数private $_LStart 1950 ;//农历从1950年开始private $_LMDay array(//差:该年的…

python迷宫起点终点所有路径_通向终点的路不止一条!python迷宫。

马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有帐号?立即注册x本帖最后由 wei_Y 于 2014-11-24 19:53 编辑2008121223547917.jpg (56.62 KB, 下载次数: 3)2014-11-17 19:22 上传其实木有上面那么高端啦…

恶意软件分析沙箱在网络安全策略中处于什么位置?

恶意软件分析沙箱提供了一种全面的恶意软件分析方法,包括静态和动态技术。这种全面的评估可以更全面地了解恶意软件的功能和潜在影响。然而,许多组织在确定在其安全基础设施中实施沙箱的最有效方法方面面临挑战。让我们看一下可以有效利用沙盒解决方案的…

php websocket 帧封装,swoole websocket封装类和调用

上代码 ws.php/*** ws 优化 基础类库* User: singwa* Date: 18/3/2* Time: 上午12:34*/class Ws {CONST HOST "0.0.0.0";CONST PORT 9512;public $ws null;public function __construct() {$this->ws new swoole_websocket_server("0.0.0.0", 9512)…

夸克浏览器怎么安装脚本_广告看烦了?别砸手机!这五款浏览器能拯救你

哈喽大家好,欢迎来到黑马公社。随着各种良莠不齐的内容开始泛滥,黑马发现自己很难通过网络第一时间找到自己想要的内容。在电脑上,黑马为自己的每个浏览器都安装了不下三个广告屏蔽插件,而在手机上,很难。先不说手机浏…

php 今天 明天 后天 显示10天,【微信小程序】实现含有今天,明天,后天的日期组件...

封面图.JPG前言做过微信小程序的前端er都知道,小程序有个日期组件,叫picker,但是,需求方要求日期和时间都要显示的,用picker组件的话,那就用到两个picker,date和time,就是说要让用户…

python dlib 年龄 性别_python dlib学习(一):人脸检测

1、环境安装Windows: 旧版本安装pip install xxx.whl。以下是whl文件地址: ​ Python Package Index​ 最新版本安装:不要嫌麻烦,先装上visual studio2015 (C模块)。​ 具体的记不清了,装上cmake和boost,然…

php数组实例,php常用数组函数实例小结

本文实例总结了php常用数组函数。分享给大家供大家参考,具体如下:1. array array_merge(array $array1 [, array $array2 [, $array]])函数功能:将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回结果的…

python预测控制_无人驾驶——4.控制之MPC模型预测控制

源自:《无人驾驶无人驾驶车辆模型预测控制》——龚建伟参考:https://wenku.baidu.com/view/8e4633d519e8b8f67c1cb9fa.html0.车辆模型汽车的车轮转角为δf分别做垂直于后轮和前轮的射线,这两根射线会交于O点,两轮模型会绕O点进行运…

php实现git服务器,如何搭建和配置Git服务器

本篇文章给大家带来的内容是介绍如何搭建和配置Git服务器,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。安装Git安装依赖yum install curl-devel expat-devel gcc gcc-cyum install perl perl-devel gettext-devel openssl-…

手机连接投影机的步骤_投影机安装过程详解

投影机安装过程详解一 投影机的安装方式1、桌面摆放桌面投影虽然看起来不是很美观,但可以省去那些繁琐的步骤,只需要准备一张桌子,还可以购买一些专门用来摆放投影机的可移动小车架,把投影机往上一放,连接上线缆就可以…