• 西湖公园新闻网
  • 您的位置:首页 >> 国际新闻 >> 正文

    前端微服务在字节跳动的打磨与应用

    发表时间:2020-03-05 信息来源:www.art369.com.cn 浏览次数:672

     

    本文讨论了微前端在字节跳动的应用,主要分析了微前端的具体落地步骤以及近两年来的应用情况。分析部分主要讲述了一些实际问题和我们的应对措施,登陆情况强调了实现过程。特别是,我们讨论了许多必须在我们的概念中提供的微前端基石。这些方面几乎是使用微前端作为基础设施的必要前提。

    传统的前端服务通常根据业务线集成在一个站点上。随着服务复杂性的增加,包的大小将很快变得过大。为了适应这种变化,经常需要更多的开发人员和更细粒度的团队组织。在团队开发过程中,每个人的模块都被解耦到他们自己的完成,当他们上线时,他们混合在一起运行,导致无休止的分支合并和代码回滚,这都将导致合作效率的突然下降。这正是头套平台17年来面临的问题。

    代码集太大也会导致频繁发布。每个业务分支和功能点都会有一定的更新频率。如果传统的单片系统被开发、验证和启动,每个企业将允许所有项目一起升级、测试和启动。总释放频率将非常高且频繁。如果不释放原始耦合,响应能力将完全丧失。

    此外,由于版本的在线频率和迭代速度如此之高,开发人员很难跟踪哪个版本对应哪个变更。

    字节跳动微服务前端解决方案就是为了应对上述挑战而诞生的。经过几年的发展,它已经成功地支持了几十个内部和外部系统。

    问题的背景“独石”的问题是一块石头。正常翻译一般是“单体”:单体应用。这个概念在前端会议中并不流行,而“杜诗”的翻译能更好地反映他的意思。整栋建筑(或其他东西)是用整块石头雕刻而成的。例如,一只石狮。这是独石的应用。在这个快速变化和快速迭代的前端工程环境领域,存在着许多问题。“缓慢启动”单一应用程序的一个大问题是发布速度非常慢。字节跳动典型的商业情况是,最后一条线路至少需要30分钟,而前端线路需要很长时间。当然,这是我们17年来所经历的。如果我们不升级我们的技术,我们现在可能会更慢。然后在17年末,我们开始了一次大的修改,并开始拼命拥抱微前端。

    回滚一次需要10分钟。所以当时,它不可能一天发射几次,风险非常高。渐渐地导致的变化有了把握,变成了“几天在线一次,几个变化”。

    我相信这也是大多数听众都会遇到的问题。尤其是传统的后台项目。没事的,网络包。你知道的。

    会有很多人上上下下吗?很多,更多的业务,有多少更新将一起发布。

    难以理解

    当然这是一个工程问题。需要更多关注的实际上是框架问题。我们都有几十个项目在一个项目中一起工作。工程在做什么?最重要的一点是“人们能够理解”。较低的认知成本可以降低出错的可能性。

    基本上这些项目必须保持一个完全一致的组织模式。例如,模型是充血还是出血?控制器是全部放在一起,还是根据路由器与视图放在一起?这些都是非常琐碎的例子。事实上,还有许多类似的深层次问题。

    还有其他问题,比如我们在调试时是否能找到它。并不是单个应用程序不够。简单来说,就是投入多少精力和设计来解决这个问题,以及需要多少精力来防止这个设计规范问题崩溃。

    这一类都是单个应用程序本身的代码问题。"如果拆除,就不会有这样的东西."

    框架无法调整。

    从架构的角度来看,现在前端项目需要如何开发,它们通常是如何工作的?从我在上一段中读到的,我们知道大多数优秀的建筑师和工程师都通过杰出的建筑设计解决了许多困难。

    然后每个人都知道在前端实际上有很多框架和实践。i

    很难说极端困难的情况是来自框架还是产生框架的方法。但这是一个值得思考的问题。所以你看,接管并得到项目或什么。什么都别说。你会学会的。无论如何,现有的结构肯定相当好。你必须学习一段时间,并正确使用它。“微前端”开始谈论我们在字节跳动的细节,包括服务发现、操作隔离、环境一致性和其他架构优势。事实上,在所有这些事情都完成之后,我们就能找出是什么使一个非常特殊的计划在习惯上有了相对大的改变成为可能的主要含义。实现这样一个独特的计划不是通过交谈、同意和快乐就能实现的。它涉及过程、成本、风险等方面。

    “工程师”的任务不是证明一个结构在理论上可以存在,而是要有建造这个结构的过程。例如,你可以通过化学键找出任何可能存在的分子,你可以画一个小人。然而,有可能知道如何合成,哪条路径可以用来制造这种分子,哪条路径是最快和最便宜的。这通常是工程师的任务。

    Service Discovery

    Service Discovery我们将首先讨论它在整个微服务模型中扮演什么角色以及它是如何工作的。然后第二部分谈论什么问题正在被解决,他能提供什么新的能力。我们非常重视新的能力,因为我们的位置不是消防队的位置,我们将在灭火时完成任务。有许多新的目标和新的好处可以探索和实现。

    最后,我想谈谈它在字节跳动是如何实施的。

    1。原则

    “服务发现”意味着在最初的单个服务被拆分后,最初项目中的方法被单独部署,没有人能找到任何人。需要有一个统一的注册机构来检查所有的服务部署。

    “发现”是当您想要访问微服务时,如何找到它。

    所以有两种配置。一个是网飞操作系统,它在客户端的机器上有一个服务目录,处理逻辑在客户端的代码中。另一个是服务器端的服务发现,AWS就是这种情况。

    传统微服务的服务发现更像是函数调用的替代。如何在拆卸后转移部署在不同容器中的功能。这里的微前端思想非常相似,只是功能略有不同。微服务的情况是区分订阅、通知、请求和发布。前端可能没有使用,或者在前端运行时似乎没有使用。还有一些事情,如“单对单”和“多对多”,这些基本上是前端不需要考虑太多的事情。

    两者的一致之处在于没有人知道谁,你如何知道哪些服务存在,以及谁在提供这些服务?现在,让我们来讨论各种配置背后的服务发现和服务注册的具体情况。

    客户端服务发现意味着客户端(即服务的调用者)请求一个包含所有服务和负载平衡的基本信息的注册目录,然后决定如何处理它以及使用哪个特定的负载平衡策略。例如,网飞的开放源码软件服务在网飞尤里卡注册,它的心跳传递给所有的客户。客户自己制作,简单直观。

    服务器端服务发现类似于AWS弹性负载平衡器。客户端请求结束,服务器决定如何为您反转代理和负载平衡。

    服务注册分为自我注册和第三方注册。自我注册是不言而喻的。第三方注册是一种保持活动的机制,它定期检查服务状态,并帮助您控制是向上还是向下。

    我们主要使用第一个:客户端服务发现,也就是说,您需要请求一个额外的模块列表。该列表中给出的资源是根据用户会话确定的,并且具有丰富的动态能力。然后客户端根据列表中的各种信息加载模块资源。

    2。你在前端带了什么?

    通过服务发现来组织微前端,不仅可以解耦和加速复杂的在线过程,还可以使分解后的工程版本易于对齐,实现更高的稳定性和调试性。它还为前端项目带来了许多其他好处。现在让我们谈谈两个最重要的好处。

    快速启动的概念是什么?我之前说过,几十个企业将在一个项目中一起发布。多久可以发布一次?对放宽限制后的情况进行实际检查,会发现出乎意料的高水平。我们的微型前端应用之一是横幅号码,它在2019年上半年发布了2000个版本。如前所述,传统在线需要30分钟来完成打包升级和容器重启,10分钟来完成回滚,这意味着在线和离线需要1000小时的等待时间。相比之下,我们的新方法在我们单击HTTP请求时生效,这是毫秒级的响应速度。

    这不是一个需要等待才能搁置的缓慢问题。人们不会像这样直接发送。它们都遵循本地版本的火车版本。因此,响应效率已经大大降低,许多需求已经逐渐不再成为开发所导致的瓶颈,而是必须等待版本的发布。

    独立切换。我们现在将分开发送。单个页面应用程序可以分成几十个模块,每个模块一个,每个模块另一个。此外,后面还会提到,您还可以配置自己的AB测试版本:10个模块可以产生1024个AB版本组合,20个模块有100万个模块。我以前根本无法想象也就是说,一起出版版本的时代根本做不到。我现在不敢想象的是,你说AB测试不能在字节跳动的某个企业中进行。

    我们的横幅平台只是一个典型的微型前端项目,包括列出的这么多模块,每个模块都有自己的版本和对服务版本的会话控制。每个模块都有一个版本列表,还有一个模块有所有的版本历史。通过这个平台,可以配置小流量、AB和在线规则。

    运行隔离1。耦合开发的严峻形势

    17年来,当我们推进这个项目时,有一个非常好的帖子在朋友中非常流行。Ta从去耦维度引入了这个方向。当时,我们也有一个非常明确的业务需求,需要将公司不同部门的人员组织到一个项目中。经过多年的积累,这个项目已经变得非常臃肿,积累了很多值得仔细研究的工程细节,而不是直接的技术。这意味着使用不同的组织、不同的技术、不同的工程规范和打包工具来共同编写同一个平台和同一个项目。如果在那个时候使用它,它可能只是勉强满足业务的权宜之计,这完全不符合我们追求完美的习惯。

    然后我们非常关心这种跨团队的合作。我们希望整合不同的技术团队,实现更少或没有沟通。运行隔离是一个非常绝对的基本前提。我们还利用大量空间引入了内部和外部的其他共享。那会有什么影响?这是我们在4月18日的内部培训中记录的内容:

    我们通过调试工具将在线页面(左)插入到脚本中,暂时删除了沙盒函数,并获得了正确的效果。

    2。运行隔离的目标

    运行隔离意味着什么?回想一下刚才提到的AB测试问题,以及20个项目有多少个组合。如果这被映射到bug维度,那么对每个人来说在一个应用程序中运行是多么可怕。那么这种组合对我们的程序和程序员提出了什么样的要求呢?

    不跑不挂是“所有工程师最基本的要求”。我认为这并不夸张。所有软件工程师的第一个能力水平应该是不拖累系统。在微服务之后,这个问题并不明显,因为有一种架构方法可以解决大多数挑战。我确信的一个理论是,所有的程序员都有四个阶段:完成编写需求,不拖垮其他人,扩展容量,以及拥有良好的性能。

    不干涉也是另一个大问题。我们的西瓜团队和标题在当时是两个独立的应用。他们与我们的合作完全是跨部门的,甚至polyfill的规则也是不同的。我还提前做了许多公共组件和CSS约定。然而,规范和协议远远不够。从最坏的情况到最好的情况,合作的领域应该是:

    设定标准:每个来的人都应该努力学习,认真倾听,并为自己的行为承担全部责任。

    实施规范:不是通过自我意识,而是

    (1)变量保护:全局变量、DOM和CSS基本上是同一条路径。前后两张快照,让我们比较一下,然后根据需要帮你恢复场景。这一段内容并不详细,看一看图片就不言而喻:一次比较和对比所有键,两次遍历,黑名单位置,只读白名单。我想每个人都明白我说的话。

    ②沙盒计时:多说一点。右图是我们装载和混合五个ABCDE模块的时序图。虚线的左侧是负载,右侧是独占线程花费的时间。换句话说,有五个ABCDE模块和五个沙盒,它们分别编译(下载、创建js变量和函数、运行这些语句并最终生成一个)和运行(该模块被打开并呈现所有相应的函数)。

    有两个基础:js单线程和事件循环

    我们使用一个非常简单的单进程操作系统的概念,它就像一个单核中央处理器。你激活了一个模块,这相当于激活了一个线程,其他的都回到了后台。

    事实上,单核单进程并非不可避免。每个人都知道这个原则。在事件循环的基础上,我们可以封装所有的异步操作,并将回调放在沙箱激活之后。例如,和,每个模块看起来都是并行运行的。这可以说得很多,但是想想操作系统的类比。

    4。加载方法

    Response的项目本身并没有被提及太多,我们已经为各种项目提供了示例(也就是说,不包括显示层框架的原始版本)。每个版本都取得了一系列相似的效果。

    模块是一个接一个的CMD包,我用它们来包装。另一个是特定母版页项目框架的协议。加载过程分为五个钩子:

    是否预加载,如果是,将触发Ajax。各种空闲策略和阻塞策略都可以由主人制定。

    在开始运行此部分之前,编译先决条件。执行的结果是CMD。

    是模块条目的函数,由模块开发人员提供,并返回模块的所有输出。此函数的传入参数由masterpage主项目提供。

    加载完毕,得到编译结果。

    等一下,不太详细。

    环境是一样的

    因为我们都在谈论什么是微服务以及它会有多有效,而我们从来没有谈论过实现微服务需要做什么。现在这部分内容是我们第一次公开分享。这也是一个非常独立的维度。

    事实上,这就是为什么这种环境一致的工具对于微前端是必要的,这是唯一的解决方法。如果你不这样做,你将很容易陷入困境,项目将失败。然后我可能不知道为什么会失败,我把问题归咎于框架差、人员差甚至前端差。

    1 . serverless vs container

    是一个寄生环境,尽管这个环境与linux不同,它是一个完整的操作系统。相比之下,无服务器要特别得多。它是如此的特别,以至于谷歌云在商业上也被打败了。

    例如,这里有两个无服务器的例子。它的本地工具是一个命令行界面系统:SAM,这是一个非常典型的必要基础设施。如果集装箱自动装卸系统的发展完全依赖于码头工人,那么lambda的发展依赖于SAM。

    另一个典型的例子。我认为前端学生非常清楚,并且已经使用了他们的开发工具包。这些工具都非常重视地方发展。我可以在测试前做一个项目吗?或者先调试一下。

    这样做是为了尽可能地模拟真实环境。萨姆的话模拟了应用编程接口网关和内存限制。有实时调试和本地调试。如果不是,你为什么疯了?有些人敢于把网上交易放到一个非常不同的环境中。

    2。“你有环境问题吗(这对我有好处)”标题程序员最常见的说法是对的吗?另一个表达是“我很擅长这个”。每个人都知道,在大多数情况下,这样说是错误的,但人们常常忍不住这样说。这更像是告诉自己。一种自我质疑,自我质疑,“我这就好”

    我们用一个沙箱把微型前端做成一个容器,就像浏览器中的码头工人。然而,这还不够。我们仍然认为这个应用程序框架的特征,即寄生在母版页中的业务特定逻辑,是无服务器的。

    然后我们也把孤立的想法发挥到了极致。我们的命令是通过启动参数启动一个完全独立的Chrome会话,有自己的cookie和缓存。效果就像安装2个铬合金或者更多的铬合金。那么代理工具也默认配备了启动参数,这是一个pac文件。因此,它也可以单独使用或与开关一起安装。

    代理工具是调试环境的全部配置。那些经历过测试环境的人和那些上网的人要求所有的代理管理。生成动态pac地址和代理服务。这就是我刚才说的。

    关键请求,如服务发现请求,显然是被代理的。取一个我们为本地环境定制的返回值。更详细的功能是我们可以帮助调试母版页和组装模块。您也可以使用指定版本的母版页来调用您正在编写的模块。

    您也可以指定是否加载完整的联机模块列表,并只替换正在调试的模块。

    我们还有一套完整的服务来选择嵌入webpack dev服务器。我之前说过,我支持任何包装工具。这个是解耦的,但是我们可以为您重新加载它,并动态地部分刷新它。我以后会再谈。

    发布检查用于服务注册。其中一部分,我们的构建命令有一组对应于git钩子的检查。

    易于调试我们在一定程度上也支持HMR。我们可以像开发普通的前端应用程序一样开发母版页和子模块。子模块在更新后改变模块管理器的状态,HMR由内置的事件总线机制重新渲染,这也可以在流行的环境中使用。

    我们的公共库可以在模块之间共享,方法是将它引入到母版页项目中,并在子模块中使用外部库。它还支持子模块使用基础库的特定版本。

    Vue使用全局变量和原型链扩展,暂时不支持热重载调试。

    其他框架优势

    框架是无服务器的方向。无服务器并不是前端无服务器,业务模块开发人员不再需要关心很多事情。例如。现在每个人都知道网上商务应该干净整洁,控制台应该整洁。这就是我们前面提到的规格级别。我们可以吸收所有控制台并存储错误堆栈。然后,用户反馈作为跟踪元数据等提交给反馈背景。

    这些都是母版页级别的框架。当然不一定。然而,可以说,微前端为组织这样的项目提供了一个非常方便的渠道。

    我们线上的源地图也是根据服务发现的管理后台权限来控制的,只有开发人员可以看到它。

    下一代前端展望

    如前所述,服务发现是对前端可用资源的全面管理。这种能力并不局限于运行时的微服务前端。它适用于所有资源。让我们来谈谈这个。

    服务发现CDN

    抽象了一个完整的前端访问,首先分为三个步骤:页面加载、服务发现和根据服务发现结果加载资源。有不同的种类。最直观的是AB组合,SSR绘图,html请求下来,模块列表资源列表已经完成。这个系统的代号是高飞。当然,也可以组装作业指导书。这将在后面详细解释。

    另一个想法是业务连续性集成。我要求一个列表,不用说我可以组合所有的js内容。附加请求较少。

    简而言之,这是美国广播公司。

    令牌解析

    中央服务从中央机房向边缘节点发送规则心跳。边缘节点接收客户请求并解析附近的基本令牌。在这个过程中,它不依赖于其他服务。

    此令牌由边缘的同一页面服务提供。令牌老化在某种程度上取决于前端SDK,因为它与中央机房中的验证步骤是分开的。

    high availability

    high availability可以说是边缘计算的一大好处,给了我们额外的好处。该系统的容灾能力基本相当于智能域名系统所对应的成熟的探针保活技术。

    我们需要的是将边缘节点发送到监控服务,它们将在分钟级别上动态修改DNS。如果没有足够的边缘节点生存,域名系统也可以转移到传统的中央机房。

    这样,th

    这些都是分享的内容。从登陆的细节来看,我们分享了字节跳动在过去两年中使用微前端的经验以及面对这些挑战时的思考过程。我们非常幸运,我们的项目得到了我们强大合作伙伴的足够支持,我们最终取得了巨大成功,这也明显提高了重量级产品的质量。

    微前端,像许多前沿和新开发的概念一样,仍在快速发展和验证。我们的具体做法也在经历快速变化。我们不断发现弱点并加以纠正,同时也在努力开发更多的可能性。在这场从各种不完美到完美的斗争中,与读者分享我们的成就是我们的荣幸。分享之后,如果我们能收到评论、讨论和建议,我们将会更加感激和欢迎。更多有识之士也欢迎加入我们。详情请参考job.bytedance.com(点击文章末尾的“阅读原文”获取内部链接)。

    欢迎来到“字节跳动技术团队”

    ?点击阅读原文,加入我们吧!

  • 热门标签

  • 日期归档

  • 友情链接:

    西湖公园新闻网 版权所有© www.art369.com.cn 技术支持:西湖公园新闻网 | 网站地图