Restify Api 开发经验

作者: 网易数帆 | 来源:发表于2018-10-18 14:01 被阅读2次

    此文已由作者王振华授权网易云社区发布。

    欢迎访问网易云社区,了解更多网易技术产品运营经验。

    工作期间,一直在用Restify开发或维护大大小小的API系统,现在分享一下一些个人觉得不错的Tips。

    充分利用middleware机制

    这里的middleware指的就是处理请求过程中一个独立的小函数,众多Node社区的Web框架都采用类似这样的形式 function (req, res, next) {},然后把这些handler函数叠起来组成一个线性模型来完成一次请求的生命周期。

    images

    首先,看一下一个Resitfy Api应用的最核心的骨架

    let restify = require('restify')let app = restify.createServer()
    app.use(restify.plugins.queryParser())
    app.use(restify.plugins.bodyParser())
    app.get('/api/users/list', listUsers)

    这里使用middleware机制加载了两个插件,然后在自己定义的路由上使用自己的listUsers函数来处理,非常简单清晰。

    ziwei_wait

    等一下,listUser不一定必须是一个handler函数,事实上可以是一个handler chain(函数的数组)。 基于这个简单的思路,我们能更加优雅的处理一些Web开发中常见的任务。

    参数验证

    编写API接口时,参数校验是实现API必不可少的一步。通常来说会使用一个validation库来提高日常的体验,  举个例子:

      let saveGiftRecord = [
        paramsValidator({
          roleid: Joi.number().integer().required(),
          friend_id: Joi.number().integer().required(),
          gift_type: Joi.number().integer().only(giftTypes).required()
        }),    function saveGiftRecord (req, res, next) {      //DO SOMETHING
        }
      ]

    这里使用Joi来作为validation库,然后使用paramsValidator作为helper函数来生成一个handler函数来提高日常参数校验的体验。另外,由于参数验证作为一个独立函数存在,又获得了额外的增益,方便在不同api的endpoint之间共享。

    耗时追踪

    Restify对handler函数提供了一组耗时统计的api供开发使用startHandlerTimerendHandlerTimer, 在使用handlers chain数组的形式传递给路由时,会对所有handler进行耗时记录,在api性能不佳时,有助于分析性能瓶颈

    使用自带的插件auditLogger打开

    [2017-12-25T22:15:09.488+08:00]  INFO: push-api/61713 on zhenhua.local:  (req_id=a29ad32e-7bf6-4131-8fbf-d630b4af5f34, latency=88)
        GET /users/followed/list?roleid=101150001 HTTP/1.1 
    
    req.timers: {
          "parseCookies": 226,
          "parseQueryString": 1792,
          "readBody": 395,
          "parseBody": 130,
          "getAuthByType": 129,
          "authMiddleware": 4506,
          "validateParams": 381,
          "getFollowList": 62657,
          "getFanCountBatch": 3140,
          "filterSelfFollowIds": 2182,
          "filterSelfFanIds": 107,
          "getRoleInfos": 1736,
          "formatResult": 640,
          "sendResponse": 4718
      }

    如图所示,在auditLogger中能看到经过各个handler的耗时,方便定位瓶颈。

    这两个API使用了process.hrtime(), 时间精度较高

    另外,restify仓库下一个方便组合handler的库conductor也值得关注

    网易云免费体验馆,0成本体验20+款云产品! 

    更多网易技术、产品、运营经验分享请点击


    相关文章:
    【推荐】 数据挖掘与数据分析的主要区别

    相关文章

      网友评论

        本文标题:Restify Api 开发经验

        本文链接:https://www.haomeiwen.com/subject/svojzftx.html