• Stars
    star
    123
  • Rank 290,145 (Top 6 %)
  • Language
  • Created over 8 years ago
  • Updated over 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Java项目如何与Node.js共存?

Java项目如何与Node.js共存?

很多人都有Java背景,对于Node.js他们大多是观望,学习,可能还不是特别清楚,如果让Java项目和Node.js结合使用?

本文主要讲解的是这个问题,通过各种比较,最后给出技术栈升级的建议。

Java

看一下Java的前后端定位

Java是传统的老牌后端,虽然它也可以jsp类的写点前端的东西,JavaEE里从model 1到model 2的差别就在于视图和控制器分离,引出jsp,再也不用servlet管全部了。

model 1

1

model 2

2

一般我们把WebRoot目录下面的理解为是前端,非WebRoot理解成后端。

烂大街的三大框架

3

这里又不是十分严格,比如后端给jsp传值,然后渲染,这时候前后端还是耦合在一起的,还不是严格意义上的前后端分离。

所以,我们彻底点,让后端只提供api,把webroot里面的api请求使用ajax替换。

app拆分成了2部分

  • 后端 java api
  • 前端,jsp + ajax

在彻底一点,把它们分别部署服务器上,比如tomcat

  • tomcat 1(端口8080) 部署后端api
  • tomcat 2(端口8081) 部署前端,jsp + ajax

4

这样就分开,但访问的时候可能会有跨域问题,于是我们还得把它们合并到一个域名里面,那就凑合nginx吧

  location / {
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
	    proxy_set_header X-NginX-Proxy true;
	    proxy_pass http://127.0.0.1:8080;
      proxy_redirect off;
  } 
  
  # Load configuration files for the default server block.
  # include /etc/nginx/default.d/*.conf;
  # Load configuration files for the default server block.
  include /etc/nginx/default.d/*.conf;

  location /api {
      proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
	    proxy_set_header X-NginX-Proxy true;
	    proxy_pass http://127.0.0.1:8081;
      proxy_redirect off;
  }

此时访问,所有的都放到http://127.0.0.1:80端口下面,是不是就完美解决了?

5

前端优化

前端,我们还能做什么优化呢?

把那些js和css、图片压缩,丢到cdn上

  • 研究浏览器机制,提高渲染速度
  • 模块化加载
  • profile
  • 各种框架,angularjs,react,具体看我写的前端4阶段吧
  • 各种变态预处理写法

后端优化

默认是使用json api风格

API 标准写法

摘抄:http://www.startupcto.com/backend-tech/building-an-api-best-practices

You'll generally want to wrap all your API responses in an 'envelope' which specifies metadata about the APIcall.

// sample JSON envelope
{
  "status": {
    "code": 10000,
    "message": 'Success'
  },
  "response": {
     ...results...
  }
}

Doing this allows for client handler code to behave the same way for all API calls, since it gets a responses back in a universal format.

语义上再好一点,推荐:

// sample JSON envelope
{
  "status": {
    "code": 10000,
    "message": 'Success'
  },
  "data": {
     ...results...
  }
}

可视化编辑校验: http://jsoneditoronline.org/

当然restful 风格api也是非常好的。

使用rpc拆分服务

比较好的做法是http api调用rpc,提供最终api

  • 单一调用,简单接口
  • 多个调用,可以封装成上层服务,也可以组合用

rpc框架,如dubbo,dubbo-x,motan,grpc等

6

rpc拆分后,拆分db

一般拆分rpc都会按照某些业务主体划分,所以数据库是可以拆分出去

比如

  • 库存
  • 订单
  • 评论
  • 弹幕

其实,只要保证用户一致,其他数据库保存各自的数据就好。在数据分析的时候,汇总到一起即可,无论etl还是stream都可以。

服务和db拆分的好处是便于横向扩展,这样就可以做到动态伸缩,哪里有瓶颈治哪里,在架构调优上是有明显优势的。

服务多,就要服务治理、发现

采用consul作为服务发现软件

7

服务器监控apm

9

这是java写的

https://github.com/naver/pinpoint

api多了,怎么办呢?

都是重复的,如日志、权限等,这时,我们需要api Gateway。

https://getkong.org/

通过nginx + lua实现,提供插件机制,非常好用。

8

容器化,自动化运维

10

  • docker
  • saltstack

总结

架构是相同的,其实语言是无所谓的。所以这套东西也适合Node.js哦。

看一下Node.js

首先,Node.js是运行在v8之上的js 运行环境。语法上和js同出一辙,差别在于,它可以进行更多其他后端语言完成的功能,如io、网络等。

一般,大前端指的是前端 + Node.js这样的组合,这时的Node.js仅作前端工具使用。

F0

也就是说js才是混淆点

  • 前端有js
  • Node也是js语法

F1

那再俗一点

  • 前端有js(Node.js作前端工具)
  • 后端 Node.js (express、koa等类似于javaEE的servlet)

F2

这样是不是就清晰多了?

好了,我们在来对比Java的部分来说

  • 后端,java api
  • 前端,jsp + ajax

那么,结论应该是

  • jsp + ajax = Node.js + ajax
  • java api = Node.js api

java接口和jsp都是跑在tomcat这样的JavaEE服务器上的,而Node.js无论是jade/ejs还是用Node.js写api接口,它们都是Node.js自身的服务器的。

这样对比的目的是为了让大家情况它们的差别。

B0

下面我们就看一下,组合吧

B1

  • Java api 做后端
  • Node.js jade/ejs + ajax 作为前端(moa-frontend就是代表)

这是比较常见,很多叫这种方位proxy,这里面设计的问题就很明显了,ajax能直接调用java api,还有复杂的业务是无法java接口直接搞定的呢?

于是各种hack,比如采用 https://github.com/request/request ,但是这是http请求啊,http协议还是比较重的,每次请求至少50ms,如果多几个请求,就算加上缓存也是非常难受的,那么怎么办呢?

想想我们上面说的rpc吧,在express里不调用request,换成rpc是比较靠谱的,那么问题又来了,既要支持java又要支持node,rpc框架最好是支持多语言的,这时grpc就成了比较好的选择了,不然就一言不合自己写一个?哈哈

下面来个不常见的技术栈

B2

  • jsp + ajax 作为前端
  • Node.js api 做后端

这其实也是可以,只是有点多余而已,对于熟悉jsp的人未尝不是好事呢。

其实Node可以做的更多的

Modern Web Development的四个维度

使用预编译

  • 模板引擎
  • css预处理器: less|stylus|compass|sass
  • js友好语言: coffee、typescript

前端开发4阶段

  • html/css/js(基础)
  • jQuery、jQuery-ui,Extjs(曾经流行)
  • Backbone(mvc),Angularjs(当前流行)
  • React组件化、Vuejs(未来趋势)

Vuejs综合Angular和React的优点,应该是下一个流行趋势

构建工具

  • grunt
  • gulp
  • webpack
  • npm scripts

平台工具

跨平台覆盖,从各种浏览器到移动端、pc客户端

  • 移动端 cordova
  • pc客户端 electron

总结

讲了java和Node的定位,总结了它们的组合可能,以期读者能够明白各位能做什么,合适做什么,同时有一些比较好的实践,最后给出Node.js能做的更好的现代web开发,希望对大家有所帮助。

对于上新的技术栈,我一向是保守的,一次只上一样新的,小步快走。比如java先做前后端分离,然后再考虑把前端用node替换,然后rpc改造,甚至极端点后端也可以使用Node.js做。

作者

桑世龙(网名i5ting),空弦科技 CTO,StuQ 明星讲师,开源项目 Moajs 作者,Node.js 技术布道者。 曾就职在新浪、网秦,曾做过前端、后端、数据分析、移动端负责人、首席架构师、技术总监,全栈技术实践者,目前主要关注技术架构和团队梯队建设方向。

2.Pic

More Repositories

1

How-to-learn-node-correctly

[全文]如何正确的学习Node.js
JavaScript
4,411
star
2

imove

INACTIVE: Move your mouse, generate code from flow chart
TypeScript
3,752
star
3

learn-rust-for-fe

Rust是未来前端基础设施
Rust
1,725
star
4

nodejs-fullstack

高可用架构专用《全栈工程师之路-Node.js》
JavaScript
1,614
star
5

koa-generator

Koa' application generator for 1.x and 2.x( Express-style and support all middlewares include async/await )
JavaScript
970
star
6

i5ting_ztree_toc

[NO MAINTENANCE] a jQuery plugin for preview markdown table of content jQuery.zTree_Toc.js toc ztree and online demo site v0.4.1
JavaScript
734
star
7

vsc

Visual Studio Code Guide[Simple Chinese][简体中文]
JavaScript
567
star
8

node-debug-tutorial

3法3例细说node-debug
HTML
312
star
9

wechat-dev-with-nodejs

StuQ《Node.js微信开发》课程文档
JavaScript
287
star
10

Study-For-StuQ

《通过开源项目去学习》
JavaScript
261
star
11

tocmd.npm

a node npm wrapper of i5ting_ztree_toc
JavaScript
213
star
12

oh-http

精解http
JavaScript
207
star
13

asynchronous-flow-control

StuQ分享专题《深入浅出js(Node.js)异步流程控制》完整版
JavaScript
196
star
14

modern-nodejs

DockOne微信分享专用(2016-07-12)《微服务选型之Modern Node.js》
JavaScript
186
star
15

stuq-koa

和StuQ合作的《下一代Web框架Koajs》在线课程文档
JavaScript
174
star
16

fe-2022-in-china

2022大前端总结和2023就业分析
149
star
17

sketch-practice

自学sketch实践
JavaScript
143
star
18

ionic_ninja

通过一个开源项目,让更多人了解如何学习新技术,以及其中遇到的问题是如何求解的。另外让大家了解更多ionicframework的细节
JavaScript
135
star
19

uploadify

uploadify = express && koa 2 uploadify with jquery fileupload
JavaScript
129
star
20

i5ting-mac-init

自己 Mac + Node.js 电脑初始化开发环境的安装脚本
Shell
111
star
21

how-brower-work-and-perfomace-tunning

浏览器渲染原理
105
star
22

ama

Ask me anything in 《Node全栈》
101
star
23

express-starter

a nodejs express boilerplate project for starter
JavaScript
93
star
24

mvc

自己动手写框架,基于Koa2
JavaScript
74
star
25

i5ting

个人介绍
JavaScript
71
star
26

tocmd.gem

a ruby gem wrapper of i5ting_ztree_toc
CSS
66
star
27

nodejs-newbie

Node.js新手指南
61
star
28

weui-practice

weui-practice
JavaScript
56
star
29

write-scaffold-with-nodejs

零基础十分钟教你用Node.js写生成器:你只需要5步
JavaScript
49
star
30

node-http

node-http doc
JavaScript
45
star
31

learn-ts-with-10-opensource-project

41
star
32

stateview

Stateview is a react render solution for Multi-State View.
TypeScript
41
star
33

stuq-wxapp

狼叔带你一起玩转微信应用号
JavaScript
40
star
34

ts-junit

use JUnit 5 Decorator in TypeScript
TypeScript
40
star
35

nodeparty-beijing-2020-1-11

nodeparty ppt
40
star
36

node-quick-start-course

博文视点《狼叔的Node.js快速入门课》
36
star
37

umi-in-action

📚UmiJS 实战
TypeScript
33
star
38

mobile-design-doc

31
star
39

ava-practice

ava-practice: 面向未来的测试运行器
JavaScript
26
star
40

je

json editor port to npm
JavaScript
24
star
41

vueconf-ppt

22
star
42

githubrank

a simple user crawler for githubrank.com
JavaScript
22
star
43

2021

我的2021年一些想法,记录一下
22
star
44

hade

html to jade
JavaScript
21
star
45

simplereader

从零开始写【爬虫 + Koa】
CSS
21
star
46

stuq-gulp

StuQ-Gulp实战和原理解析大纲
JavaScript
21
star
47

langshu

狼书勘误
20
star
48

markdown_toc

a flexible markdown toc with more custom style && freedom
JavaScript
20
star
49

kp

kp is a tool for kill process by server port. it can be used on mac && linux && window
JavaScript
20
star
50

awesome-mac-practice2

awesome-mac-practice
JavaScript
19
star
51

gitbook-plugin-toc2

在gitbook里,回车,显示或隐藏toc
JavaScript
18
star
52

js-tools-best-practice

此repo已不再维护,请前往https://github.com/streakq/js-tools-best-practice
JavaScript
16
star
53

nodeparty-ppt-20170729

16
star
54

How-to-write-jQuery-plugin

How to write jQuery plugin? 如何编写 jQuery 插件,以及代码重构过程经验总结
JavaScript
16
star
55

reactjs-getting-start

react practice
JavaScript
15
star
56

history-of-node-js

history-of-node-js
JavaScript
15
star
57

mongoose-base-user-plugin

a plugin for mongoose base user model for koa && express
JavaScript
15
star
58

superkoa

koa with supertest for ava or mocha
JavaScript
15
star
59

koa-bigpipe

a simple bigpipe impl with koa 2.x
JavaScript
14
star
60

umi-ssr

JavaScript
13
star
61

git-quick-start

这是一个给小白看的快速入门git的简易教程,使用gif的方式播放命令行的使用记录
13
star
62

upload-anywhere

a node cli tools for uploads ui
JavaScript
12
star
63

glorious-node

《更了不起的Node.js》演讲稿提纲
12
star
64

nodejs-open-source-recommendation

Node.js开源项目推荐
12
star
65

weide

微信应用号官方IDE破解助手,可避免自动升级
JavaScript
12
star
66

tpl_apply

tpl_apply with handlebars
JavaScript
10
star
67

dahu

答乎(个人版) = 分答 + 值乎
10
star
68

Collection.js

Collection.js is mobile collection: a data access object wrapper for all mobile platform
JavaScript
10
star
69

poetry

现代诗歌精选,读到好的就放里面
10
star
70

i5ting.react.tab

i5ting.react.tab
JavaScript
10
star
71

umi-serve-cli

umi-serve is a cli tool for umi mock data
JavaScript
10
star
72

mongo-here

start mongo here
JavaScript
8
star
73

rate2

express/koa 限流器
JavaScript
8
star
74

simditor-qn

simditor upload router with qiniu.com for expressjs
JavaScript
8
star
75

Beeframework_template_installer

Beeframework_template_installer
Shell
8
star
76

subl

alias subl=\''/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl'\'
JavaScript
8
star
77

travis-cli

a cli tool for travis-cli
JavaScript
8
star
78

giac-2022-big-frontend

8
star
79

moag

a scaffold generator for koa && koa 2 && express && mongoose
JavaScript
8
star
80

cnodejs-api

cnode api && 快速发布README.md到cnode
JavaScript
8
star
81

docto

docto is a Doc Tool for Generate README.md with Toc and Push it to Git Pages
JavaScript
8
star
82

clipanion-test

clipanion 是一个极好的模块,必火
JavaScript
8
star
83

koa2-api

JavaScript
7
star
84

fayeserver

fayeserver
JavaScript
7
star
85

nodejs-test

7
star
86

koa-elastic-apm

JavaScript
7
star
87

node-wechat

node-wechat 微信实践
6
star
88

mobile-dev-practice

iOS + Android 双修
Java
6
star
89

hostrc

An alternate host-switch minimal solution of SwitchHosts && multiple-host
JavaScript
6
star
90

bigview-koa-demo

JavaScript
6
star
91

ichat

ichat : it's an im client like webchat
JavaScript
6
star
92

pwa

HTML
6
star
93

coden

coden = vsc(visual studio code) cli for Mac
JavaScript
6
star
94

ktpl

simple template
JavaScript
6
star
95

get-umi-webpack-compiler

JavaScript
6
star
96

icrunch

a wordlist generator where you can specify a standard character set or a character set you specify.
JavaScript
5
star
97

node-deploy-practice

node-deploy-practice
JavaScript
5
star
98

xview

xview = xstate + stateview
5
star
99

2022

5
star
100

blockchain-study

5
star