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+款云产品! 

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


    相关文章:
    【推荐】 用scrapy数据抓取实践
    【推荐】 网易云易盾朱浩齐:视听行业步入强监管和智能时代
    【推荐】 在一台服务器上搭建相对高可用HiveServer实践

  • 相关阅读:
    The archive: D:/Program Files (x86)/apache-tomcat-6.0.39/bin/bootstrap.jar w
    DTO
    关于REST的JSON格式
    extjs renderer function参数设置
    转::持久化实体persist()--往数据表中插入数据
    使用Ext.define自定义类
    转::Ext.getCmp()应用
    【转】VO DAO BO
    JPA的查询语言:JPQL的命名查询 @NamedQuery
    11.25 冒泡事件 form表单事件
  • 原文地址:https://www.cnblogs.com/zyfd/p/9810103.html
Copyright © 2011-2022 走看看