Closed viclm closed 6 years ago
一个客户端的请求可能包含多个上游服务接口调用,响应结果通常是对多个接口的数据加工组合。 如果以一种声明式的定义描述最终响应的数据格式,隐藏数据请求和转换的细节,就能够有效的提高开发效率和程序的健壮性。
Httproxy 就是这样一个黑盒工具,它提供的格式定义语法糖非常简洁,能够满足多种转发场景。 Httproxy 内部是一套高效的接口转发逻辑,它自动处理接口之间的依赖关系,并且尽可能的做到并行请求。当某个接口不可用时,它可以提供降级数据并进行服务隔离,并且能够自动恢复。
文件 hupu.js 定义了一个聚合接口:/api/news/hupu:GET,当访问时会返回类似 { "league": "意甲", "topnews": [...] } 格式的响应。
hupu.js
/api/news/hupu
GET
{ "league": "意甲", "topnews": [...] }
花括号定义的响应的 JSON 格式,包含 league 和 topnews 两个键值,注意 # 开头代表私有键值,不会包含在最终响应里。
league
topnews
#
这个接口定义中有3个资源并且存在依赖关系:index => league => topnews,Httproxy 内部会以串行的方式依次处理,context 参数对象用于接口之间的数据调用。
index
context
exports.get = { // # 开头为私有属性,不包含在响应里 '#index': { fake() { return Math.round(Math.random() * 4) } }, league: { fake(context) { return new Promise((resolve, reject) => { setTimeout(() => { resolve([ '意甲', '英超', '西甲', '德甲', '中超', ][context.index]) }, 200) }) } }, topnews: { url: 'https://soccer.hupu.com/home/latest-news', before(context) { return { data: { league: context.league, page: 1 } } }, after(context, defaults) { return defaults.result .map(article => article.title) } } }
@521xueweihan @JameJJ
项目推荐
推荐理由:
一个客户端的请求可能包含多个上游服务接口调用,响应结果通常是对多个接口的数据加工组合。 如果以一种声明式的定义描述最终响应的数据格式,隐藏数据请求和转换的细节,就能够有效的提高开发效率和程序的健壮性。
Httproxy 就是这样一个黑盒工具,它提供的格式定义语法糖非常简洁,能够满足多种转发场景。 Httproxy 内部是一套高效的接口转发逻辑,它自动处理接口之间的依赖关系,并且尽可能的做到并行请求。当某个接口不可用时,它可以提供降级数据并进行服务隔离,并且能够自动恢复。
示例代码:
文件
hupu.js
定义了一个聚合接口:/api/news/hupu
:GET
,当访问时会返回类似{ "league": "意甲", "topnews": [...] }
格式的响应。花括号定义的响应的 JSON 格式,包含
league
和topnews
两个键值,注意#
开头代表私有键值,不会包含在最终响应里。这个接口定义中有3个资源并且存在依赖关系:
index
=>league
=>topnews
,Httproxy 内部会以串行的方式依次处理,context
参数对象用于接口之间的数据调用。api/news/hupu.js