微服务囧途之BFF层登场

news2025/1/11 22:51:16

从单体架构演化为微服务架构后,架构者的期望是“模块A”+“模块B” = “后端服务”。

场景一

Web端和Mobile端都有一个详情页面,需要调用模块A的getDetail接口获取数据。假设Web端实际需要展示的字段是20个,Mobile端实际需要展示的字段是10个,对应的数据表字段为30个。

方案一:

为Web端和Mobile端提供不同的接口返回各自实际所需的字段。如:getDetailForWeb、getDetailForMobile;

方案二:

Web端和Mobile端复用同一个getDetail接口,返回字段取两端所需的并集;

方案三:

Web端和Mobile端复用同一个getDetail接口,返回数据表中的所有字段,各端自取所需,以后业务上可能会再出来小程序端、xx端等则可“复用”,可“扩展”;

方案一的囧境:

  1. 模块A承担了多端业务变化的适配工作,端上的业务调整都会引起模块A的变化;

方案二、方案三的囧境:

  1. 接口返回太多无用字段导致接口响应变慢并增加了前端同学理解接口的难度;
  2. 因为接口被多端使用会给后续维护同学增加重构的心理压力,结果就是随着业务的发展接口返回字段变得越来越多;

场景二

前端有个页面需要同时展示模块A接口和模块B接口的数据。

方案一:

前端分别调用模块A和模块B的接口并展示;

方案二:

前端调用模块A接口,模块A调用模块B获取数据并组装后返回给前端;

方案一的囧境:

  1. 当页面依赖的模块不多时不会有什么问题,当依赖的模块很多时会影响响应(浏览器对同一域名有最大请求并发限制);

方案二的囧境:

  1. 模块A和模块B耦合在了一起,并很可能出现双向依赖的情况;
  2. 模块A和模块B之间的边界开始模糊;

场景三

前端有个页面需要根据模块B getType接口的返回,来筛选展示模块A getDetail返回的内容。

方案一:

前端分别调用模块A和模块B的接口,然后根据type来筛选展示;

方案二:

前端只调用模块A getDetail接口,模块A去调用模块B getType接口并过滤数据返回给前端;

方案一的囧境:

  1. 长期发展会导致前端逻辑越来越重,还可能出现同一个功能逻辑散落在前端和后端;

方案二的囧境:

  1. 同场景二的方案二;

优化方案

增加BFF(Backend For Frontend)层,这样职责就清晰了。

前端:专注于交互、展示;

BFF层:专注于为各端提供接口服务;

能力层(模块A、模块B):专注于领域内的事情;

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

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

相关文章

记一次Metrics-server异常

报错 前几天测试环境k8s集群做etcd的备份恢复。 所有的pod都起来了,包括metrics-server的状态也是 Running,部署新pod也没有异常,结果kubectl top 请求的时候报错了 Error from server (ServiceUnavailable): the server is currently unable to handle …

Spring cloud Consul 服务注册中心实战

Spring cloud Consul服务注册中心一、简介二、功能三、角色四、工作原理1、服务注册及发现2、服务调用五、起步1、下载2、安装六、实例一、简介 Consul 用于实现分布式系统的服务注册与配置,与其它方案相比,Consul 更 “一站式”,内置了服务…

移植lighttpd笔记

一、前言 lighttpd交叉编译并移植到iTop4412平台 二、编译环境 ubuntu 18.04pcrelighttpd交叉编译链:arm-none-linux-gnueabi三、编译过程 1.pcre交叉编译 tar -xvf pcre-8.38.tar.bz2 cd pcre-8.38/ ./configure --host=arm-none-linux-gnueabi --prefix=/ --enable-utf8 …

IDEA中如何实现 git stash 命令的可视化操作?

目录 问题现象: 问题分析: 拓展:git stash 相关命令 1、git stash 2、git stash save 注释 3、git stash list 4、git stash pop 5、git stash apply stash{编号} 6、git stash drop stash{编号} 7、git stash clear 8、git stash…

flutter 内网安装包生成二维码

参考 前言 有时候我们可能需要用手机访问电脑上的文件, 或者用手机测试电脑上编写的程序 此时 在同一个wifi网络的前提下我们可以这么做: 第一种 使用python 直接使用自带python工具开启http服务, 首先打开终端, 进入需要共享的目录,然后运行以下代码即可: python -m Simple…

React TreeSelect 组件使用和优化

1、自定义折叠和展开图标 此时就要用到switcherIcon属性,以下是antd中对switcherIcon属性的描述, switcherIcon自定义树节点的展开/折叠图标ReactNode | ((props: AntTreeNodeProps) > ReactNode)-具体使用如下: import { DownOutlined…

数据库原理及MySQL应用 | 事件

事件由一个特定的线程——事件调度器来管理,事件是根据指定时间表,在某一特定的时间点,触发相关的SQL语句或存储过程。 01、事件概述 事件(Event)是根据指定时间表执行的任务,是MySQL在相应的时刻调用的过程式数据库对象。它由事…

抓包分析ssh远程主机为何变慢了?

文章目录背景SSH协议握手过程ssh 抓包MAC层包传输tcp握手抓包解释三次握手的第一个报文- SYN包第一个报文对应的抓包详情三次握手的第二个报文- SYNACK包第二个报文对应的抓包详情三次握手的第三个报文- ACK包第三个报文对应的抓包详情ssh版本协议交换密钥协商key阶段Key Excha…

程序员的工资这么高,为什么还会有人离职?

出了社会以后才发现,班级里天天打鸡血的、最奋斗的、同时也最焦虑的,不是成绩最好的,也不是成绩最差的,而是那帮处于中间的人。 他们不像那些成绩最差的,或是天天摆烂,或是靠高情商混得风生水起&#xff1b…

Pytest----pluggy源码解读基础准备

【原文链接】Pytest----pluggy源码解读基础准备 解读pluggy源码,直接使用pytest环境中安装的pluggy即可,比如这里安装的pluggy版本是1.0.0,为了更好的理解源码,这里首先使用如下应用代码作为应用实例,从如下代码中可以…

低代码助力生产管理:离散型制造业MES系统

制造业作为我国国民经济的支柱产业,在我国经济增长中占有主导作用。而制造业对经济增长的贡献很大一部分来自于以离散制造业为代表的机械装备制造、汽车零部件制造等。因此,离散制造业的发展对我国经济增长具有举足轻重的作用。 离散型制造业的特点&…

中创股份在科创板提交上会稿:计划募资6亿元,景新海为董事长

12月8日,山东中创软件商用中间件股份有限公司(下称“中创股份”)在上海证券交易所科创板提交招股书(上会稿)。相较于此前招股书,中创股份补充了截至2022年9月30日的财务数据等信息。 据贝多财经了解&#x…

记一次 Eclipse 打包的辛酸历程

文章目录1:背景2 maven 工程3 普通工程3.1 打可执行的 jar3.2 打普通 jar4: 运行 jar 包1:背景 偶然的境况下,被迫使用了 Eclipse 进行代码。遇到的代码也有点奇怪,main 方法启动 java 工程,里面封装 Tomc…

音频声音信号

音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行算法操作,WAV是Microsoft开发的一种声音文件格式,通常被用来保存未压缩的声音数据。 通道数:同时有个几个设备在进行音频的采样;采样频率&a…

Django连接MySQL与正反向迁移命令

目录 连接MySQL 方法一:pymysql连接 方法二:mysqlclient 迁移命令 连接MySQL 方法一:pymysql连接 第一步:修改settings.py配置文件中的DATABASES: DATABASES {default: {ENGINE: django.db.backends.mysql,HOS…

【车载开发系列】UDS诊断---动态定义DID($0x2C)

【车载开发系列】UDS诊断—动态定义DID($0x2C) UDS诊断---动态定义DID($0x2C)【车载开发系列】UDS诊断---动态定义DID($0x2C)一.概念定义1)DID定义方式2)DID失效条件二.应用场景三.报…

【Python游戏】今天小编用Python实现了一个植物大战僵尸小游戏 | 附源码

前言 halo,包子们下午好 今天给打击整一个植物大战僵尸 无广告版本 哈哈 说实话,现在的小游戏很多都是有广告,多少有点难受 今天给大家直接安排 相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 源码点…

java基于Springboot的社区维修平台-计算机毕业设计

项目介绍 系统管理也都将通过计算机进行整体智能化操作,对于社区维修平台所牵扯的管理及数据保存都是非常多的,例如住户管理、社区公告管理、维修工管理、维修订单管理、接单信息管理、订单信息管理、在线沟通管理、举报信息管理、留言板管理、系统管理…

4G远程智能巡检摄像机功耗测试对比

对于一款输电线路监控设备,由于装在铁塔上面,对于功耗,电网上面的应用,尤为重要,如何得做到低功耗,一直大家研究的地方,解决了功耗,基本产品成功了一半,而合方圆在电网行…

对称加密算法(一)(替换算法,Caesar, Playfair, Hill Cipher,Polyalphabetic Cipher)

文章目录Symmetric Cipher ModelSubstitution TechniquesCaesar CipherMonoalphabetic CiphersPlayfair CipherHill CipherPolyalphabetic CipherVigenere CipherVernam CipherOne-Time PadReferences对称加密,也被称为传统加密、单钥加密或私钥加密,是 …