521xueweihan / HelloGitHub

:octocat: 分享 GitHub 上有趣、入门级的开源项目。Share interesting, entry-level open source projects on GitHub.
https://hellogithub.com
90.37k stars 9.55k forks source link

支持请求合并的 HTTP 转发工具 #230

Closed viclm closed 6 years ago

viclm commented 6 years ago

项目推荐

推荐理由:

一个客户端的请求可能包含多个上游服务接口调用,响应结果通常是对多个接口的数据加工组合。 如果以一种声明式的定义描述最终响应的数据格式,隐藏数据请求和转换的细节,就能够有效的提高开发效率和程序的健壮性。

Httproxy 就是这样一个黑盒工具,它提供的格式定义语法糖非常简洁,能够满足多种转发场景。 Httproxy 内部是一套高效的接口转发逻辑,它自动处理接口之间的依赖关系,并且尽可能的做到并行请求。当某个接口不可用时,它可以提供降级数据并进行服务隔离,并且能够自动恢复。

示例代码:

文件 hupu.js 定义了一个聚合接口:/api/news/hupu:GET,当访问时会返回类似 { "league": "意甲", "topnews": [...] } 格式的响应。

花括号定义的响应的 JSON 格式,包含 leaguetopnews 两个键值,注意 # 开头代表私有键值,不会包含在最终响应里。

这个接口定义中有3个资源并且存在依赖关系:index => league => topnews,Httproxy 内部会以串行的方式依次处理,context 参数对象用于接口之间的数据调用。

api/news/hupu.js

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)
    }
  }

}
viclm commented 6 years ago

@521xueweihan @JameJJ