前后端分离的一些理解

前后端分离

前后端分离,本质是关注点的分离。软件越来越复杂,需要有人来专注于表现和交互,有人专注于领域逻辑。于是前后端分离出现了。前端关注交互体验,这些看得到摸的着的部分。后端关注于表达正确的业务。有争议的地方就在于controller这一层应该放到前端还是后端。并且随着前后端分离,前后端的协作问题就暴露出来。

Controller在前

这样的项目可以从职能上分为两个部分。

  • 服务
    提供各种服务,比如领域服务,消息服务,权限服务等。是一个可以独立的对内对外的纯服务,更加重领域建模,重设计。
  • 产品
    组合服务,提供视图,控制产品的整个生命周期。是一个独立的客户端,通过消费后端服务,提供服务,更重产品。
  • 协作
    • 独立性:各自可以独立开发,独立部署。
    • 依赖:前端需要依赖后端暴漏的服务接口(领域,资源接口,具有一定的通用性,接近数据库)。后端在完成设计的时候,提供服务并且返回mock的数据。在后端调整服务URL,请求方式,请求参数,返回数据时需要通知前端变更。
    • 环境:需要一个拥有完整服务的测试环境,前端开发需要调用各种服务,因此需要各个服务都在运行状态。
  • 打个比方
    这种开发方式,后端就像支付宝公司,前端就像我们的服务。我们按照支付宝的接口约定,调用支付宝的支付服务。

    Controller在后

    这样的项目一般从文件上进行分拆

  • 静态页面部分
    前端写js,css,模板;
  • 非静态页面部分
    后端写服务;组合服务,提供视图,控制产品的整个生命周期。
  • 协作
    • 独立性:各自独立开发,部署在一起。
    • 依赖:后端需要配置前端maven依赖(通过maven方式分发前端项目)。前端依赖后端容器(servlet,velocity Context等)提供的数据来填充模板,需要后端提供的业务接口。后端调整服务URL,请求方式,请求参数,返回数据时需要通知前端变更。
    • 环境:需要一个拥有完整服务的测试环境,后端需要调用各种服务,因此需要各个服务都在运行状态。
  • 打个比方:
    这种开发方式,类似后端好比包工头,前端好比搬砖头。前端技术会受限于后端,而后端也会因为需要考虑前端而分散精力,并没有达到关注点分离的效果。

tips:服务接口业务接口只是为了区分做的事情不同而已。可以简单的理解为离数据库的远和近。离数据库越近,粒度越粗,通用性越好,离数据库越远,越靠近变现层,会更具体,粒度更细,通用性越差。这里服务接口是更靠近数据库。考虑如下的过程:

db(net ram file mq)  ->  po(持久化) -> do(领域建模) -> bo(业务模型) -> dto(传输对象)

实现和选择

和公司的情况有关系,如果公司没有专业前端,那么选择controller前置的策略。进行项目的拆分,分出服务和应用。技术实现上前端可以选择基于spring mvc(ruby python或其他)的全栈或者基于NodeJS的新的全栈方式。
如果公司有专业前端。那么初期选择controller后置的方式,会是一个自然的选择。以后的进化可以选择NodeJs的全栈开发方式。实现服务和应用的分离。

未来遐想

对于后端人员的JS之路,需要了解浏览器排版规则,浏览器诡异bug,以及各种黑暗魔法,其挑战不可谓不大。而对于前端开发人员的NodeJs之路,需要学习应用开发中的复杂性和各种坑点。这和单单做页面完全是不一样的东西,其挑战性甚至比后端人员学习JS更大。
然而技术归技术,好的交互并非只有技术就够了。预想会有三个只能规划:

  • 交互
  • 应用
  • 服务
时间: 2024-10-13 17:24:20

前后端分离的一些理解的相关文章

关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)

前文讲到了CSI技术,这就说明网站静态化技术的讲述已经推进到了浏览器端了即真正到了web前端的范畴了,而时下web前端技术的前沿之一就是前后端分离技术了,那么在这里网站静态化技术和前后端分离技术产生了交集,所以今天我将讨论下前后端分离技术,前后端分离技术讨论完后,下一篇文章我将会以网站静态化技术的角度回过头来重新审视下前后端分离技术,希望通过这种审视来加深我们对两套技术的理解. 前后端分离技术我个人认为是web前端被专业化以后的必由之路,而nodejs的出现是前后端分离技术的一个强兴的催化剂,原

基于NodeJS进行前后端分离

1.什么是前后端分离 传统的SPA模式:所有用到的展现数据都是后端通过异步接口(AJAX/JSONP)的方式提供的,前端只管展现. 从某种意义上来说,SPA确实做到了前后端分离,但这种方式存在两个问题: WEB服务中,SPA类占的比例很少.很多场景下还有同步/同步+异步混合的模式,SPA不能作为一种通用的解决方案. 现阶段的SPA开发模式,接口通常是按照展现逻辑来提供的,而且为了提高效率我们也需要后端帮我们处理一些展现逻辑,这就意味着后端还是涉足了view层的工作,不是真正的前后端分离. 现阶段

【转】关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)

前文讲到了CSI技术,这就说明网站静态化技术的讲述已经推进到了浏览器端了即真正到了web前端的范畴了,而时下web前端技术的前沿之一就是前后端分离技术了,那么在这里网站静态化技术和前后端分离技术产生了交集,所以今天我将讨论下前后端分离技术,前后端分离技术讨论完后,下一篇文章我将会以网站静态化技术的角度回过头来重新审视下前后端分离技术,希望通过这种审视来加深我们对两套技术的理解. 前后端分离技术我个人认为是web前端被专业化以后的必由之路,而nodejs的出现是前后端分离技术的一个强兴的催化剂,原

前后端分离springmvc和RESTful理解

1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的Java Bean,包含一系列的成员变量及其getter/setter方法.对于视图而言,它更加偏重于展现,也就是说,视图决定了界面到底长什么样子,在Java中可通过JSP来充当视图,或者通过纯HTML的方式进行展现,而后

【前端经典面试题】前后端分离(说一说你理解的前后端分离?)

前言:昨晚面试遇到了这个问题,既然遇到了,找些资料来一起做个总结吧. 1.对前后端分离的误解  在回答这个问题的时候不要钻到某个具体的技术 ,或者某个具体的框架上面→比如ajax异步请求.vue或react等组件化的开发框架.再或者rest接口规范.API接口数据约定等.从某个具体的技术切入来回答对前后端分离的理解本身就是一种局限的看法,所以在回答这个问题的时候应该从以下几个方面展开. 2.为什么要分离?  在以往的很长一段时间里,后端开发才是开发团队里的核心,前端开发往往仅由一小撮人甚至交给后

理解什么是前后端分离

HTML.CSS.JS. AJAX或Fetch. 学习一个前端的框架, React或者Vue或者Angularjs2都可以. 学会一个前端的路由框架, 如React-Router或者Vue-Router. 在学会3的基础上你肯定已经搭建好前端的开发环境了,所有和后端的交互走AJAX或者Fetch. SpringMVC 不再返回一个视图, 直接返回JSON. 前端从后端获取的所有数据都是JSON,至于怎么去更新页面, 你学会3后你肯定已经知道了. 页面跳转相关的东西你学会4后你肯定已经知道了. 既

前后端分离与不分离,一点点理解

1>为什么要前后端分离? 现有开发模式的使用场景 前后端职责不清 开发效率的问题 对前端发挥的局限 2>前后端分离会带来什么变化? 1.彻底解放前端 制作页面的时候,不需要后台配置服务器环境,可以自己配置路由,前端代码里面不会掺杂后端的代码以及逻辑 2.提高工作的效率 3.局部性能提升 4.降低了维护成本 3>前后端分离的核心:前端负责调用ajax实现数据显示(view层和controller层),后台提供数据(API)接口(model层). 在前后端没有分离前,后端需要渲染页面或者重定

利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境

前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有2个问题不可避免:第一是前端调用后台接口时的跨域问题(因为前后端分开部署):第二是前端脱离后台服务后无法独立运行.本文总结最近一个项目的工作经验,介绍利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境的实践过程,希望能对你有所帮助. 注:

[转]从MVC到前后端分离

从MVC到前后端分离 来源:csdn 发布时间:2015-10-26 阅读次数:1680 1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的Java Bean,包含一系列的成员变量及其getter/setter方法.对于视图而言,它更加偏重于展现,也就是说,视图决定了界面