API网关模式

什么是网关

    网关一词来源于计算机网络中的定义,网关(Gateway)又称网间连接器、协议转换器。网关的准确定义是: 两个计算机程序或系统之间的连接,网关作为两个程序之间的门户,允许它们通过不同计算机之间的协议通信来共享信息。顾名思义API网关就是API之间相互调用的关卡和屏障。


API之间为什么需要网关

    试想一下我们在实现一个非常庞大的业务系统,分为不同的业务domain和子系统,各个domain和子系统提供处理业务的API,不同系统之间以API的方式进行数据交互。通常情况下我们可能会将所有实现业务功能的API集成到一起(API Center)给不同的Channel的Portal提供数据处理的能力。当有一天我们的系统需要与第三方发生交互,我们既需要暴露给外部系统调用的公开API,同时也需要调用外部的API实现自身的业务需求。此时我们将会考虑很多的问题,比如:服务之间访问的授权和认证,安全和性能的监控,缓存和日志的处理,超时的Retry,负载和熔断的处理,查询请求的聚合等等一系列的问题。此时你需要一个可以集中处理所有可能在服务调用之间需要处理的一切事情,就像是小区的物业和安保一样,需要对小区所有的业主处理职责范围内的一切事情。

    这是通常情况下API网关需要帮我们处理的事情,随着系统业务的不断复杂化,我们的系统越越庞大,API的交互越来越错综复杂。此时我们可能会考虑将这个庞大的系统拆分成多个细小的domain,分别提供各自domain的API。这便是时下最流行的话题:微服务。当我们的系统演进到微服务的架构时,API网关将是系统必不可少的关键部分。在微服务体系结构中,客户端应用程序通常需要使用多个微服务的功能。客户端如果直接消费某服务,那通常情况下将需要处理和协调用多个微服务endpoint。当应用程序引入新的微服务或更新现有微服务时会发生什么?试想一下如果你的应用程序有许多微服务,那么处理和协调来自客户端如此多的endpoint的请求,那对系统来说是一场噩梦,而且由于客户端应用程序将与这些endpoint产生耦合,这将会使我们的系统边的混乱不堪。

    因此,我们需要一个中间层或间接层(Gateway)来处理不同client对API的请求,这将会使得我们的应用程序处理起来非常方便。如果没有API网关,客户端应用程序必须直接向微服务发送请求,这就会产生很多混乱的问题,比如:

耦合: 如果没有API网关,客户端的应用程序将与内部微服务间耦合。客户端序需要知道实现业务需求的API分散在服务中的哪些部分,当我们开发和重构内部服务时,将会影响到客户端应用程序,并且很难维护,因为客户端应用程序需要跟踪多个服务的endpoint

多次请求:客户端应用程序中的一个页面可能需要多次调用多个服务来完成某个功能,这可能导致客户端和服务器之间的多次往返请求,增加了显著的延迟。我们知道在中间级别处理的聚合可以提高客户端应用程序的性能和用户体验。

安全问题:如果没有网关,所有的服务都必须公开给“外部世界”,这使得攻击面比隐藏内部服务更大,而这些服务不是客户端应用程序直接使用的。攻击面越小应用程序就越安全。

横切关注点:每个公开发布的服务都必须处理诸如授权、SSL等问题。在许多情况下这些关注点可以在一个层中处理,这样内部服务就可以简化,这让我想起了面向切面的编程(AOP)

什么是网关模式

    当我们在使用多个客户端应用程序设计和构建大型或复杂的基于微服务的应用程序时,可以考虑使用API网关,这是为某些微服务组提供单一入口点的服务,它类似于面向对象设计的Facade(外观类)模式,但在微服务中它是系统的一部分。API网关模式的一个变体也称为“Backend for front-end”(BFF),因为你可能会根据每个客户端应用程序的不同需求创建多个API网关。因此API网关位于客户端应用程序和微服务之间,它充当反向代理将请求从客户端路由到服务,它还可以提供额外的横切特性,如身份验证、SSL终止和缓存。

下面的图显示了自定义API网关如何适合于基于微服务的体系结构。

640?wx_fmt=png

在上面的示例中,API网关将作为自定义Web API或ASP.NET WebHost服务的一个容器运行

    在该图中需要强调的是我们将使用一个面向多个不同客户端的自定义API网关服务。这可能是一个重要的风险,因为你的API网关服务将根据客户端需求的不断增长和发展,最终由于这些不同的需求,它将变得臃肿不堪,实际上它可能非常类似于单片应用程序或单片服务。这就是为什么我们非常推荐将API网关拆分为多个服务或多个更小的API网关。

    在使用API网关模式时我们也要非常小心,通常使用单个API网关聚合应用程序的所有内部微服务不是一个好的实践,因为一旦这样做了它就充当一个整体聚合器或协调器并通过耦合所有微服务来违反微服务自治。因此API网关应该基于业务边界和客户端应用程序进行隔离,而不是作为所有内部微服务的单一聚合器。当把API网关层分解为多个API网关时, 如果你的应用程序有多个客户端, 这可以是一个主要的枢纽来识别多个API的网关类型,这样你就可以有不同的外观类来应对每个客户端的需求。这是我们称之为“Backend for front-end”的模式(BFF),其中每个API网关可以为每个客户端提供不同的API,甚至可能基于客户端的特定需求实现特定的适配器代码,该代码在下面调用多个内部微服务,如下图所示:

640?wx_fmt=png

上图展示了一个带有多个细粒度API网关的简化体系结构,在这种情况下识别每个API GateWay的边界纯粹是基于BFF的模式,因此只是基于每个客户端提供各自所需的API,但在较大的应用程序也应该更进一步,以创建基于业务边界的网关作为第二设计衡量因素。


API网关模式中的主要特性 

  API网关可以根据产品的不同提供多种特性,它可能提供更丰富或更简单的特性,但是对于任何API网关来说,最重要和基本的特性是以下设计方式:

反向代理或网关路由:API网关提供反向代理,将请求(通常是Http请求)重新定向或路由到内部微服务的端点。网关为客户端应用程序提供一个endpoint或URL,然后在内部将请求映射到一组内部微服务。这个路由特性有助于从微服务的方式来解耦客户端,而且也很方便在单一API和客户端之间实现网关的控制,这样的话你可以添加新的API作为新的microservices同时仍然使用遗留单一的API,直到它在未来被分成许多microservices。因为API的网关的存在,客户端应用程序不会注意到所使用的API实现为内部microservices或单一的API,当在演进和和重构我们的单一API到 microservices的过程中因为有了API网关路由的存在,才不会带来Client请求的URI的变化。想了解更多网关路由的东西请戳这里。

请求聚合:作为网关模式的一部分,你可以将针对多个内部微服务的多个客户端请求(通常是Http请求)聚合到单个客户端请求中。当客户端页面需要调用来自多个微服务的数据时,这种模式特别方便。使用这种方法客户端将发送一个请求到API网关,然后网关将负责发送多个请求来获取内部microservices然后聚合结果再发送回客户端。这种设计模式的主要优点和目标是减少客户端应用程序和后端API之间的隔阂,对于微服务所在的数据中心之外的远程应用程序来说这一点尤为重要,比如移动应用程序或来自客户端远程浏览器中的Javascript的SPA应用程序的请求。对于在服务器环境中执行请求的常规web应用程序(如ASP),这种模式并不重要,因为延迟比远程客户机应用程序要小得多。是否能够执行此聚合取决于你使用的API网关产品,然而在许多情况下,在API网关的范围内创建聚合微服务将会更加的灵活,所以你也可以在代码中定义聚合(即c#代码)。想了解更多请求聚合的东西请戳这里。

横切关注点或网关卸载:根据每个API网关产品提供的特性,你可以将功能从单个微服务转移到网关,通过将横切关注点合并到一层来简化每个微服务的实现。这对于可以在每个内部微服务(如以下功能)中正确实现的复杂的特殊功能来说特别方便。

身份验证和授权
服务发现集成
响应缓存
重试策略,断路器和QoS。
速度限制和节流
负载平衡
日志记录、跟踪、相关性
头文件、查询字符串和声明转换
IP白名单


根据每个实现API网关产品可以提供更多的横切关注点,但这些都是最常见的特性。例如Azure API管理提供了这些特性中的大部分,以及许多对商业API非常有用的高级特性。但是对于更简单的方法,像Ocelot这样的轻量级API网关是相当灵活的,因为你可以将它部署到你所选择的环境和你的微服务。有关网关卸载模式的更多信息请戳这里。

 本篇文章主要是介绍了API的网关模式的特性,文章是来自微软官方博客并加入了自己的一点理解。译文来自:https://blogs.msdn.microsoft.com/cesardelatorre/2018/05/15/designing-and-implementing-api-gateways-with-ocelot-in-a-microservices-and-container-based-architecture/

参考资料:

API Gateway

http://microservices.io/patterns/apigateway.html

https://docs.microsoft.com/en-us/azure/architecture/microservices/gateway

Aggregation and composition pattern

http://microservices.io/patterns/data/api-composition.html

原文地址: https://www.cnblogs.com/xiandnc/p/9270365.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

楼层

楼层 题目大意: 有两个数m和t,问1~m之间去掉有数字t的数之后还有多少个数 原题: 题目描述 mxy 感觉新世界的大门打开了。 ta 决定要在新世界的旅馆中找间房住。已知新世界每天都有一个高能的数字 t,这个数字在楼层中是不会出…

P3825-[NOI2017]游戏【2-SAT】

正题 题目链接:https://www.luogu.com.cn/problem/P3825 题目大意 nnn场比赛,对于场地aaa不能用赛车AAA(b,cb,cb,c以此类推),对于场地xxx可以用任何赛车。然后给定mmm条条件形如iIjJi\ I\ j\ Ji I j J表示在第iii场比赛使用赛车I…

CVPR19 基于图卷积网络的多标签图像识别模型 论文笔记

笔记 旷视研究院的研究员提出了如下模型,用于图像的多标签分类. 该模型与一般模型不一样的一点是,它的分类器是生成的,因此它有一个专门生成分类器的子网络. 网络主要由两部分构成 特征表示子网络,该网络由ResNet-101构成,即蓝色框圈出的部分.分类器生成子网络,该网络由3个…

日行千里,全凭“车”况,为什么我们要升级平台

历经一个半月的时间,不管是叫工业互联网平台还是叫工业大数据平台,从1.0版本升级到2.0版本,升级部分包括:客户端(网关)、服务端(数据接收、数据处理、计算服务)、底层数据库结构、WE…

朋友

朋友 题目大意: 有两堆数,只有第一堆数会和第二堆数中比自己小的数交“朋友”,问有多少对朋友 原题: 题目描述 mxy 即将前往新世界。 在前往新世界的过程中,ta 遇见了两种人。一种是只和 lowb 做朋友,…

好代码是管出来的——.Net Core中的单元测试与代码覆盖率

测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试、集成测试、系统测试、压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模…

P3694-邦邦的大合唱站队【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3694 题目大意 nnn个人,有mmm个队伍,每个人都属于一个队伍。要求叫出一些人来,然后任意插入出来的空隙中使得同一队的人在一起。求最少出列人数。 解题思路 如果知道最终的队列就可以十分…

数字图像处理作业

图像处理作业 1 取sT(r)11(mr)EsT(r)\frac{1}{1(\frac{m}{r})^E}sT(r)1(rm​)E1​ 其中rrr为原始亮度,mmm为输入区间的中点,EEE描述曲线的陡峭程度 2 一幅8灰度级图像具有如下所示的直方图,求直方图均衡后的灰度级和对应概率,…

【差分】侦察兵

侦察兵 题目大意: 给出一个图,再给一些点,求出这些点左上角和右下角的数之和 原题: 题目描述 mxy 沉迷于一个辣鸡游戏不可自拔。 游戏地图是一个 n*n 的矩形,在每个单位格子上有一个数字,代表当前位置…

深港澳大湾区(深圳).NET技术交流会圆满成功

2018年7月7日一场以.NET Core微服务和机器学习为主题的交流会成功在深圳职业技术学院落下帷幕。这次活动在短短的一周时间内,报名人数超过了170人,除了一些同学临时有事,基本都到现场了,特别感谢深职院的软创工作室对这次活动的支…

P5322-[BJOI2019]排兵布阵【背包】

正题 题目链接:https://www.luogu.com.cnp/problem/P1768 题目大意 nnn个城池,有sss个玩家对于每个城池有一定的兵。对于所有玩家的每个城池都有派兵一个人数,要求派兵人数之和为mmm。如果你的派兵数列每大于一个玩家派兵数量的两倍那么就可以获得该城池…

图像处理作业二

作业信息 1、证明3.44和3.45的正确性 g(x,y)1K∑i1Kgi(x,y)g(x,y)\frac{1}{K}\sum_{i1}^K g_i(x,y)g(x,y)K1​∑i1K​gi​(x,y) E[g(x,y)]f(x,y)E[n(x,y)]f(x,y)E[g(x,y)]f(x,y)E[n(x,y)]f(x,y)E[g(x,y)]f(x,y)E[n(x,y)]f(x,y) D[g]E[(g−E[g])2]E[g2]−E[g]2E[f22f(n1n2...nK…

【模拟】遭遇战

遭遇战 题目大意: 在一个nn的范围内两个人在跑(san)步,问他们在哪里相遇 原题 题目描述 mxy 沉迷于一个辣鸡游戏不可自拔。 游戏地图是一个 n*n 的矩形,左上角为(0,0),右下角为…

.Net Core开发日志——Peachpie

.Net Core的生态圈随着开源社区的力量不断注入至其中,正在变得越来越强盛,并且不时得就出现些有意思的项目,比如Peachpie,它使得PHP的代码迁移到.Net Core项目变得可能。从创建简单的入门程序开始可以更容易地体会其特性。首先安装…

P5268-[SNOI2017]一个简单的询问【莫队】

正题 题目链接:https://www.luogu.com.cn/problem/P5268 题目大意 nnn个数的一个序列,定义get(l1,r1,x)get(l_1,r_1,x)get(l1​,r1​,x)表示区间[l1,r1][l_1,r_1][l1​,r1​]中有多少个xxx。 每次询问(l1,r1,l2,r2)(l_1,r_1,l_2,r_2)(l1​,r1​,l2​,r2​)求∑x∞…

图像处理作业第三次

图像处理作业第三次 1.根据书中对傅立叶变换的定义,证明课本165页上有关傅立叶变换的平移性质。 F(u−u0,v−v0)F(u-u_0,v-v_0)F(u−u0​,v−v0​) ∑x0M−1∑y0N−1f(x,y)e−j2π((u−u0)x/M(v−v0)y/N)\sum_{x0}^{M-1}\sum_{y0}^{N-1}f(x,y)e^{-j2\pi((u-u_0)x/M…

初一模拟赛(4.20)

成绩: rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf400400400100100100100100100100100100100100100222wjjwjjwjj310310310100100100100100100100100100101010333hkyhkyhky300300300100100100100100100100100100000333cyzcyzcyz30…

.NET Core开发日志——Middleware

熟悉ASP.NET架构的开发者一定对于HTTP Modules与HTTP Handlers不陌生。两者的作用主要是对网络请求执行特定的处理工作。而在.NET Core中,它们都被Middleware(中件间)取代了。之前的Http Modules和HTTP Handlers是如下图般处理请求的:现在变成了这样&…

P3850-[TJOI2007]书架【Splay】

正题 题目链接:https://www.luogu.com.cn/problem/P3850 题目大意 一个书架上有nnn本书&#xff0c;进行mmm次插入操作&#xff0c;然后qqq次询问一个位置上的书。 解题思路 用SplaySplaySplay进行插入操作&#xff0c;然后直接查询即可 codecodecode #include<cstdio&g…

【并查集】家族 (ssl 1896)

家族 ssl 1896 题目大意&#xff1a; 合并一些集合&#xff0c;然后判断某两个点是否在同一个集合内 原题&#xff1a; 题目描述 若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图&#xff0c;求任…