zoukankan      html  css  js  c++  java
  • Restify Api 开发经验

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

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


    工作期间,一直在用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+款云产品! 

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


    相关文章:
    【推荐】 网易严选的wkwebview测试之路
    【推荐】 基于AOP的优惠券发送异常哨兵监控

  • 相关阅读:
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 802 找到最终的安全状态 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    Java实现 LeetCode 803 打砖块 (DFS)
    Java实现 LeetCode 804 唯一摩尔斯密码词 (暴力)
    英文标点
    post sharp 与log4net 结合使用,含执行源码 转拷
  • 原文地址:https://www.cnblogs.com/163yun/p/9810100.html
Copyright © 2011-2022 走看看