一年前,加入了一个创业团队,做电商产品,当时只有一个pc端用java+mysql实现的;以当时的能力游刃有余,随着业务扩展,上了微信商城,内部ERP,Android和iOS。 这些异构的系统还有很多数据需要实时的共享,比如:产品信息,库存信息,订单信息等等。 于是需要一个真正意义上的服务端了。 而且服务端接口的设计需要满足:
- 保证数据安全性?
- 客户端集成足够简单开发效率足够高
- 权限得以保障
- 响应速度得以保障
- …
从单一模块设计,上升到了多系统通讯的系统设计,经过团队的努力,上线了这样一个接口服务端,目前还算稳定。 一年了,该总结总结,经过简单的梳理,这里分享给大伙。
老规矩,奉上源码:https://github.com/yfsoftcom/yf-api-server 欢迎指正~
为了方便大家把玩,自己部署了一个demo 代码在这里 https://github.com/yfsoftcom/yf-demo-api
请笑纳~
这是仿制的postman?
@Andyliwr 不不 postman是我演示一下运行结果的
@Andyliwr 这个框架是个http服务 所以用postman来演示 输入和输出的
反正我喜欢rest
@captainblue2013 哈哈,反正我可以很快的实现业务需求~
发了个demo服务端的代码,欢迎大家来把玩
下午又更新了一下,安装使用更简单了,一些默认的表和数据,系统可以一键安装好~ 再也不同担心安装部署的麻烦了 添加了如下代码:
var Q = require('q');
var async = require('async');
var tableSql = [
"CREATE TABLE IF NOT EXISTS `api_app` (\
`id` int(12) NOT NULL AUTO_INCREMENT,\
`appid` int(12) NOT NULL,\
`appname` varchar(120) NOT NULL,\
`apptype` varchar(120) NOT NULL,\
`appkey` varchar(120) NOT NULL,\
`secretkey` varchar(120) NOT NULL,\
`appenvironment` varchar(120) NOT NULL,\
`approot` varchar(120) NOT NULL,\
`createAt` int(32) NOT NULL,\
`updateAt` int(32) NOT NULL,\
`delflag` int(12) NOT NULL,\
`status` int(12) NOT NULL DEFAULT '1',\
`about` varchar(250) NOT NULL,\
`appurl` varchar(500) DEFAULT NULL,\
PRIMARY KEY (`id`),\
UNIQUE KEY `appid` (`appid`)\
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;"
,
"CREATE TABLE IF NOT EXISTS `api_record` (\
`id` bigint(20) NOT NULL AUTO_INCREMENT,\
`appkey` varchar(100) NOT NULL,\
`createAt` bigint(20) NOT NULL,\
`timestamp` bigint(20) NOT NULL,\
`param` varchar(1000) NOT NULL,\
`sign` varchar(100) NOT NULL,\
`v` varchar(100) NOT NULL,\
`method` varchar(100) NOT NULL,\
`updateAt` bigint(20) NOT NULL,\
`delflag` tinyint(4) NOT NULL DEFAULT '0',\
PRIMARY KEY (`id`)\
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;"
];
var dataSql = [
"INSERT INTO `api_app` (`id`, `appid`, `appname`, `apptype`, `appkey`, `secretkey`, `appenvironment`, `approot`, `createAt`, `updateAt`, `delflag`, `status`, `about`, `appurl`) VALUES\
(1, 10001, 'YFDemoKey', 'PC', 'a81bc1bb1122323b', '3fc4h39d3ed9b33b67fcbc359131e7ee', 'DEV', '*', 1462610156, 1462773916, 0, 1, 'YF所有,抄袭必究', NULL)"
];
module.exports = function(M){
function exec(){
var q = Q.defer();
async.series([
function(callback){
async.eachSeries(tableSql,function(sql,cb){
M.adapter.command(sql,function(err,result){
if(err){
cb(err);
}else{
cb(null,result);
}
});
},function(err,result){
callback(err,result);
});
},
function(callback){
async.eachSeries(dataSql,function(sql,cb){
M.adapter.query(sql,function(err,result){
if(err){
cb(err);
}else{
cb(null,result);
}
});
},function(err,result){
callback(err,result);
});
}
],function(err,result){
if(err){
q.reject(err);
}else{
q.resolve(result);
}
});
return q.promise;
}
return {exec:exec};
};
运行之后,通过 http://yourdomain:8080/init 可以执行这段脚本,创建一些系统依赖的表和数据。 懒人模式~ haha~
既然是电商平台,我对你处理高并发,事务,金额控制等难题是怎么操作的?
这位兄弟 问到重点了 对于高并发 node 可以轻松应对 对于事务和数据一致性等这些敏感操作。我们还是用到了java 通过 node来转发请求到 java 来实现的