用了它一年,再也不用为接口开发发愁了
发布于 4 个月前 作者 yfsoftcom 859 次浏览 来自 分享

一年前,加入了一个创业团队,做电商产品,当时只有一个pc端用java+mysql实现的;以当时的能力游刃有余,随着业务扩展,上了微信商城,内部ERP,Android和iOS。 这些异构的系统还有很多数据需要实时的共享,比如:产品信息,库存信息,订单信息等等。 于是需要一个真正意义上的服务端了。 而且服务端接口的设计需要满足:

  • 保证数据安全性?
  • 客户端集成足够简单开发效率足够高
  • 权限得以保障
  • 响应速度得以保障

从单一模块设计,上升到了多系统通讯的系统设计,经过团队的努力,上线了这样一个接口服务端,目前还算稳定。 一年了,该总结总结,经过简单的梳理,这里分享给大伙。

老规矩,奉上源码:https://github.com/yfsoftcom/yf-api-server 欢迎指正~

为了方便大家把玩,自己部署了一个demo 代码在这里 https://github.com/yfsoftcom/yf-demo-api

请笑纳~ untitled1.png

9 回复

这是仿制的postman?

@Andyliwr 不不 postman是我演示一下运行结果的

@Andyliwr 这个框架是个http服务 所以用postman来演示 输入和输出的

@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 来实现的

回到顶部