【翻译】使用 Node.js 构建 API 网关

在微服务架构中,很多服务自身也都要向外提供提供一些功能接口,而其他服务在使用这些接口时也都无一例外的要实现鉴权、监控、缓存、请求分发与合并等需求,所以此时更优的方式就是构建 API 网关以实现一个共享层来统一处理这些共同的需求以及包括不同协议之间的通信、来自不同设备的特殊请求等繁琐的事务。

微服务与消费者

微服务是一种面向服务的架构,不同的团队可以自行设计、开发以及扩展他们的应用。它支持在系统的不同层面使用不同的技术,针对特定的技术问题开发团队可以选择最好的语言、数据、协议以及传输层。比如,一个团队可以通过 HTTP REST使用 JSON ,其他团队也可以通过 HTTP/2使用 gRPC或者如 RabbitMQ的消息队列。

在某些场景下使用不同的数据序列及协议可能是不错的,但那些想要消费我们产品的客户可能有着不同的需求。这个问题也会出现在具有同质技术栈的系统中,系统的消费者是多种多样的,可能从桌面浏览器或手持设备,也可能是游戏控制台或者某些溪流系统。某个客户可能想要 XML 格式,而另一个则可能想要 JSON 格式的数据。在很多情况下,我们都需要满足这些需求。

这些需求略有复杂,但是逻辑共通,所以在微服务中将其抽象独立成一个可共享的服务来满足不同的协议与客户需求是再合适不过了的。

API 网关是什么?

API 网关也是微服务架构中的一种服务,它为用户提供了一个 可以和每个微服务进行通信的入口。API网关可以请求路由、转换协议、聚集数据以及执行共同的逻辑如鉴权、监控、缓存等。一个系统也可以有多个 API 网关,这主要取决于客户的需求是否容易在同一个网关中处理。比如,我们也可以针对桌面浏览器、手持设备以及公共的 API 分别提供一套单独的网关。

API 网关是所有微服务的入口

API 网关的功能设计

本节来专门介绍API 网关中最通用的功能。

路由与版本控制

我们定义 API 网关为所有微服务的入口。API 网关服务可以将客户端的请求路由到指定的服务,也可以在暴露给客户端的接口保持不变的情况下,控制或者改变指向的后端接口地址。

API 网关作为微服务入口
渐进设计

API 网关可以帮助我们分解巨大的单体应用。但是在大多数情况下从头重写整个系统并不是一个很好的主意,此时我们可以加一个代理或者API 网关放到单体应用之前,来为作为微服务的新功能路由。这样可以保证原有的单体式应用与新的微服务共存,并且可以慢慢迁移原有的服务。

API 网关渐进式设计
鉴权

将鉴权等共享逻辑放到 API 网关中使得服务集中、便于控制,同时可以将自己的所有微服务都置于受保护的控制区内:我们只需要在 API 网关中暴露出一些公开的接口而无需将每个微服务直接暴露出去。在 API 网关中使用鉴权,还可以支持包括 cookie 或 token 等多种鉴权方式。

API 网关与鉴权
数据聚合

其实也就是请求的分发与合并。比如在电商的一个页面中,可能需要购物车、历史订单、推荐商品、商品详情、库存等信息,而这些数据可能都是要从不同的微服务中来获取,如果客户端来发送这些请求,不仅仅会浪费公网带宽而且可能还要处理不同的通信方式,此时就可以在 API 网关中处理这些数据的聚合操作。

API 网关与数据聚合
序列化格式转换

主要是为了满足客户所需数据格式。

序列化格式转换
协议转换

微服务一个很大的优点就是在每个微服务内部可以自行选择使用的语言、技术、协议以达到最优的效果,但是大多数的客户只支持一种协议。在这种情况下我们就需要为客户进行服务协议的转换。

比如客户想要通过 HTTP REST方式进行所有的通信,而我们的微服务内部却使用了 gRPC和 GraphQL。

API 网关与协议转换
限速与缓存

前面提到我们在 API网关中加入了鉴权服务,除此之外,我们还可以应用限速、缓存以及多种可靠的服务。

雄心勃勃的 API 网关

在实现API网关时,应该避免将非共通的逻辑——比如领域特定的数据转换——放到网关中。微服务应该始终拥有对其数据域的完全所有权,构建一个功能过于庞大的 API 网关并不符合微服务的创作理念。

这就是为什么要在 API 网关中要小心数据聚合的原因——它可能是强大的,但也可能导致我们原本需要避免的特定领域的数据转换或规则处理逻辑。

始终为您的API网关定义明确的职责,并且只包含其中的通用共享逻辑。

使用Node.js 搭建 API 网关(To do)

因原文中对此部分代码介绍过少,因此列出以下计划,借此一窥微服务整体流程。

  • 实现基本功能(登录/注册、鉴权、缓存等)
  • 如何做成微服务?
  • 如何监控该微服务的健康状态?
  • 如何管理服务生存状态(失败自启动)?
  • 如何调用该服务?
  • 如何 debug?

推荐阅读

API网关的开源解决方案那么多,为什么我们却还要选择自研?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容