驱动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默认的订单提交后只能在后台看到的,每次都要登陆到后台去查看很麻烦。以下…

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

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

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

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

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

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

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

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

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,就是说要让用户…

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

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

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

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

php memcached close,PHP连接Memcached安装及数据库操作

memcached介绍Memcached是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为在内存中会统一维护一张巨大的Hash表,所以支持任意存储类型的数据。很多网站通过使用 Memcached提高网站的访问速度,尤其是对于大型的需要频繁访问数据的网站。Memcached是典…

坏道修复是不是硬盘东西全部都没有了_硬盘有坏道就不能用了吗?别再吃哑巴亏了,今天跟大家再说一次...

硬盘是电脑的存储硬件,是电脑中核心的硬件之一,目前市场上主要使用的是固态硬盘与机械硬盘两种,固态硬盘的读写速度较快,容量小,价格贵,机械硬盘读写速度慢,容量大价格便宜,现在的电…

html5+php调用android手机图片,html5+exif.js+canvas+php实现手机上传图片,图片损坏无法打开...

上传图片,图片损坏无法打开,图片路径也是正确的,function selectFileImage(fileObj) {var file fileObj.files[0];//图片方向角 added by lzkvar Orientation null;if (file) {console.log("正在上传,请稍后...");var rFilter /…

word 编辑域中的汉字_15条Word常用操作教程,简单实用,纯干货分享,收藏备用!...

点击蓝字关注我们1. 去除页眉横线在页眉插入信息的时候经常会在下面出现一条横线,如果这条横线影响你的视觉。这时你可以采用下述的两种方法去掉:用第一种的朋友比较多,即选中页眉的内容后,选取“格式”选项,选取“边框…

安卓抓包软件_Packet Capture安卓抓包神器介绍及使用教程

除了干货,其他什么也没有源码|资源|软件|教程|揭秘关 注Packet Capture是一款安卓抓包软件,能用来提取用户操作程序内容,Packet Capture可以捕获网络数据包,并记录它们使用中间人技术…

队列处理高并发_高并发场景下缓存处理的一些思路

在实际的开发当中,我们经常需要进行磁盘数据的读取和搜索,因此经常会有出现从数据库读取数据的场景出现。但是当数据访问量次数增大的时候,过多的磁盘读取可能会最终成为整个系统的性能瓶颈,甚至是压垮整个数据库,导致…

pywin32 获取窗口句柄_Excel VBA | 这个窗口居然关不掉

我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务。支持我,也为自己加油!还有关不掉的窗体?先来看下效果:通过上图,大家很容易看出二者之…

cassss服务未启动_电梯启动死机故障处理方法

电梯情况描述:广东奥的斯,有机房 梯龄5年故障现象描述:现场人员反馈,停梯一晚,第二天开梯,门一开就死机,显示HAD,断电复位后电梯正常维修过程描述:1、到达现场查看历史故…

合振动的初相位推导_基于振动信号的机械设备故障诊断(一)

1.概述振动在旋转机械设备故障中占了很大比重,是影响设备安全,稳定运行的重要因素。振动直接反应了设备的健康状况,是设备安全评估的重要指标。通过对振动分析方法的调查,熟悉一般的振动分析流程及方法,从而对检测设备…

linux 启动db2 服务器,Linux系统设置DB2等服务开机启动的过程

Linux系统中向要设置开机启动,就要通过代码来实现。通过编写脚本能够把服务加到Linux开机启动项中,本文就来介绍一下Linux系统中设置DB2等服务开机启动的过程。1.转到/etc/init.d 目录下。以root身份执行Shell代码cd /etc/init.d2.编写DB2启动脚本Shell代…