你可能并不需要微前端

简介: 去年看到社区里一些关于微前端的讨论时,就想写篇文章梳理一下自己的观点,后来因为种种原因搁置了(主要是懒)。今天在微信群中看到又有不少人谈起微前端,虽遗憾错过了讨论,但也勾起了自己的表达欲。所以这里整理了一些文字,记录下自己的观点。
来源:Alibaba F2E公众号
作者:有知

image.png

去年看到社区里一些关于微前端的讨论时,就想写篇文章梳理一下自己的观点,后来因为种种原因搁置了(主要是懒)。今天在微信群中看到又有不少人谈起微前端,虽遗憾错过了讨论,但也勾起了自己的表达欲。所以这里整理了一些文字,记录下自己的观点。

先说两个观点。

1. 微前端是「康威定律」在前端架构上的映射

设计系统的架构受制于产生这些设计的组织的沟通结构。 — M.Conway

康威定律几乎就是微前端(准确来说是微服务架构)的理论基础了。它指出了组织架构越庞大,其系统间沟通成本越高的问题。而解决这一问题的有效手段就是,将大的系统拆分成一个个微小的,可以独立自治的子系统。一旦系统的依赖限制在了内部,功能上更加内聚,对外部的依赖变少,那么就能显著的减少跨系统之间的沟通成本了。

简单来说,康威定律的指导思想就是:既然沟通是大问题,那么就不要沟通就好了[doge.jpg]。

所以本质上,微前端(微服务架构)关注的是如何解决组织和团队间协作带来的工程问题,而不是单纯的某个技术问题。

image.png

群里飞叔只说对了一半,实际上当时我是有各个前端应用的主控权的。但主要问题出在这些系统都是 4年+、代码 20W行+ 的长尾应用,而产品还在持续的集成迭代,我既没精力去给他们做技术栈升级,也没动力(兴趣)去跟一个个前应用 owner 沟通了解一些技术细节。

这可间接的引出我的第二个观点。

2. 微前端的假设是,所有大型系统都逃不过熵增定律

这个假设指的是,所有大型系统都将从有序变为无序,他们背后的 codebase 的归宿都将是「屎山」。

如果不是,那一定是因为这个系统使用的技术栈更新的不够快,参与系统开发的工程师不够多,产品迭代的时间不够长。

在潜意识里,微前端的采纳者就不相信一个系统会永远健康的迭代下去。因为熵增永远是自然且轻松的,而对抗熵增,则必须有足够的外力介入、足够的成本投入才行。

这也是为什么,qiankun 的很大一批用户,都是因为要在一批长尾应用上迭代新功能,最后实在搞不动,才会尝试用微前端的方案来解决了。

基于此,微前端很多时候是「悲观主义工程师」在工程上的妥协,是一种防御性,有时候甚至是「掩耳盗铃」式的架构策略。

当然在理想状态下,对于一个有追求的工程师而言,所有的技术问题都应该是被正面修复、正确治理的,而不是起手就来一个 workaround。但同时所有的软件工程原则也都会告诉我们,不遗余力、不计成本的去优化、解决一个技术问题是不可取的,尤其是在这个问题的投入产出比不高的情况下。

微前端倡导的不是消极的、投降主义的去回避系统中的历史遗留问题,而是告诉我们,很多时候我们可以通过分而治之的手段,让「上帝的归上帝,凯撒的归凯撒」。

满足以下几点,你可能就不需要微前端

基于以上两个观点,我们可以概括出,存在以下场景时,你可能就不需要微前端:

  • 你/你的团队 具备系统内所有架构组件的话语权

简单来说就是,系统里的所有组件都是由一个小的团队开发的。

  • 你/你的团队 有足够动力去治理、改造这个系统中的所有组件

直接改造存量系统的收益大于新老系统混杂带来的问题。

  • 系统及组织架构上,各部件之间本身就是强耦合、自洽、不可分离的

系统本身就是一个最小单元的「架构量子」,拆分的成本高于治理的成本。

极高的产品体验要求,对任何产品交互上的不一致零容忍
不允许交互上不一致的情况出现,这基本上从产品上否决了渐进式升级的技术策略

满足以下几点,你才确实可能需要微前端

1.系统本身是需要集成和被集成的 一般有两种情况:

  • 旧的系统不能下,新的需求还在来。没有一家商业公司会同意工程师以单纯的技术升级的理由,直接下线一个有着一定用户的存量系统的。而你大概又不能简单通过 iframe 这种「靠谱的」手段完成新功能的接入,因为产品说需要「弹个框弹到中间」
  • 你的系统需要有一套支持动态插拔的机制。这个机制可以是一套精心设计的插件体系,但一旦出现接入应用或被接入应用年代够久远、改造成本过高的场景,可能后面还是会过渡到各种微前端的玩法。

2.系统中的部件具备足够清晰的服务边界
通过微前端手段划分服务边界,将复杂度隔离在不同的系统单元中,从而避免因熵增速度不一致带来的代码腐化的传染,以及研发节奏差异带来的工程协同上的问题。

还是那个老生常谈的理念,没有银弹,架构本身就是各种 trade–off。

大部分时候,一个「流行」的东西,你都无法阻止不需要它的人去使用它。

f441bb4cf20944bda66ddae869a2c488.png

相关文章
|
Web App开发 运维 监控
物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
物联网相比这些年来,大家都了解很多了,直白的讲,就是万物互联,万物上网。那么这里的物联网3D就是指通过三维可视化的方式展现物联网监控设备。对设备的位置信息,状态信息能一目了然。面向IT设施和资源的一体化综合监控与远程操控方式。通过三维可视化方式展现,解决监控资源繁多、开源工具使用复杂、问题定位困难等问题。
1360 0
物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
|
开发工具
推荐几款typora替代品
MarkText Typedown Atom
ThreeJs制作管道水流效果
这篇文章详细说明了如何在Three.js中创建具有流动水效果的管道模型,通过使用纹理贴图的动态偏移来模拟水流的视觉效果。
1092 3
|
负载均衡 网络协议 算法
|
存储 机器学习/深度学习 程序员
OpenCv探索
OpenCv探索
205 9
|
供应链 算法
深度 | 5分钟读懂阿里零售通智慧供应链平台
大家好,先做个简单自我介绍,过去十年更多是在2B类业务方面做技术架构和研发工作,近两年专注在零售通供应链方面的技术架构和研发的工作。从技术视角分享二点最近几年感受比较深刻的,第一个点,从技术的架构的升级,从过去的电商架构到现在新零售的架构,比如从过去信息平台到交易平台再到现在供应链协同平台,其架构演进的核心动力是互联网、大数据等技术与商业不断融合和发展。
14385 0
|
缓存
什么是http状态码?常见的有哪些?它们所代表什么含义?
什么是http状态码?常见的有哪些?它们所代表什么含义?
715 0
|
存储 缓存 数据库
Shiro【核心功能、核心组件、项目搭建 、配置文件认证、数据库认证 】(一)-全面详解(学习总结---从入门到深化)
Shiro【核心功能、核心组件、项目搭建 、配置文件认证、数据库认证 】(一)-全面详解(学习总结---从入门到深化)
793 1
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
|
存储 SQL Java
【JavaSE语法】类和对象(二)
本文主要介绍了面向对象的三大特点之一封装,并引入了包的概念;还介绍了static修饰类的成员(变量+方法),最突出的特点就是static修饰的属于类,而不属于某个对象;最后介绍了四种代码块
124 7

热门文章

最新文章

下一篇
开通oss服务