`
joecliff
  • 浏览: 19040 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

nodejs+java混合网站开发实践

阅读更多

网站技术选型之痛

对于网站开发的技术选型,我们听到最多的就是: 网站是基于xxx(如java,php,ruby)上的某某框架构建的。
一门主要开发语言、一个独立项目,好处是结构简单,不好的地方也显而易见:

  • 不利于前后端独立开发。前端等后端完成后台业务,后端等前端写完页面模板,时间就是这么等走的。
  • 前后端经常需要介入对方领域,不利于专业分工。后端时不时改个html模板,有时候还要改css,前端需要理解整个网站的原理,甚至后端语言,调试页面需要启动整个网站所有功能,而不能单独运行页面前端代码,费时费力。
  • 如果网站需要个后台,单独开发个会造成业务逻辑重复书写;直接集成进网站项目会造成网站代码更难组织。
  • 如果再需要加上某某移动平台定制app,不用响应式页面,这不又得开发个。。。

团队技术背景

几个月前,在接到进行几个类似小电商网站开发任务之前,我们的团队已经在java平台上开发了好几个网站和企业应用。经过了几次演进(纯jsp到freemarker,struts到spring mvc,管理后台使用extjs+java单独项目),但总体上还是纠结于网站项目前后端过度耦合问题。
对于nodejs,我虽然接触时间不短,但大部分做过的东西还属于玩票性质,还停留在nodejs适合做api输出这个简单层面。

目标及思路

当时面对的是:几个类似的网站结构,都要后台管理功能,可能以后会有定制移动app需求,团队人员有限,时间周期有限。
按照以前那套前后端各搞一个项目的套路继续开发下去,铁定完不成,就算复制项目完成了,后期维护代价也非常大。所以问题的核心是:

  • 如何最大化复用我们的代码(1)
  • 如何尽量提高我们的开发效率(2)

除了核心目标,还有几点我们必须满足:

  • 数据保存操作需要事务支持(3)
  • 网站搜索功能需要尽量强大,比如支持模糊搜索,分组统计(4)
  • 开发语言优先选择我们会的,或者熟悉的,如果其他语言确实有比较大的优势,也可以考虑(5)
  • 我们的服务器资源有限(6)

以上几个约束分别考虑下,其实我们的选择已经不多:

  • 要达到3的要求,spring + hibernate声明式事务我们最熟悉,并且很方便;要解决4的要求,内嵌solr是我们想到的最现实方案。所以基本上我们的业务处理无法离开java。
  • 问题1其实是所有软件开发人员一直在考虑的问题。包含很多,放在当下,可以分成几部分:
    • 前后端能否一起整体复用?
      这种想法优先否定,会回到之前单项目的老路
    • 后端如何复用?
      因为已经订下后端使用java,java的项目的整体复用形式就是jar依赖或者远程service调用
    • 前端如何复用?
      功能/组件级别的复用形式听起来很好,但是开源的方案如(java)wicket使用起来还是相当不便,会加重前端的困扰
      微观的复用形式很多,如requirejs/seajs对js的复用优化,各种html模板复用
  • 对于问题2,以上几个方面的合理选择肯定会大幅度改善开发效率。其他促进项目还有:
    • 采用熟悉的语言
      开发团队最熟悉的语言当然是java和javascript
    • 成熟的依赖管理框架
      如java的maven,前端的bower.js,nodejs的npm
  • 问题6对我们的选择也有很大影响。基于以前的经验,要开发的几个网站(全都带有后台)如果全部采用java,并且做前后端项目分离,由于java是出了名的内存大户,那服务器压力会很大,甚至无法承受。

最终方案

在理性和感性的双重推动下,我们最终使用了以下方案:

  • 网站:nodejs + express + jade + less,采用q.js的promise方案, gruntjs用于开发及打包优化
  • 管理后台:extjs静态网站,gruntjs用于开发及打包优化
  • 统一的service api输出restful json: java + spring mvc + hibernate(没用jersey)

实现效果

  • 前后端分离,开发人员都是用最擅长的语言,没有太多学习负担
  • 后端java api服务是无状态的,便于性能扩展
  • 企业用户需要的事务支持得到了保证
  • jade模板和less简洁易懂的语法保证了html和css的书写效率和质量
  • 网站的总体资源占用不多(nodejs 100M左右,extjs静态托管,忽略),适当优化后整体响应速度还不错
  • 要开发新的网站/app可以最大化复用后端api逻辑,只管书写表现页面
  • 在保证service 程序对应数据库模型一致和api设计合理的前提下,我们只维护一份service代码,但完成了几个同类型网站的开发(使用maven profile配置)

最终网站开发时间节省明显,第二个网站的开发时间是第一个的不到1/3。

 

后话:前阵子偶尔发现sea.js的作者淘宝玉伯分享说他们的团队也是这么做前后端分离的~ 链接

 

此文同时发布于我的个人博客

 

2
0
分享到:
评论
20 楼 joecliff 2014-08-04  
351531104 写道
nodejs怎么调用后台?java发布webserves?不是很清楚。

这里用的json,兼容性考虑,不是速度最优的选择。也可以选择其他方式
19 楼 351531104 2014-08-04  
nodejs怎么调用后台?java发布webserves?不是很清楚。
18 楼 joecliff 2014-07-16  
chenj28 写道
可以给示例源码么?

不好意思,这个公司商业项目。。
这边提到的技术其实都是最常见的技术组合。重点是各个技术的使用场景。
17 楼 chenj28 2014-07-16  
可以给示例源码么?
16 楼 天朗java 2014-07-14  
joecliff 写道
天朗java 写道

如果页面直接用ajax调用java服务是不是就可以省掉nodejs这层?  网站又用nodejs是出于什么样的考虑?SEO?响应速度?还是是...?


做一些app或者不需要seo的站点可以直接ajax调用 api,不需要nodejs输出页面。
这边的网站使用nodejs有几个原因:1,前端人员熟悉,团队乐于接受;2、seo;3、热门语言招人简单,各种方案一大堆,不愁升级和维护。jade、gruntjs这些ndoejs里的新出的东西设计思想确实不错,让习惯了java这种笨重平台开发的我们惊喜不少。
同等资源占用下nodejs得响应速度确实不错,性价比好

谢谢  受教!
15 楼 joecliff 2014-07-14  
天朗java 写道

如果页面直接用ajax调用java服务是不是就可以省掉nodejs这层?  网站又用nodejs是出于什么样的考虑?SEO?响应速度?还是是...?


做一些app或者不需要seo的站点可以直接ajax调用 api,不需要nodejs输出页面。
这边的网站使用nodejs有几个原因:1,前端人员熟悉,团队乐于接受;2、seo;3、热门语言招人简单,各种方案一大堆,不愁升级和维护。jade、gruntjs这些ndoejs里的新出的东西设计思想确实不错,让习惯了java这种笨重平台开发的我们惊喜不少。
同等资源占用下nodejs得响应速度确实不错,性价比好
14 楼 天朗java 2014-07-14  
joecliff 写道
天朗java 写道
我的理解是这样的 用户访问网站---》nodejs接受请求调用--》java提供的服务-->>nodej通过jade模板生成--》html页面--返回用户      能否分享个图?


基本是的。

如果页面直接用ajax调用java服务是不是就可以省掉nodejs这层?  网站又用nodejs是出于什么样的考虑?SEO?响应速度?还是是...?
13 楼 joecliff 2014-07-12  
sp42 写道
我们也用 nodejs + jee,但也用了 java 自带 rhino,java 8 的 js engine 则更快!

我们现在的原则是尽量让java做它最核心的事情,其他地方如果有更好的替代方案就不用java了。
12 楼 joecliff 2014-07-12  
fengyuan1314 写道
应用内调用采用类似shrift、finagle的RPC调用比http调用要快吧?

那肯定的。但是http输出json api的兼容性绝对第一位。。比如我们后台管理系统用extjs做,nginx静态托管下就行,但是就不能简单的通过rpc调用后台api了,restful json api是最合适的选择。
这种情况下,我们牺牲了点api的响应速度,但是api服务的格式能更好的适配各种语言平台。
11 楼 fengyuan1314 2014-07-12  
应用内调用采用类似shrift、finagle的RPC调用比http调用要快吧?
10 楼 sp42 2014-07-12  
我们也用 nodejs + jee,但也用了 java 自带 rhino,java 8 的 js engine 则更快!
9 楼 joecliff 2014-07-12  
天朗java 写道
我的理解是这样的 用户访问网站---》nodejs接受请求调用--》java提供的服务-->>nodej通过jade模板生成--》html页面--返回用户      能否分享个图?


基本是的。
8 楼 天朗java 2014-07-12  
我的理解是这样的 用户访问网站---》nodejs接受请求调用--》java提供的服务-->>nodej通过jade模板生成--》html页面--返回用户      能否分享个图?
7 楼 joecliff 2014-07-11  
aixinnature 写道
我也没看出nodejs在哪里替换java,替换后的优势在哪?

nodejs没有替换java,只是在页面表现部分让前端开发更自然的用熟悉的语言处理,尽量可以和后端api开发并行独立。
我们这说的前后端分离,替代性来说,在不同的团队,后端的逻辑可能不一定是java,但前端使用js/nodejs可替代性确比较低
6 楼 joecliff 2014-07-11  
fisher123 写道
卤煮说的 前后台分离 具体指的是何种分离, 基于rest风格的 JSON 交互 前台 不一定用nodejs 或者说 nodejs 在卤煮的文章中 充当什么角色

前端人员最熟悉的什么语言?不是js难道还是python,php,java,ruby?
你当然可以让继续让后端去做前端的事情,或者让前端继续用以上几种语言开发页面模板。但是最自然的肯定是js。nodejs这么热,很明显广泛的语言基础是关键。我们选nodejs也是这个考虑。
5 楼 aunox 2014-07-11  
没看懂怎么体现好处。
4 楼 aixinnature 2014-07-11  
我也没看出nodejs在哪里替换java,替换后的优势在哪?
3 楼 fisher123 2014-07-11  
卤煮说的 前后台分离 具体指的是何种分离, 基于rest风格的 JSON 交互 前台 不一定用nodejs 或者说 nodejs 在卤煮的文章中 充当什么角色
2 楼 joecliff 2014-07-11  
fnet 写道
卤煮的平台比较之复杂

肯定比单项目结构复杂,但是相对的带来了前后端分离和可扩展性的提升。
1 楼 fnet 2014-07-11  
卤煮的平台比较之复杂

相关推荐

Global site tag (gtag.js) - Google Analytics