“前端直连后端不香吗?”——从一次大厂面试看BFF的不可替代性

80 阅读4分钟

前端直连后端不香吗,不香吗,香吗?面试之后,这个问题一直围绕着我。

请注意!非纯技术贴,摸鱼大佬建议观看。

我:前端要连很多不同服务呀,有 http 的,有 grpc 的,有对象存储 cos 的,redis…bff 为前端创造条件呀

面试官:但是这些后台也能做呀,为啥不能后台用 go 实现 bff ,我想听的是你在框架设计的时候,node 层去实现 bff 的原因。

我:后台不想写,扔给前端自己搞了。

面试官:卒,下一个

image.png

其实我在公司内部答辩的时候也被问过这个问题,个人觉得nodejs做bff只能说更好,不用也可以。但被问到必要性的时候,觉得评委太专牛角尖,完全没必要纠结这个问题,毕竟java用jsp也可以实现页面,这么说前端也没有必要性,毕竟前端也算程序员

因此跟评委吵了起来,也因此给我挂掉了晋升答辩。为此我吐槽了评委半年多,觉得无关紧要,而现在再次因为相同的问题而挂掉了面试,才认真对待了起来。

BFF到底是什么?

BFF(Backend for Frontend,​​服务于前端的后端​​)是一种架构模式,它为特定的前端应用(Web、移动端、桌面端等)提供专门的后端服务,作为前端与通用后端(或微服务)之间的中间层。

​BFF的核心价值​​在于:

  • ​按需定制​​:为不同前端(Web、移动端、小程序)提供专用API,避免"一刀切"的通用API

  • ​解耦前端依赖​​:将视图层逻辑(如数据聚合、格式转换)从客户端移至BFF层,减轻前端负担

  • ​提升安全性​​:避免前端直接暴露数据库结构或业务逻辑

  • ​降低后端改动对前端的影响​​:BFF层可以作为适配层,确保前端的API结构保持稳定

为什么需要Node.js实现BFF层?

回顾了一下自己的代码,bff 确实除了增加自己的代码量也没发挥什么特别作用,而且之前后端 http 请求加字段直接加就ok 了,现在写 grpc 接口还要和前端同步一下协议,不仅后台要发布,前端也要发布,事半加倍😓。

等等,问题好像就出在这里,如果后台随意的修改字段而不告诉前端,那岂不是很容易产生 bug,如果后台去实现 bff 的话,那就和前端直接发 http 请求没有区别。想到这里,感觉好像问题的真相就要浮出水面了。

image.png

计算机科学中有句名言:"All problems in computer science can be solved by another level of indirection."(代码世界没有什么问题是解决不了的,如果有就再加一层)

nodejs 让前端的能力更大了,不仅限于 html css js 三板斧。而业务分层的真正好处在于业务复杂的情况下,方便划清职责定位问题。bff 的存在可以使后台更专注与后端代码实现,前端更专注于页面的交互实现。bff 则可以把后端返回给我们不舒服的地方自己处理一下,做二次加工。 这样说太笼统,点击查看元宝的回答 yb.tencent.com/s/Pw3GudwOd…

什么情况下需要BFF层?

那么什么情况下需要前端自己做二次加工呢?结合我自己的项目,比如我们的概览页面,要显示 10 多个功能模块,先去判断用户权限,再去挨个功能模块去调用接口 是比不上 node 层实现好,一个接口直出要快的多的。

但是呢,这些都是先有 node bff,干中学出来的经验!没有提现出必要性。也就是说,真正要回答这个问题,就要明确用 nodejs 搞 bff ​​做什么事情,解决什么核心问题,获得多少收益​​。

image.png

总结:BFF的价值与选择

我做的项目是一个后台系统,我要 nodejs 去拆分解耦我们的核心业务大表单。比如我们的大表单要保存到10几个表里面,通过bff解耦后,后台只需提供原子接口,前端专注页面交互,一旦表单保存的逻辑发生改变,前后台都不需要改,只改bff就可以了。如果没有bff就要花双倍的时间,前端后台一起修改,效率相差至少一倍。

业务不复杂不需要 bff,前端业务不复杂就不需要前端搞 bff,毕竟这种事情,是给自己谋福利的。