摘要简介:在一家新公司做电子商务,他们喜欢用java做API服务,前端则是用PHP进行展示,而我本人不是太喜欢Java这种强类型的语言(当然除了做Native APP之外),写个功能略显啰嗦,后面推荐他们用Nodejs实现一些服务,但是他们给我的答案却是No,当我问及其原因时,他们只给我回答:Java是安全可靠的,稳定且跨平台,这句话让我彻底无语,也许一些对nodejs的热爱者也会遇到类似情况…看了@sumory 的文章后,我决定用thrift对Java和Nodejs做通信,废话也讲完了,现在来介绍下怎么使用吧. nodejs thrift地址:https://github.com/apache/thrift/tree/trunk/lib/nodejs
- 首先需要安装一个nodejs thrift包 npm install thrift --save(ps:我安装的版本是:thrift@0.7.0)
- 需要安装mocha作为thrif文件测试 npm install mocha --save
- 需要在Java端编译API为Nodejs,命令 thrift --gen js:node thrift_file (ps: java端使用thrift0.6)
实现node.js编写的server API 比如大家通过thrift已经生成gen-nodejs目录,里面包含AccountService和AccountCenter_types文件 建立thrift连接文件:
connection.coffee
thrift = require 'thrift'
module.exports = (settings) ->
connection = thrift.createConnection settings.host, settings.port
connection.on "connect", (err) ->
console.log 'thrift server no start:' + err if err
thrift.coffee
config = require __basename + '/config/config'
connection = require './connection'
module.exports = connection config.thrift
建立nodejs thrift api lib 文件 users.coffee
thrift = require 'thrift'
user = require __basename + '/helpers/gen-nodejs/AccountService'
usertypes = require __basename + '/helpers/gen-nodejs/AccountCenter_types'
server = require __basename + '/connect/thrift/thrift'
client = thrift.createClient user, server
module.exports =
registerUser : (data, fn) ->
data.sex = new usertypes.SexVO(data.sex) if data.sex
client.registerUser new usertypes.UserVO(data), (err, results) ->
fn err, results
changePassword : (data..., fn) ->
client.changePassword data[0], data[1], data[2], (err, results) ->
fn err, results
getUserByEmail : (email, fn) ->
client.getUserByEmail email, (err, results) ->
fn err, results
getUserById : (userId, fn) ->
client.getUserById userId, (err, results) ->
fn err, results
getUserByNickname : (nickname, fn) ->
client.getUserByNickname nickname, (err, results) ->
fn err, results
建立好thrift的users.coffee,我们可以建立user API外部接口,以下是routers.coffee文件
app = require './app'
# OAuth
app.use '/oauth', require './routes/oauth'
# app.use '/baby', require './routes/baby'
app.use '/baby_api', require './routes/baby_api'
建立routers文件夹,在routers文件夹下建立baby_api文件夹,然后这里分别建立index.coffee和users.coffee文件 index.coffee (router 列表文件)
express = require 'express'
module.exports = app = express()
# User Accounts API
users = require './users'
app.post '/users/register', users.registerUser
app.post '/users/changepassword', users.changePassword
在mocha中建立测试文件:
users = require __basename + '/lib/thrift/users'
test =
id : 17689
email : 'fioman[@qq](/user/qq).com'
describe 'getUserByEmail[@account](/user/account)', ->
it 'should get many acounts info', (done) ->
users.getUserByEmail test.email, (err, results) ->
throw err if err
results.should.have.property('email')
results.should.be.json
results.id.should.be.a 'number'
results.email.should.be.a 'string'
results.email.should.be.equal test.email
done()
describe 'getUserById[@account](/user/account)', ->
it 'should get many acounts info', (done) ->
users.getUserById test.id, (err, results) ->
throw err if err
results.should.have.property('id')
results.should.be.json
results.id.should.be.a 'number'
results.email.should.be.a 'string'
results.id.should.be.equal test.id
done()
describe 'getUserByNickname[@account](/user/account)', ->
it 'should get many acounts info', (done) ->
users.getUserByNickname 'fioman', (err, results) ->
throw err if err
results.should.have.property('nickname')
results.should.be.json
results.id.should.be.a 'number'
results.email.should.be.a 'string'
results.nickname.should.be.equal 'fioman'
done()
成功后先npm test一遍 目前项目托管在oschina git中 http://git.oschina.net/ym/baby_mobile_api
哈,我们线上用的模块涵盖了java/php/python/node.js,中间通信都是使用thrift的
呵呵,,挺多的,我们这边也都是以java/C++/golang为主,php/python 作为前端显示,nodejs他们好像都并不感兴趣,感觉有些公司员工思想还是有些陈旧,另外装了个git和gitlab直接无视,后面还在默默用svn up…
@ym1623 可能是历史包袱和‘遗留问题’吧,系统成熟了再转型是很难的
@sumory 不是,新项目他们也不愿意,只是说了一句,他们已经用习惯了… 他们工作七八年了,貌似对新技术已经不大感兴趣了.呵呵…
@ym1623 嘿嘿,年纪大了不想折腾啦
年纪大了没热情没兴趣了
markdown 这东西貌似正好现在就有用,谢谢分享
不错,基本在公司内部,跨团队的调用,都会有一套统一的rpc实现。nodejs作为后来者,必须实现现有的协议。thrift是不错的选择。
内容不错,楼主编辑下内容吧。
顶!thrift对nodejs的支持已经很成熟了,我们目前的产品以后或许也要用到thrift和后端的java进行通信……
需要在Java端编译API为Nodejs,命令 thrift --gen js:node thrift_file 这句怎么实现呢?
俺也正有此意
为何让我想起swift…
brew install thrift
boost 包 400MB+ 小心…
我测了下 grpc / thrift
1w次简单调用, grpc消耗时间 会是 thrift 的两倍