模式: API网关

上下文

让我们假设您正在构建一个使用Microservice体系结构模式的在线商店,并且您正在实现产品详细信息页面。您需要开发产品详细信息用户界面的多个版本:

  • 用于桌面和移动浏览器的基于HTML5 / JavaScript的UI  -  HTML由服务器端Web应用程序生成
  • 原生Android和iPhone客户端 - 这些客户端通过REST API与服务器交互

此外,在线商店必须通过REST API公开产品详细信息,以供第三方应用程序使用。
产品详细信息UI可以显示有关产品的大量信息。例如,POJO in Action的Amazon.com详细信息页面显示:

  • 有关该书的基本信息,如标题,作者,价格等。
  • 本店的购买历史
  • 可用性
  • 购买选项此书经常购买的其他商品
  • 购买此书的顾客
  • 购买的其他商品
  • 顾客评论
  • 卖家排名
  • ...

由于在线商店使用微服务架构模式,因此产品详细信息数据分布在多个服务上。例如,

  • 产品信息服务 - 产品的基本信息,如标题,作者定价服务
  • 产品价格订购服务
  • 产品购买历史库存服务
  • 产品可用性评估服务
  • 客户评论...

因此,显示产品详细信息的代码需要从所有这些服务中获取信息。

问题

基于微服务的应用程序的客户端如何访问各个服务?

关注点

  • 微服务提供的API的粒度通常与客户端所需的不同。微服务通常提供细粒度的API,这意味着客户端需要与多个服务进行交互。例如,如上所述,需要产品细节的客户端需要从众多服务中获取数据。

  • 不同客户需要不同的数据。例如,产品详细信息页面桌面的桌面浏览器版本通常比移动版本更精细。

  • 不同类型的客户端的网络性能不同。例如,移动网络通常比非移动网络慢得多且具有更高的延迟。当然,任何WAN都比LAN快得多。这意味着本机移动客户端使用的网络与服务器端Web应用程序使用的LAN具有非常不同的性能特征。服务器端Web应用程序可以对后端服务发出多个请求,而不会影响用户体验,因为移动客户端只能做一些。

  • 服务实例的数量及其位置(主机+端口)动态变化

  • 对服务的分区可能会随着时间的推移而发生变化,应该从客户端隐藏

  • 服务可能使用各种协议,其中一些协议可能不适合Web

解决方案

实现API网关,它是所有客户端的单一入口点。API网关以两种方式之一处理请求。有些请求只是代理/路由到适当的服务。它通过扇出多个服务来处理其他请求。

API网关可以为每个客户端公开不同的API,而不是提供一个通用的样式API。例如,Netflix API网关运行特定于客户端的适配器代码,该代码为每个客户端提供最适合其要求的API。

API网关也可以实现安全性,例如验证客户端是否有权执行请求

变种

此模式的变体是前端模式的后端。它为每种客户端定义了一个单独的API网关。

在此示例中,有三种客户端:Web应用程序,移动应用程序和外部第三方应用程序。有三种不同的API网关。每个都为其客户提供API。

例子

结果

使用API​​网关具有以下好处:

  • 将客户端与应用程序分区为微服务的方式隔离,使客户端免于确定服务实例位置的问题为每个客户端提供最佳API减少请求/往返次数。例如,API网关使客户端能够通过单次往返从多个服务中检索数据。
  • 更少的请求也意味着更少的开销并改善用户体验。
  • API网关对于移动应用程序至关重要。通过将用于调用多个服务的逻辑从客户端移动到API网关来简化客户端从“标准”公共Web友好API协议转换为内部使用的任何协议

API网关模式有一些缺点:

  • 复杂性增加 -  API网关是必须开发,部署和管理的另一个移动部分由于通过API网关额外的网络跳跃而增加了响应时间 - 但是,对于大多数应用程序而言,额外往返的成本是微不足道的。

问题:

  • 如何实现API网关?事件驱动/被动方法最好是必须按比例扩展以处理高负载。在JVM上,基于NIO的库(如Netty,Spring Reactor等)是有意义的。NodeJS是另一种选择。

相关的例子

  • 微服务架构模式产生了对这种模式的需求。
  • API网关必须使用客户端发现模式或服务器端发现模式将请求路由到可用服务实例。
  • API网关可以对用户进行身份验证,并将包含用户信息的访问令牌传递给服务
  • API网关将使用Circuit Breaker来调用服务
  • API网关通常实现API组合模式

已知的实现

架构模式: API网关的更多相关文章

  1. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  2. spring cloud+.net core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  3. .NET微服务架构及API网关

    一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...

  4. 微服务架构中API网关的角色

    [上海尚学堂的话]:本文主要讲述了Mashape的首席技术执行官Palladino对API网关的详细介绍,以及API网关在微服务中所起的作用,同时介绍了Mashape的一款开源API网关Kong. A ...

  5. 架构模式:API组合

    架构模式: API组合 上下文 您已应用微服务架构模式和每服务数据库模式.因此,实现从多个服务连接数据的查询不再是直截了当的. 问题 如何在微服务架构中实现查询? 结论 通过定义API Compose ...

  6. 使用API网关构建微服务

    使用传统的异步回调方法编写API组合代码会让你迅速坠入回调地狱.代码会变得混乱.难以理解且容易出错.一个更好的方法是使用响应式方法以一种声明式样式编写API网关代码.响应式抽象概念的例子有Scala中 ...

  7. Net分布式系统之六:微服务之API网关

    本人建立了个人技术.工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体.欢迎有兴趣的同学一起加入相互学习.基于上篇微服务架构分享,今天分享其中一个重要的基础组件“API网关”. 一.引言 ...

  8. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  9. Chris Richardson微服务翻译:构建微服务之使用API网关

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关(本文) 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

随机推荐

  1. Anaconda 下 Jupyter 更改默认启动路径和默认浏览器

    1.Jupyter 更改默认启动路径方法 输入jupyter notebook --generate-config 会生成jupyter_notebook_config.py 找到文件,并打开 将 # ...

  2. BZOJ 3630: [JLOI2014]镜面通道 (网络流 +计算几何)

    水能流过的地方光都能达到 呵呵.jpg 那就是裸的最小割(割开上边界和下边界)了- 判矩形和圆相交的时候就用圆心对矩形求一次点到矩形的最近距离(类似KD树的预估函数). CODE #include & ...

  3. Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)

    链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...

  4. xftp传输文件失败

    迁移yii项目的时候,需要手动传输runtime文件夹.但是发现总是传输失败,后来得知是因为xftp必须是root用户才能传输成功. 或者把传输的目标文件夹权限修改为777. 修改目标文件夹的属主和属 ...

  5. 第四届西安邮电大学acm-icpc校赛 流浪西邮之寻找火石碎片 多体积条件背包

    题目描述 众所周知,由于木星引力的影响,世界各地的推进发动机都需要进行重启.现在你接到紧急任务,要去收集火石碎片,重启西邮发动机.现在火石碎片已成为了稀缺资源,获得火石碎片需要钱或者需要一定的积分.火 ...

  6. jQuery系列(九):JS的事件流的概念

    1.事件概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件.想要知道这些事件是在 ...

  7. 【CUDA 基础】4.4 核函数可达到的带宽

    title: [CUDA 基础]4.4 核函数可达到的带宽 categories: - CUDA - Freshman tags: - 带宽 - 吞吐量 - 矩阵转置 toc: true date: ...

  8. quartz.net 执行后台任务

    ... https://www.cnblogs.com/zhangweizhong/category/771057.html https://www.cnblogs.com/lanxiaoke/cat ...

  9. NSNull

    集合中是不能放nil值的,因为nil是结尾,但是为了存放表示什么都没有的值,可以使用NSNull,它也是NSObject的一个子类. void null(){ NSNull *nl=[NSNull n ...

  10. FPGA课设-基于Xilinx Basys2开发板的除法器设计

    介绍一下Basys开发板: Basys2 FPGA开发板是一个电路设计实现平台,任何人都可以通过它来搭建一个真正的数字电路.Basys2是围绕着一个Spartan-3E FPGA芯片和一个Atmel ...