专栏首页玩转JavaEE前后端分离开发思路探讨

前后端分离开发思路探讨

本文作者:忧郁的马赛克

也做过几个开源的 Spring Boot + Vue 前后端分离的项目:

  1. 微人事
  2. V部落

但是毕竟要从前后端不分变为前后端分离,思维的变化还是比较大的,因此,今天我们就再来说说一说这个话题。

为什么要分离

如果只问“前后端分离的意义大么?”这是废话,因为从软件架构的角度 Web 的前后端从一开始不就一直是分离的么,而且 browser、server 可能将永远分离下去。

为了了解这个问题,我们有必要先了解一下 Web 的研发模式演变,关于这个题材,下面这篇博文说得不错,这边就不做搬运工了。

  1. https://github.com/lifesinger/blog/issues/184

我们不能“为了分离而分离”,而应该“为了真正理解 web 开发、为了更好完成需求而分离”。

前后端分离实践

  • 前端人员配备是否充足?

由于所在公司以往项目采用传统开发风格,即以后端 MVC 为主的开发模式,前端人员仅仅提供静态 html 页面,其余工作皆由后端开发人员完成。采用前后端分离模式可以减后台负担,加快研发效率,当然,前提是前端能做好的话。

以往只需要提供静态页面的前端人员,在前后端分离模式中要负责项目的 view+controller 部分,即除了静态页面,还需要负责页面的所有交互代码、以及 nodejs 与视图层以及后端 API 的交互工作,无疑增加了前端人员的学习成本,在没有足够知识和人才储备的情况下,只能让前端人员加班加点。

  • 前后端职责分配

很多公司认为采用前后端分离之后,前后端只需要通过指定 API 进行交互即可,前端负责页面渲染, Nodejs 负责路由分配,后端提供 API 。忽视了大量关键工作,职责分配和细节处理没有相应文档规定,缓存机制、图片上传下载、数据校验、语言国际化等等并没有出具相应信息。另外,大量忽视了 nodejs 层的作用,仅仅把 nodejs 当成一个路由中转,这一方面也是对 nodejs 技术的不熟悉导致的,其实 nodejs 能负责很多事,除了复杂业务逻辑处理和数据操作由 Java 负责,大量工作完全可以在 nodejs 层处理。

  • 后端 API 是否 RESTFul 风格?

很多公司采用了前后端分离模式后,后端 API 仍然采用以往的传统风格,这是不合理的。

RESTFul 风格的 API 应该是前后端分离的最佳实践。RESTFul 推荐每个 URL 能操作具体的资源,而且能准确描述服务器对资源的处理动作,通常服务器对资源支持 get/post/put/delete/ 等,用来实现资源的增删改查。

前后端分离的话,这些 api-url 是对接的桥梁,采用 RESTFul 接口地址含义才更清晰、见名知意。

  • 前后端协作模式

前后端分离后,无论是 API 接口的对接还是测试工作,都涉及到前后端人员的沟通,很多公司采用前后端分离后,前后端协作模式配合力度低,互相等待,开发效率低下,反而不如传统的开发模式。例如:当后端 API 没有编写完成时,前端无法进行调试,这就导致了前端会被后端阻塞的情况。其实像这种互相等待的模式需要改进, Mock Server 可能可以解决一些问题。

  • 如何前后端分离?

怎么做前后端分离?大方向就是

  1. 后端专注于:后端控制层( RESTFul API) & 服务层 & 数据访问层。
  2. 前端专注于:前端控制层(Nodejs) & 视图层

本人认为的前后端分离模式应该是这样:

  1. 项目设计阶段,前后端架构负责人将项目整体进行分析,讨论并确定 API 风格、职责分配、开发协助模式,确定人员配备;设计确定后,前后端人员共同制定开发接口。
  2. 项目开发阶段,前后端分离是各自分工,协同敏捷开发,后端提供 RESTFul API,并给出详细文档说明,前端人员进行页面渲染。前端的任务是发送API请(GET,PUT,POST,DELETE 等)获取数据(json,xml)后渲染页面。
  3. 项目测试阶段, API 完成之前,前端人员会使用 mock server 进行模拟测试,后端人员采用 junit 进行 API 单元测试,不用互相等待;API 完成之后,前后端再对接测试一下就可以了,当然并不是所有的接口都可以提前定义,有一些是在开发过程中进行调整的。
  4. 项目部署阶段,利用 nginx 做反向代理,即 Java + nodejs + nginx 方式进行。

结语

从经典的 JSP+Servlet+JavaBean 的 MVC 时代,到 SSM(Spring + SpringMVC + Mybatis)和 SSH(Spring + Struts + Hibernate)的 Java 框架时代,再到前端框架(KnockoutJS、AngularJS、vueJS、ReactJS)为主的 MV* 时代,然后是 Nodejs 引领的全栈时代,技术和架构一直都在进步。虽然“基于 NodeJS 的全栈式开发”模式很让人兴奋,但是把基于 Node 的全栈开发变成一个稳定的、让大家都能接受的东西还有很多路要走。创新之路不会止步,无论是前后端分离模式还是其他模式,都是为了更方便的解决需求,但它们都只是一个“中转站”。

走过的“中转站”可能越来越多,但是不要渐行渐远才是。

本文分享自微信公众号 - 牧码小子(a_javaboy)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WebSocket协议入门介绍

    WebSocket是基于TCP的应用层协议,用于在C/S架构的应用中实现双向通信,关于WebSocket协议的详细规范和定义参见rfc6455。 需要特别注意...

    2Simple
  • 怎么才能学好Java编程写好Java代码?

    动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦!

    动力节点Java学院
  • [Keras填坑之旅]·图片分类中是否使用img_to_array的影响

    在使用keras进行图片分类的任务,笔者最开始的方法是使用opencv库cv2.imread读取照片,再使用cv2.resize重设尺寸。在和别人的代码进行训练...

    小宋是呢
  • LeetCode-15 三数之和

    今天我们学习第15题三数之和,这是一道中等题。像这样字符串的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看看这道题...

    用户3470542
  • 突破Java面试(15)-分布式搜索引擎Elastic Search的工作流程

    ES无非就是写/查数据,你如果不明白你发起写入/搜索请求后,ES做了什么,那你该劝退了.

    JavaEdge
  • Spring生态简介

    做Java开发的人一提起Spring,首先在脑海中浮现出的就是“IoC”,“AOP”,“Spring MVC”,“Spring Security”等等这些名词,...

    2Simple
  • 如何遍历pandas当中dataframe的行

    现在需要遍历上面DataFrame的行。对于每一行,都希望能够通过列名访问对应的元素(单元格中的值)。也就是说,需要类似如下的功能:

    马哥Python
  • 在日志中记录Java异常信息的正确姿势

    今天遇到一个线上的BUG,在执行表单提交时失败,但是从程序日志中看不到任何异常信息。 在Review源代码时发现,当catch到异常时只是输出了e.getMe...

    2Simple
  • 如何优雅地停止Java进程

    我们知道,Java程序的运行需要一个运行时环境,即:JVM,启动Java进程即启动了一个JVM。 因此,所谓停止Java进程,本质上就是关闭JVM。 那么,...

    2Simple
  • 深入挖崛:mysql主从复制原理

    实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在 Master(IO进程)上。

    李红

扫码关注云+社区

领取腾讯云代金券