有水友在评论里留言问我:沉总,我在一家创业公司工作,研发团队大概20人左右。团队正在推动前后端分离。我觉得结构变复杂了,项目开发周期变长了,但是组长说互联网公司都在做前后端分离,我们也应该做。我还是不明白为什么要前后端分离?今天简单说说互联网分层架构中的前后端分离。画外音:“别人在做xxoo技术”一定不能成为企业宣传“xxoo技术”的理由。上图是一个典型的互联网分层架构:业务站点层:web-server;业务服务层:biz-service;基础数据服务层:data-service;数据存储层:db+cache;,业务越来越复杂,改版越来越多。此时,虽然业务站点层的web-server层采用了MVC架构,但下面的痛点是不是似曾相识?(1)产品追求华丽的效果,对设备兼容性要求高,这些要求不断折磨着使用MVC的Java工程师;画外音:本文以Java后端为例。(2)无论是PC、手机H5,还是APP,应用前端展示的变化频率远大于后端逻辑的变化频率。更改速度模板不是Java工程师喜欢和擅长的工作;画外音:谢谢喜欢做改版的产品经理。这时为了缓解这些问题,一般会单独成立一个前端FE部门,负责交互和展示的研发。其职责与后端Java工程师分离,但痛点真的解决了吗?Java工程师重新编译、打包、上线、重启tomcat,效率极低;原来Java工程师负责所有的MVC研发工作,现在分为Java和FE。他们需要等前后端开发完成后,才能一起调试整体。这样一来,不仅增加了沟通成本,任何一个环节出现问题都可能导致项目延期;画外音:你受过酷刑吗?层结构如下:client,web-server,service,很清晰。随着业务的发展,产品需要增加Mobile版本。移动版和PC版的大部分业务逻辑是一样的。有什么不同?不一样;产品功能会比较少,大部分服务调用都是一样的,少数服务不需要调用;展示和交互会有所不同;由于工期紧,手机版的web-server一般是怎么来的?对,把pc版的工程复制一份,然后做少量修改:服务调用的参数变了;大多数服务调用是相同的,并且删除了一些服务调用;修改显示和交互相关代码;画外音:你有副本吗?密码?业务不断发展,产品需要增加APP版本。APP版和Mobile版的业务逻辑是完全一样的。有什么不同?(1)Mobile版返回html格式的数据,APP版返回json格式的数据,然后进行本地渲染;由于工期紧,您平时是如何获取APP版的web-server的?没错,复制一份Mobile版工程,然后进行少量修改:(2)更改组装html数据的代码,修改为组装json数据;如此迭代演化,架构会演化成什么?终端:PC、手机、APP;站点应用层:PC站、M站、APP站;服务层:通用业务服务、基础数据服务;这个架构图中的依赖关系看起来是不是很别扭?端与web-server的连接关系非常清晰;web-server和service之间的连接关系变成了蜘蛛网;上面提到的分层架构,可能是什么问题?PC/H5/APP的web-server层的大部分业务是相同的,只有少数逻辑/展示/交互不同:一旦一个服务RPC接口稍有变化,所有的web-server系统都需要升级和修改;Web服务器之间有很多代码副本;一旦复制代码,出现bug,需要升级修改多个子系统;如何让数据获取更高效、更快速,数据生产与数据展示如何解耦?前后端分离的分层抽象势在必行。通过前后端分离分层抽象:站点表现层:node.js,负责数据展示和交互,由FE维护;站点数据层:web-server,负责提供业务逻辑和json数据接口,由Java工程师维护;这样做有什么好处?复杂的业务逻辑和数据生成,只需在站点数据层编写一次,无需代码拷贝;如果底层服务接口发生变化,只需要升级站点数据层的一部分;如果底层服务有bug,只需要升级和修改一个站点数据层;站点展示层可以根据不同的产品形态传入不同的参数,调用不同的站点数据层接口;除此之外,还有很多优点:产品追求华丽效果,对设备兼容性要求高,不再困扰Java工程师,将由更专业的FE对接;一点点改动,不再需要Java工程师重新编译、打包、上线、重启tomcat;约定json接口后,Java和FE分开开发,FE可以使用mock接口自测,不再等待联调;所以,如上图,架构进化了,前后端分离了。当业务越来越复杂,端上的产品越来越多,表现层的变化越来越多,站点层的代码副本越来越多,当数据获取的复杂性成为常态痛点,前后都要做。端到端分离,分层抽象,简化数据采集流程,提升数据采集效率,屏蔽上游底层复杂性。另外需要强调的是,是否需要前后端分离与业务复杂度、业务发展阶段、人员素质模型等有关,切不可一概而论。要实现前后端分离,必须考虑以下四点。(1)第一点是SEO的考虑。如果是PC端站点,需要考虑是否需要大力支持SEO。前后端分离的架构很可能对搜索引擎蜘蛛不友好,可能会影响网站的收录。当然,如果是原生APP,后端node.js只返回json数据,或者是单页应用SPA(对于百度来说就是一个页??面),就不需要考虑这个问题。(2)第二点是产品特性的考虑。很多产品追求炫酷的前端效果,对前端兼容性要求高,前端产品改版频率高,需要前后端分离。否则,前后端分离只会给系统架构带来更多的复杂性。第三点是公司发展阶段的考虑。公司发展初期,人员比较少,对产品迭代速度要求比较高。这个时候就需要更多的全栈工程师,一个人可以从前到后开发。如果此时前后端分离,就会引入“联调”的理论,沟通成本比会增加,可能会导致产品迭代速度下降。第四点是人员技能的考虑。在传统的FE与后端Java/PHP工程师合作的方式中,FE工程师不需要具备深厚的后端知识。前后端分离一旦引入,node.js层的前端同学需要对后端的知识体系有更多的了解。一些FE学生拒绝后端技能导致人员不稳定。总之,前后端分离不仅是分层架构的技术决策,还与SEO、产品特性、公司发展阶段、人员知识体系等有关,切不可一概而论。任何倒闭的建筑设计都是耍流氓。希望大家有所收获。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
