此文已由作者王振华授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
工作期间,一直在用Restify开发或维护大大小小的API系统,现在分享一下一些个人觉得不错的Tips。
充分利用middleware机制
这里的middleware指的就是处理请求过程中一个独立的小函数,众多Node社区的Web框架都采用类似这样的形式 function (req, res, next) {},然后把这些handler函数叠起来组成一个线性模型来完成一次请求的生命周期。
首先,看一下一个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函数来处理,非常简单清晰。
等一下,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供开发使用startHandlerTimer,endHandlerTimer, 在使用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实践