abbshr / Nero

Nero: Yet Another Efficient API Gateway Core

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Nero

实现Archangel核心功能的系统, 即API Gateway.

在Node层面压榨性能使并发量/系统负载率比值尽量提高, 尽量保持原生Node.js网络I/O的高效特性. Nero本身(部分插件可能会产生额外的网络I/O)工作时并不会做除网络请求外的其他I/O操作, 所有的配置数据由代理进程计算更新子集, 并通过IPC PIPE周期性推送给工作进程(临时做法, hive-fs完善后可能换共享内存). 基于插件的请求/响应流程极大扩展丰富了Nero作为API Gateway的灵活性, 可以在req/res两个阶段配置不同的插件. 当内置插件(编写中)无法满足业务需求时, Nero允许开发者订制自己的第三方插件. 插件系统支持动态配置, 允许Nero插件热更新, 即在不重启的情况下增删或修改插件.

bin/nero

Writting plugins

插件目录位于./plugins, 使用自定义扩展前需要在./etc/plugins.yaml中注册新的名字和查找路径.

./etc/plugins.yaml中的插件路径相对于./plugins.

./etc/Nero.yaml配置文件的request_phaseresponse_phase字段里可以选择性启用/禁用./etc/plugins.yaml中的插件.

例如:

# 编写一个返回调用时间戳的插件
# 文件: ./plugins/ts/index.coffee

class ResTimestamp
  pluginName: 'res-timestamp'
  handle: (req, res, next) ->
    # handle中可以使用Nero的全局配置对象@settings, 
    # 包含当前调用的服务名字, 请求参数, 上游应用服务器地址, 该插件的配置
    
    # 当前插件的配置:
    # cfg = req.cfg[@pluginName]
    
    # 不需要在handle里检查该插件是否被启用以及对应服务是否配置了该插件
    # 空配置和禁用状态会被直接pass
    
    res.end JSON.stringify msg: timestamp: Date.now()

module.exports = -> new ResTimestamp()

Subscribe the FeedStream

Nero中的数据需要通过Leviathan取得, 目前做法是Nero agent订阅Leviathan的feed stream服务实时差异集合, 周期性推送更新本地数据.

About

Nero: Yet Another Efficient API Gateway Core


Languages

Language:CoffeeScript 98.8%Language:Shell 1.2%