接口合并与数据聚合:BFF层设计实践去年接手一个电商项目,商品详情页在App端要连续发9个请求:商品基础信息、库存、价格、可用优惠券、店铺信息、评价摘要、物流模板、推荐商品、猜你喜欢。 三方扯皮两周之后,我们花了三周给这个项目加了一层BFF:请求数从9个降到1个,首屏P95落到1.2秒上下。 BFF管业务组装:详情页需要哪几个服务的数据、App端要哪些字段、H5端要哪些字段。它非常懂业务,而且只为某一类前端服务。还有一个常见误解是把BFF当成"又一个通用API层"。不是的。 BFF的精髓恰恰在于不通用——App的BFF返回App要的精确结构,H5的BFF返回H5要的精确结构,谁也别迁就谁。一旦你开始把BFF做成"所有端共用的聚合层",它就退化成那个你本来想逃离的臃肿中台。 什么时候不要上BFF?我的经验是两条:前端就调一两个接口,硬加一层纯属给自己找活干;团队里没有明确归属。BFF最大的风险从来不是技术,是归属——这层代码谁来写、谁来改、挂了谁背锅。
使用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)或将其用作构建任何类型微服务的基础。 swapi.co/api/people/4/", "http://swapi.co/api/people/6/", "http://swapi.co/api/people/7/ /swapi.co/api/films/3/", "http://swapi.co/api/films/1/", "http://swapi.co/api/films/7/
适用场景 BFF虽然比较流行,但不能为了流行而使用,要满足一定的场景并且基建很完善的情况下才使用,否则只会增加项目维护成本和风险,收益却非常小,我认为的适用场景如下: 后端有稳定的领域服务,需要聚合层 需求变化频繁,接口经常需要变动:后端有一套稳定的领域服务为多个项目服务,变动的话成本较高,而bff层针对单一的项目,在bff层变动可以实现最小成本的改动。 总结 经过上文我们可以对BFF层的概念有一个基本的了解,并且按照步骤可以自己搭建一个Nestjs小应用,但和企业级应用差距还很大。 接BFF层需要有完善的基建和合适的业务场景,不要盲目接入 Nestjs基于Express实现,参考了springboot的设计思想,入门很简单,精通需要理解其原理,尤其是依赖注入的设计思想 参考文献 我理解的 BFF NestJs官方文档
Sam Newman详细地说明了BFF。 客户端都不是直接访问服务器的公共接口,而是调用BFF层提供的接口,BFF层再调用基层的公共服务,不同的客户端拥有不同的BFF层,它们定制客户端需要的API。 而使用BFF在很大程度能避免这样的问题。 使用BFF的另一个优点就是当由于某一客户端需要调用调用多个不同的服务端接口来实现某一功能时,可以直接在对应的BFF层编写相应的API,而不会影响到基层的公共服务,且客户端不用直接向多个后台发起调用,可以优化性能 当然,凡事有利有弊,BFF带来便利好处的同时也会引起一些问题,如代码重复,加大开发工作量等。所以在使用时需要结合现实情况仔细斟酌,符合项目的应用开发背景。例如蚂蚁财富使用BFF的场景如下。 ?
192.168.1.103:8080; } server { listen 80; location / { proxy_pass http://backend; } }}3.7 整体测试拓扑3.7.1 Nginx4层负载测试 3.7.2 Nginx7层http负载测试1、根据拓扑图,将节点中的IP配置好。2、配置Nginx: 配置服务器和监听端口等。 3.7.3 Nginx7层https负载测试1、根据拓扑图,将节点中的IP配置好。2、配置Nginx: 配置服务器和监听端口等。
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
先说结论: 4 层负载均衡本质是转发,而 7 层负载本质是内容交换和代理 一、OSI 7层模型与TCP/IP 4层模型 OSI: open system interconnection 开放式系统互联参考模型 OSI 7层模型 TCP/IP 4层模型 应用层 应用层 表示层 应用层 会话层 应用层 传输层 传输层 网络层 传输层 数据链路层 数据链路层 物理层 数据链路层 网络七层模型是一个标准,而非实现 二、7层负载均衡与4层负载均衡 在OSI 7层模型中,从下往上,应用层属于第七层,而传输层属于第四层, 所谓四层即运输层,就是基于 IP + 端口的负载均衡; 七层即应用层,就是基于 URL 等应用层信息的负载均衡 4 层负载均衡本质是转发,而 7 层负载本质是内容交换和代理 以常见的 TCP 为例: 4 层负载均衡转发 负载均衡设备在接收到第一个来自客户端的 SYN 请求时,即通过上述方式选择一个最佳的服务器 三、7层负载均衡与4层负载均衡的对比 7层负载均衡相较于4层负载均衡在更耗费性能的同时,也获得了更加智能的优点,由于在应用层进行识别,所以7层负载均衡可以基于不同的协议(如http、radius、dns
最近在公司的微服务架构中遇到了一些多终端访问接口的问题,不同的终端拥有不同的接口服务,有不同的操作数据的能力,针对这种业务场景做出了调研,我们是否可以在不同的访问层进行业务逻辑处理,获取不同的数据内容呢 多端共用一个BFF ? 每个端提供一个BFF ? 如果我们为每一个端点都提供一个BFF,每个端点的BFF处理自身的业务逻辑,需要数据时从基础服务内获取,然后在接口返回之前进行组装数据用于实例化返回对象。 这样基础服务如果有新功能添加,BFF几乎不会受到影响,而我们如果后期把App端点进行拆分成Android、IOS时我们只需要将app-bff进行拆分为android-bff、ios-bff,基础服务同样也不会受到影响 也同样带来了一些问题,如下所示: 响应时间延迟(服务如果是内网之间访问,延迟时间较低) 编写起来较为浪费时间(因为在基础服务上添加的一层转发,所以会多写一部分代码) 业务异常处理(统一格式化业务异常的返回内容
7层OSI网络模型 7层OSI网络模型概述: 7.应用层: 主要是一些终端的应用,比如说FTP(各种文件下载)、WEB(IE浏览)、QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西 5.会话层: 通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。 常常把这一层数据叫做段。 3.网络层: 主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。 在这一层工作的设备是路由器。 常把这一层的数据叫做数据包。 常把这一层的数据叫做帧。 1.物理层: 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
它将网络通信分为七层。在此模型中,第1-4层被认为是下层,主要关注数据的移动。第5-7层(称为上层)包含应用程序级别的数据。网络的运行有一个基本原则:“传递”。 每一层负责一个非常具体的工作,然后将数据传递到下一层。 第1层:物理层 从OSI模型的最底层开始是物理层。物理层规定了在载体上发送和接收数据的硬件方法,包括定义电缆,网卡和物理方面。 第3层:网络层 第3层负责在网络中进行网络消息的路由。网络层的一个重要功能是逻辑寻址。每个网络设备都有一个物理地址,称为MAC地址(见第2层)。 第7层:应用层 OSI模型的最高层-应用层,它处理应用程序用于与网络通信的技术。该层的名称是有点令人困惑,因为应用程序(如Excel或Word)实际上不是该层的一部分。 ▣第7层应用示例包括WWW browsers,NFS,SNMP,Telnet,HTTP,FTP。
背景你是否经常听到别人提到四层负载和七层负载,却不太明白是什么意思?其实,它们理解起来非常简单。 我们所说的“七层”就是指其最高层——应用层。TCP/IP四层模型:这是互联网实际应用中的事实标准,将网络分为四个层级。我们所说的“四层”对应的是传输层。 七层网络工作原理七层网络工作在应用层,需要理解数据流所用的应用层协议(如 HTTP、HTTPS)。 使用七层负载均衡(L7 LB):用户发送请求:GET /api/v1/orders HTTP/1.1 Host: www.example.com …L7 LB 会完整接收并解析这个 HTTP 请求。 根据解析出的信息(如 URL 路径为 /api/v1/orders),L7 LB 可以:内容路由:将所有以 /api/ 开头的请求转发到后端 API 服务器集群,将所有以 /static/ 开头的图片、
此时,整个供应链系统的架构如下图所示: 上图中的网关层主要负责路由、认证、监控、限流熔断等工作。 路由:所有的请求都需要通过网关层进行处理,网关层再根据 URI 将请求指向对应的后台服务,如果同一个服务存在多个服务器节点,网关层还将承担负载均衡的工作。 认证:对所有的请求进行集中认证鉴权。 为了解决这 2 个问题,最终我们决定抽象一个 API 层。 API 层 一般来说,客户端的接口需要满足聚合、分布式调用、装饰这三种需求。 从图中我们发现,所有请求经过网关后,全部交由一个共用的 API 层进行处理,而该 API 层没有自己的数据库,它的主要职责是调用其他后台服务。 通过这样的设计方案后,以上两个问题就得到了很多地解决。 我们就可以考虑使用 BFF 了。 BFF(Backend for Front) BFF 不是一个架构,而是一个设计模式,它的主要职责是为前端设计出优雅的后台服务,即一个 API。
加入了BFF 的前后端架构 ? 加入了BFF的前后端架构中,最大的区别就是前端(Mobile, Web) 不再直接访问后端微服务,而是通过 BFF 层进行访问。并且每种客户端都会有一个BFF服务。 从微服务的角度来看,有了 BFF 之后,微服务之间的相互调用更少了。这是因为一些UI的逻辑在 BFF 层进行了处理。 比如作为在 BFF 层使用 GraphQL, 这一层的 BFF 并不需要任何的数据库或者存储媒介。 整体来看,我们的前后端架构图如下,三个 App 客户端分别使用 GraphQL 的形式请求对应的 BFF。BFF 层再通过 Consul 服务发现和后端通信。 在我们这个系统中 BFF 层并不做鉴权服务,所有的鉴权过程全部由各自的微服务模块负责。BFF 只提供中转的功能。BFF 是否需要集成鉴权认证,主要看各系统自己的设计,并不是一个标准的实践。 3.
❝ 前沿:前段时间在公司内部分享了关于bff和serverless的知识体会,从概念、特征、和应用场景再到简单的实践,今天借此机会跟大家分享,什么是BFF? 什么是serverless? ❞ 1.BFF ❝ 在聊Serverless之前跟大家先谈谈BFF,BFF顾名思义就是Backend For Frontend,用中文解释就是服务于前端的后端,那么为什么会有BFF? ❞ 前端同学和后端同学都各有各的道理,有没有一种解决方案可以化解这种尴尬的场景,于是就有了BFF 1.1 介绍 ❝ BFF层初衷是在后台服务与前端(客户端)之间添加一层,接下来我们来看看下面这张图 ❞
一、BFF概述BFF(BackendForFrontend,后端前置服务)是一种专为前端服务的后端架构模式:核心理念:为每种前端设备提供定制化的API服务聚合多个后端服务的数据处理接口协议的转换解决的问题 ──────────────────────┘│││││▼││┌──────────────────────────────────────────────────────────────┐│││网关层( 复杂度中高三、BFF实现方案1.简单的BFF实现展开代码语言:JavaAI代码解释//BFF服务(SpringBoot)@RestController@RequestMapping("/api/web" ";caseMINIAPP:return"lb://miniapp-bff";default:return"lb://web-bff";}}}六、错误处理与降级1.统一错误处理展开代码语言:JavaAI BFF轻量级个人观点,仅供参考
比如有3张不同方向的数字7的图像,池化是通过图像上的小网格来检测7,不受7的位置影响,因为通过聚集的像素值,我们得到的信息大致一样。个人觉得,作者的本意是单看小网格,是有很多一样的块。 一个小的接受域,池化操作的影响仅仅是针对更深的网络层(越深感受野越大),也就是中间的特征图可能受到严重的输入失真的影响。我们不能任意增加接受域,这样会过度下采样。 b_fc1') 然后利用一维信息得到图像变换所需的6个值: x = tf.matmul(stn_params, self.W_fc1) + self.b_fc1 最后利用STN库将变换应用到图像中,得到下一层网络结构的输入