37.【学习心得】学习心得-BFF

简介: 【学习心得】学习心得-BFF

文档参考:书名:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》-王伟杰

image.png

前文如下:


23.【学习心得】学习心得-冷热分离概述

24.【学习心得】学习心得-如何分离冷热数据

25.【学习心得】学习心得-基于MySQL的分表分库

26.【学习心得】学习心得-读缓存

27.【学习心得】学习心得-如何更新redis缓存

28.【学习心得】学习心得-写缓存

29.【学习心得】学习心得-写缓存实现思路

30.【学习心得】学习心得-秒杀架构

31.【学习心得】学习心得-全链路日志

32.【学习心得】学习心得-熔断场景

33.【学习心得】学习心得-熔断技术选型

34.【学习心得】学习心得-限流

35.【学习心得】学习心得-数据一致性

36.【学习心得】学习心得-数据同步



1.业务场景:如何处理好微服务之间千丝万缕的关系


本节所讲的系统包含商品、订单、加盟商、门店(运营)、工单(门店)这几个服务,其他服务就不细说了。


除了一个App面向客户以外,还有一个App是给公司的员工和加盟商的员工使用的。里面有各种角色的用户,比如总部商品管理、总部门店管理、加盟商员工、门店人员等。当然,每个部门里面还会细分角色。


后台服务架构如图15-1所示。

网络异常,图片无法展示
|


其中,网关层负责如下工作。


1)路由:所有的请求都会通过网关层,网关层再根据URI把请求指向对应的后台服务,如果同一个服务有多个服务器节点,网关层还会做一些负载均衡的工作。

2)认证:对所有的请求进行集中认证鉴权。

3)监控:记录所有的API请求数据,API管理系统可以对API调用进行管理和性能监控。

4)限流熔断:当流量过大时,可以在网关层做限流。当后台服务出现响应延时或者故障时,可以主动熔断,保护后端的服务资源,同时,防止影响用户体验。

该架构看起来非常完美,有些类似于Spring Cloud标准架构,但它也存在一些问题。下面举两个例子。


1)有很多页面需要显示多个服务的数据。 比如App首页,它要根据用户的不同来显示不同的信息。如果是门店运营人员,就要显示工单数量、最近的工单、销售订单数据、最近待处理的订单、低于库存安全值的商品等。

2)很多时候,用户的一个提交操作需要修改多个服务的数据。 比如一个工单操作要修改库存、销售订单状态、工单的数据。


那么,第一个问题出现了:这两种情况要调用的接口做在哪个服务上?接口设计过程中,经常需要纠结这个问题。当然,最终总能达成共识——第一个接口做在门店服务上,变成图15-2所示的调用关系;第二个接口做在工单服务上,变成图15-3所示的调用关系。


网络异常,图片无法展示
|


接下来讲第二个问题。因为这样的需求非常多,所以服务经常会来回调用,最终服务调用关系就会变得纠缠不清,如图15-4所示。


网络异常,图片无法展示
|


这种复杂的依赖给迭代带来了地狱般的感受所以总结一下,目前要解决两个问题。

1)对于很多页面要用的接口,都要考虑放在哪个后台服务,这导致决策效率低下,也导致一些职责划分不统一。

2)服务之间的依赖非常混乱。

为了解决这两个问题,项目组决定抽象出一个API层。


2 API层


一般来说,客户端的接口会有以下需求。

1)聚合:一个接口需要聚合多个后台服务返回的数据,然后再返回给客户端。

2)分布式调用:一个接口可能需要依次调用多个后台服务,去修改多个后台服务的数据。

3)装饰:一个接口需要重新装饰一下后台返回的数据,删除一些字段,或者对某些字段再加一个封装,组成客户端需要的数据。

网络异常,图片无法展示
|


这样的设计至少解决了两个问题。

1)纠结某个接口该放在哪个服务的情况大幅减少了。 如果是聚合、装饰、分布式调用的逻辑,就都放在API层;如果是要落库或者查询数据库的逻辑,就看目标数据放在哪个服务,数据在哪里,逻辑就在哪里。

2)后台服务之间的依赖也大幅减少了。 目前的依赖关系只有API层去调用各个后台服务,后台服务之间的调用关系减少了。

架构看起来更完美了一些,但是会面临新的问题。


3 客户端适配问题


一般来说,有一系列的接口给各种客户端调用,比如App、H5、PC网页、小程序等。正常来说,调用关系如图15-6所示。

网络异常,图片无法展示
|


但是,这样的设计会有3个问题。

1)不同客户端的页面可能是不一样的,比如App的功能比较多,就会要求页面当中包含一些信息;小程序要求比较轻量化,同样的页面就会少一些数据。这样的问题会导致后台服务的同一个API需要为不同的客户端做不同的适配。

2)客户端经常做一些轻微的改动,比如加一个字段、减一个字段。客户端的接口都要求降低响应速度,为此需要遵循数据最小化原则。所以,伴随客户端这些细微但频繁的改动,后台服务也经常要发布新版本。

3)结合1)和2),后台服务的版本发布又要同时考虑不同客户端的兼容问题,无形中又增加了复杂度。为了解决这些问题,可以考虑使用BFF。


4. BFF(BackendforFront)


BFF不是一个架构,而是一个设计模式。它的主要理念是专门为前端设计优雅的后台服务(也就是API)。换句话说,就是每一种客户端有自己的API服务。这样调用关系就变成图15-7所示。


网络异常,图片无法展示
|


不同的客户端请求经过同一个网关后会分别重定向到专门为这种客户端设计的API服务(WX API即用于微信小程序的API)。


因为每个API服务只针对一种客户端,所以它们可以为特定的客户端进行优化,使得逻辑更轻便,而且响应速度会比一个通用的API服务更快(因为不需要判断不同客户端的逻辑)。另外,每种客户端就可以自己发布,而不需要跟其他的客户端一起排期。


图15-7中的架构是通用的,但还需要通过深入研究具体业务来完善。


这次项目所针对的系统非常庞大,整个业务链条所涉及的工作都包含在这个系统中。前面列出了6个服务,但实际上系统的服务有近百个,由几百人组成的研发团队在维护这个系统,分为新零售、供应链、财务、加盟商、售后、客服等几个部门。


大家共同维护一个App,共同维护一个用户界面,新零售、售后、加盟商、客服还有各自的小程序和H5。


网络异常,图片无法展示
|


4.1 技术架构上怎么实现整套架构


还是基于Spring Cloud实现,如图15-9所示。主要的3层分别如下。

1)网关:网关使用Spring Cloud Zuul。Zuul拉取注册到ZooKeeper的API服务,然后通过Feign调用API服务。

2)API服务:API服务是一个Spring Web服务。它没有自己的数据库,主要的逻辑就是聚合、分布式调用以及装饰数据。它通过Feign调用后台服务。

3)后台服务:后台服务也是Spring Web服务,它有自己的数据库和缓存。


网络异常,图片无法展示
|


4.2 API之间的代码重复怎么解决


一般来说,H5、小程序之间的需求都是不一样的。重复的代码逻辑主要存在于PC和App的API,因为它们有些页面功能是一样的,只不过布局不一样。针对这一点,几个部门有不一样的逻辑。


1)有的部门是将这些重复的代码放在一个JAR里面,让几个API服务共用。

2)有的部门是将这些重复的代码抽取在一个独立的称为CommonAPI的API服务中,其他API服务调用这个CommonAPI。

3)有的部门因为重复逻辑占少数,所以他们的做法就是保留这些重复代码。根据他们的评估,维护这些重复代码的成本会小于维护上述JAR或者CommonAPI服务的成本。

如果有些API服务的出入参和后台服务提供接口的出入参一摸一样,该怎么办?针对这种情况就会使用API服务的接口,其实就是一个简单的代理层,什么事都不用做。


那这些仅为代理的API接口能不能直接去掉呢?如果需要,有几个办法可以实现。


1)网关可以绕过API服务,直接调用后台服务,但是这样做就破坏了分层。

2)在API服务层做一个拦截器,如果这个URI找不到对应API服务中的controllermapping,就尝试直接通过URI去找后台的服务,有的话就直接调用。第一个办法因为破坏了分层,很快就被否决了。

项目组对第二个办法争执了很久,最终的结论是,这样做会增加系统的复杂度,出问题后调查起来很麻烦,而其好处只是去掉了一些看起来有些累赘的代码,从收益来说,并不会很大。而且这些代码的编写成本非常低,对整体的接口列表来说是可控的。综合考虑后,项目组决定,不去掉这些接口代码。


4.3 后台服务与API服务的开发团队如何分工


最后的分工是这样的:有一个专门的API团队负责这些API服务,后台的服务再根据领域来划分小组职责。


这样做的好处就在于,API团队对所有的服务有个整体的认识,由一个中心团队控制接口的划分,就不会出现后台服务划分不清楚、服务重复的情况。

当然,坏处就在于API团队整体业务逻辑偏简单一些,无法让人员长久在岗,所以也会定期进行岗位轮换。




相关文章
|
缓存 负载均衡 网络协议
面试题22解析-CDN分析
题目:描述一下CDN的工作机制?
1688 0
|
弹性计算 安全 Linux
SSL-VPN和客户端配置|学习笔记
快速学习SSL-VPN和客户端配置
SSL-VPN和客户端配置|学习笔记
|
前端开发 测试技术 持续交付
成功的上线之路:前端部署策略详解
前端部署是将您的Web应用从开发环境转移到生产环境的关键步骤。它不仅影响网站的可用性和性能,还涉及到安全性和用户体验。在本博客中,我们将深入研究前端部署的概念、最佳实践以及如何选择适合您项目的部署策略。
866 0
|
Java BI Scala
6款实用开源报表工具
大数据时代,从海量数据中挖掘出有用的数据,并以较人性化、直观的方式展示这些数据,变得尤为重要。今天小编为大家介绍6款实用的开源报表工具,你可以使用这些工具做出高效,且符合企业需求的报表。
33532 0
|
6月前
|
存储 缓存 固态存储
阿里云服务器2核8G、4核16G、8核32G价格:按量、包年包月收费标准及活动价格参考
2核8G、8核32G、4核16G配置的阿里云服务器处理器与内存比为1:4,这种配比的云服务器一般适用于中小型数据库系统、缓存、搜索集群和企业办公类应用等通用型场景。目前2核8G配置按量收费最低收费标准为0.3375元/小时,4核16G配置的按量收费标准最低为0.675元/小时,8核32G配置的按量收费标准最低为1.35元/小时,云服务器实例规格和配置不同,收费标准与活动价格也不同,本文将为您介绍这三大配置的最新的收费标准、活动价格及选型策略,以供选择参考。
|
机器学习/深度学习 人工智能 测试技术
MoBA:LLM长文本救星!月之暗面开源新一代注意力机制:处理1000万token能快16倍,已在Kimi上进行验证
MoBA 是一种新型注意力机制,通过块稀疏注意力和无参数门控机制,显著提升大型语言模型在长上下文任务中的效率。
798 3
|
存储 数据可视化 数据挖掘
想提升电商业务效率?这 6 款团队协作软件千万别错过!
在电商旺季,订单量激增,团队需高效协调运营、营销、客服、物流等环节。可视化协作办公软件成为必备工具,提升业务效率与客户满意度。本文推荐6款优秀软件:板栗看板(国产)、Trello、Asana、Wrike、Monday.com和Basecamp。这些软件具备简洁易用的操作界面、强大的可视化功能、定制化任务管理及便捷的跨团队协作,帮助电商团队应对商品上架、促销推广、订单处理等挑战。J人主导的电商公司可根据自身需求选择最适配的工具,实现高效运营与业务增长。
439 16
|
PyTorch TensorFlow API
大模型中 .safetensors 文件、.ckpt文件、.gguf和.pth以及.bin文件区别、加载和保存以及转换方式
本文讨论了大模型中不同文件格式如`.safetensors`、`.ckpt`、`.gguf`、`.pth`和`.bin`的区别、用途以及如何在TensorFlow、PyTorch和ONNX等框架之间进行加载、保存和转换。
5718 2
|
Java
Java 事件驱动编程:概念、优势与实战示例
【4月更文挑战第27天】事件驱动编程是一种编程范式,其中程序的执行流程由外部事件的发生而触发或驱动。
583 0

热门文章

最新文章