使用graphql的优势: 前端把握查询的主动权,可定义你需要查询的字段过滤冗余,另外减少两端的沟通 接手bff层前端可作为空间更大,包括做一些鉴权 请求合并更加便利(以前初始化多个请求需要一起返回都是使用 另外后端同学对于bff层其实不怎么感冒,因为数据聚合对他们来说没什么含量,完全是对前端同学服务。所以我们完全可以引入查询来接手后端同学的bff层。 后端同学直接集成 (java接口(restful或者graphql)-->前端) 前端增加中间服务层(java接口-->前端中间服务层nodejs(graphql)-->前端) 对于第一种方式,后端同学可能更改会更大 前端中间服务层的配置 中间服务层使用koa2搭建,当然你也可以使用express等等其他。 graphql的查询中另外一个比较好的地方在于指令,指令的加入会让bff层更加有做为(放在下一次讲)
BFF层的作用 BFF层的主要作用包括: 数据聚合:将来自多个后端服务的数据聚合成前端需要的格式。 协议转换:将后端服务的RESTful API或GraphQL API转换为前端更易用的接口。 选择BFF框架 在搭建BFF层时,选择一个合适的框架非常重要。以下是一些常用的BFF框架: Node.js + Express/Koa:适合小型项目或团队,易于上手。 我们以Node.js + Express为例,详细介绍如何搭建BFF层。 安装Node.js和npm 在开始之前,确保你的计算机上已经安装了Node.js和npm。 安装完成后,可以通过以下命令检查Node.js和npm的版本: node -v npm -v 创建项目目录 首先,创建一个新的项目目录,并进入该目录: mkdir bff-project cd bff-project 集成认证和授权 为了确保前端请求的安全性,我们可以在BFF层集成认证和授权逻辑。
复用问题 拆开之后,多个BFF之间容易产生冗余代码,尤其是一些通用的后端逻辑(如授权、认证、限流等等) 为了消除BFF间的代码冗余,一般采用两种做法: 要么多BFF合一 要么在BFF之上加一层Edge 具体实践中,BFF通常不是图示的样子,主要变化在于: 按业务线拆分BFF 加一层网关,负责实现路由、认证、监控、限流熔断、安全等功能 按业务线拆分的BFF更像是建立在下游基础服务之上的业务型微服务,只是这些微服务由对应业务的前端团队负责开发维护 广义的,可以理解为更细粒度的BFF,即每块业务对应一个BFF(不再按用户体验差异去分) 网关层负责实现通用的边界服务,如认证、限流等,让BFF更专注于业务相关的部分: 前端体验 ------------ -- ----- BFF BFF ----- ----- ^ ^ ^ ^ / \ / \ -------------------- 下游服务 P.S.另外,还有不引入BFF,而只添一层转发服务来解决数据的聚合 从分工的角度看: BFF模式不仅仅是一种技术架构,从社会分工角度讲,BFF更是一种多元价值导向的分层架构,每一层都有不错的空间去施展。
还添加了基于响应性扩展的示例,以演示如何将其用于构建微服务 API 边缘服务(edge-service)、前端的后端(BFF)或将其用作构建任何类型微服务的基础。 "http://swapi.co/api/people/62/" ], films: [ "http://swapi.co/api/films/5/ 运行在 开发 模式 npm run dev 运行在 生产 模式 npm run compile npm start 运行在 VS Code 调试 模式 npm run compile Press F5 RESOURCES: ==> v1/ConfigMap NAME DATA AGE nxplorerjs-microservice-starter 5 注意,JWT token 是属性 idToken 的值 { "idToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1MTQ4NjQ3ODMsImV4cCI6MTUxNDg2ODM4Mywic3ViIjoidGVzdEBnbWFpbC5jb20ifQ.hAEa6AL1Kxxxxxxx
Sam Newman详细地说明了BFF。 客户端都不是直接访问服务器的公共接口,而是调用BFF层提供的接口,BFF层再调用基层的公共服务,不同的客户端拥有不同的BFF层,它们定制客户端需要的API。 而使用BFF在很大程度能避免这样的问题。 使用BFF的另一个优点就是当由于某一客户端需要调用调用多个不同的服务端接口来实现某一功能时,可以直接在对应的BFF层编写相应的API,而不会影响到基层的公共服务,且客户端不用直接向多个后台发起调用,可以优化性能 当然,凡事有利有弊,BFF带来便利好处的同时也会引起一些问题,如代码重复,加大开发工作量等。所以在使用时需要结合现实情况仔细斟酌,符合项目的应用开发背景。例如蚂蚁财富使用BFF的场景如下。 ?
适用场景 BFF虽然比较流行,但不能为了流行而使用,要满足一定的场景并且基建很完善的情况下才使用,否则只会增加项目维护成本和风险,收益却非常小,我认为的适用场景如下: 后端有稳定的领域服务,需要聚合层 需求变化频繁,接口经常需要变动:后端有一套稳定的领域服务为多个项目服务,变动的话成本较高,而bff层针对单一的项目,在bff层变动可以实现最小成本的改动。 总结 经过上文我们可以对BFF层的概念有一个基本的了解,并且按照步骤可以自己搭建一个Nestjs小应用,但和企业级应用差距还很大。 接BFF层需要有完善的基建和合适的业务场景,不要盲目接入 Nestjs基于Express实现,参考了springboot的设计思想,入门很简单,精通需要理解其原理,尤其是依赖注入的设计思想 参考文献 我理解的 BFF NestJs官方文档
BFF — Backend For Frontends,经典分布式架构设计模式之一。我在学习和工作经验累积中,逐渐加深了对 BFF 的理解。 寻找历史的线头 在毫无头绪的情况下,我们可以首先从Thoughtworks技术雷达中 BFF 的条目入手,去找到一些历史的蛛丝马迹。BFF 条目的发布时间是在 2015 年 11 月10 日。 终于,我们可以说 BFF 模式是在解决 SoundCloud的分布式系统问题中首次出现。下面,让我们一起回到BFF第一次发挥威力的现场吧。 BFF 新的形态出现了,具体如下图所示: 随着时间推移,SoundCloud 的 BFF 也在增加。他们已经在生产环境同时维护着 5 个 BFF 了。为了进一步提高生产力,减少不必要的重复。 SoundCloud 的 BFF 依然随着时间在横向增长,不同的是这种横向增长不会再引起任何问题了。最终,BFF 模式的架构演变成与我们现在使用的几乎一致了。
然而语言只是服务端开发最表层也是最易突破的一层,可靠性、速度性能、安全性、架构可扩展性、甚至运维,都是前端向全栈发展需要考虑的关键因素。 10月20日, JSConf大会上,腾讯云中间件总经理 Yunong Xiao 将发表《Serverless Is Your BFF》主题演讲,从前端发展演进、前端到全栈的路径和问题以及如何利用Severless 并现场通过live code,完整演示如何基于Serverless,在5分钟内完成从编码、调试、发布到压测整个研发流程。
TCP、UDP 等传输协议,具体工作包括 会话层(第 5 层):负责管理会话,以支持通过多次传输连续交换信息 表现层(第 6 层):将来自网络服务的数据翻译成应用层可用的格式,具体工作包括字符编码转换 、数据压缩、加密解密等 应用层(第 7 层):提供高级 API 的人机交互层,应用能够通过该层访问网络服务,如资源共享、远程文件访问等 其中,第 1 层是原始数据,第 2 层确定目标机器的 MAC 地址 ,第 3 层确定终点的 IP 地址,以及途经的具体路线,到第 4 层,要根据传输协议确定目标端口号,第 5~7 层不关心终点,因为 IP 地址 + MAC 地址 + 端口号已经唯一确定了目标应用程序 也就是说 ,但在目前的硬件条件下,由此带来的性能优势已经不重要了 P.S.严格来讲,4 层负载均衡应该叫 3/4 层负载均衡,因为结合了第 3 层的 IP 地址和第 4 层的端口号信息 八.7 层负载均衡 7 层负载均衡根据应用层协议信息 ),甚至还能对内容进行优化(比如压缩),从而提高性能 P.S.严格来讲,7 层负载均衡应该叫 5~7 层负载均衡,因为结合了 OSI 模型中 5~7 层的相关信息: ?
假如一台正在运行的路由器突然崩溃,那么它的序列号会重新从0开始,这就导致接收方路由器会将新产生的分组当作过时分组进而丢弃 序列号损坏,假如发送方传输序列号过程中发生一位错误例如由4变为65540,则后续的5- ,跨层工作 如果传输层不是采用TCP/UDP而是采用其他协议,那么NAT转换器也会失效 有些应用需要在分组载荷中插入IP地址,接收方会提取载荷中的IP地址,而NAT转换器只操作头部数据,不会修改分组载荷内的内容 x 3 3 Port Unreachable——端口不可达 x 3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 x 3 5 0 Redirect for network——对网络重定向 5 1 Redirect for host——对主机重定向 5 2 Redirect for TOS and network——对服务类型和网络重定向 5 3 Redirect for TOS and host——对服务类型和主机重定向 8 0 Echo request——回显请求(Ping请求) x 9 0 Router advertisement
TCP/UDP(或TCP/IP)保留的传输层端口号范围是 1 ~ 65535。公认端口:1 ~ 1023 。动态端口:1024 ~ 65535。 TCP和IP是配合工作的,所以有些参数可直接传送给IP层处理,TCP头和IP头合在一起使用。 (5)窗口: 16位。控制字节流大小。 (6)校验和 16位。 校验包含TCP头部 和 TCP数据部分,比如利用CRC校验。 ACK 5.TCP拥塞控制(考点) 目的:缓解互联网通信紧张状况,报文到达速率大于路由节点转发速率 。记住解决方案。 ?
最近在公司的微服务架构中遇到了一些多终端访问接口的问题,不同的终端拥有不同的接口服务,有不同的操作数据的能力,针对这种业务场景做出了调研,我们是否可以在不同的访问层进行业务逻辑处理,获取不同的数据内容呢 多端共用一个BFF ? 每个端提供一个BFF ? 如果我们为每一个端点都提供一个BFF,每个端点的BFF处理自身的业务逻辑,需要数据时从基础服务内获取,然后在接口返回之前进行组装数据用于实例化返回对象。 这样基础服务如果有新功能添加,BFF几乎不会受到影响,而我们如果后期把App端点进行拆分成Android、IOS时我们只需要将app-bff进行拆分为android-bff、ios-bff,基础服务同样也不会受到影响 也同样带来了一些问题,如下所示: 响应时间延迟(服务如果是内网之间访问,延迟时间较低) 编写起来较为浪费时间(因为在基础服务上添加的一层转发,所以会多写一部分代码) 业务异常处理(统一格式化业务异常的返回内容
以下按时间顺序介绍,支持任意NLP任务的T5,针对文本分类的两篇PET和LM-BFF。 NLP任务,只是让模型在解码时多一层条件概率,既给定不同prompt前缀在解码时采用不同的条件概率(attention)。 不过以下参数对比并不太合理,虽然Albert是层共享参数,但是推理速度并无提升,12层的xxlarge模型参与计算的参数量级应该是223M*12~2B,所以并不是严格意义上的小模型。 调整参数后,32个小样本上PET的效果也是超过同等量级甚至更大的GPT3在few-shot上的效果的 LM-BFF paper: 2020.12 Making Pre-trained Language 完形填空自动搜索prompt Task: Text Classification Model: Bert or Roberta Take Away: 把人工构建prompt模板和标签词优化为自动搜索 LM-BFF
路由:所有的请求都需要通过网关层进行处理,网关层再根据 URI 将请求指向对应的后台服务,如果同一个服务存在多个服务器节点,网关层还将承担负载均衡的工作。 认证:对所有的请求进行集中认证鉴权。 我们就可以考虑使用 BFF 了。 BFF(Backend for Front) BFF 不是一个架构,而是一个设计模式,它的主要职责是为前端设计出优雅的后台服务,即一个 API。 前面我们列出了 5 种服务,实际上,整个供应链系统将近有 100 种服务。 因为我们共同维护一个 App、PC 界面、新零售、售后、加盟商,还有各自的小程序和 H5,所以为了实现业务解耦和分开排期,每个部门需要各自维护自己的 API 服务,而且 App 与 PC 前端也需要根据部门实现组件化 虽然 H5 与小程序的布局不同,但是页面中很多功能一致,也就是说重复的代码逻辑主要存在 PC API 和 App API 中。
以下按时间顺序介绍,支持任意NLP任务的T5,针对文本分类的两篇PET和LM-BFF。 NLP任务,只是让模型在解码时多一层条件概率,既给定不同prompt前缀在解码时采用不同的条件概率(attention)。 不过以下参数对比并不太合理,虽然Albert是层共享参数,但是推理速度并无提升,12层的xxlarge模型参与计算的参数量级应该是223M*12~2B,所以并不是严格意义上的小模型。 调整参数后,32个小样本上PET的效果也是超过同等量级甚至更大的GPT3在few-shot上的效果的 图片 LM-BFF paper: 2020.12 Making Pre-trained Language 完形填空自动搜索prompt Task: Text Classification Model: Bert or Roberta Take Away: 把人工构建prompt模板和标签词优化为自动搜索 LM-BFF
❝ 前沿:前段时间在公司内部分享了关于bff和serverless的知识体会,从概念、特征、和应用场景再到简单的实践,今天借此机会跟大家分享,什么是BFF? 什么是serverless? ❞ 1.BFF ❝ 在聊Serverless之前跟大家先谈谈BFF,BFF顾名思义就是Backend For Frontend,用中文解释就是服务于前端的后端,那么为什么会有BFF? ❞ 前端同学和后端同学都各有各的道理,有没有一种解决方案可以化解这种尴尬的场景,于是就有了BFF 1.1 介绍 ❝ BFF层初衷是在后台服务与前端(客户端)之间添加一层,接下来我们来看看下面这张图 ❞
加入了BFF 的前后端架构 ? 加入了BFF的前后端架构中,最大的区别就是前端(Mobile, Web) 不再直接访问后端微服务,而是通过 BFF 层进行访问。并且每种客户端都会有一个BFF服务。 从微服务的角度来看,有了 BFF 之后,微服务之间的相互调用更少了。这是因为一些UI的逻辑在 BFF 层进行了处理。 比如作为在 BFF 层使用 GraphQL, 这一层的 BFF 并不需要任何的数据库或者存储媒介。 5. 错误码处理:REST 能够精确返回HTTP错误码,GraphQL 统一返回200,对错误信息进行包装; 5.
js $(“#info_withdraw”).on(‘click’, function () { //iframe层 layer.open({ type: 2, title: ‘申请提现’, shadeClose
在计算机科学中,所有问题都可以通过加一层来解决,于是 BFF 架构设计应运而生。 2. 要不要使用 BFF 来编排后端服务? BFF 是不是编排层? BFF 能不能宏观上对应 DDD 的应用层? ...... ,统一由 BFF 处理 不同类型的客户端一套 BFF 非常接近 DDD 四层架构中的应用层,处理面向场景的业务 因为它的职责比较多,我们暂且称其为:胖 BFF。 瘦 BFF 的好处是: 端到端交付,前端开发人员直接使用后端领域服务的 API 文档 开发效率高,避免多编写一层 BFF 减少一次集成 对应的,瘦 BFF 的弊端可想而知: 没有编排层,服务之间相互依赖 5. 两种形态的权衡 那么在什么场景下,更合理的选择这两种结构之一呢? 1. 业务需求 如果业务逻辑简单,数据交互相对较少,瘦 BFF 可能就足够满足需求。
比如一个商家详情页即需要仓储数据,也需要资产数据,此时我们在 BFF 层将仓储和资产数据请求回来组装吐给前端。 字段转换:字段过滤、数据格式化等工作。 比如资产域的商户名字段叫 businessName,而仓储域的商户名字段叫 shopName,此时可以在BFF层统一掉,这样前端就不需要做判断了。 BFF 核心架构 核心架构 以上是 BFF 的核心架构图,前端即中后台应用,后端域即后端服务,右侧的工具支撑是公司的一些基础公共服务,中间的就是 BFF 核心实现,我们从上往下看: 业务:可以在这一层做业务编排 调用链路 核心架构讲完后,再看下整个 BFF 架构的调用链路: 调用链路从上往下,我们的中后台应用通过 HTTP 请求到 Nginx 服务器上,Nginx 转发到 BFF 层,BFF 层通过 RPC 基于 Serverless 的BFF改造 SFF 架构 上图是改造后的BFF架构,相比于一代的 BFF 架构,这里主要多了两块内容,一块是 FaaS 层,另外一块是开发者平台。