api商品分享源码_谈谈微服务中的 API 网关(API Gateway)

fefb352e9e8561eeb5fe3036ae578f64.png

在本篇文章中,我们就一起来探讨一下 API 网关在整个微服务分布式架构中的一个作用。

# 背景我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api 风格的接口来被 H5, Android, IOS 以及第三方应用程序调用。但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中,举个例子。在一个电商系统中,查看一个商品详情页,这个商品详情页包含商品的标题,价格,库存,评论等,这些数据对于后端来说可能是位于不同的微服务系统之中,可能我后台的系统是这样来拆分我的服务的:
  • 产品服务 - 负责提供商品的标题,描述,规格等。
  • 价格服务 - 负责对产品进行定价,价格策略计算,促销价等。
  • 库存服务 - 负责产品库存。
  • 评价服务 - 负责用户对商品的评论,回复等。
现在,商品详情页需要从这些微服务中拉取相应的信息,问题来了?

# 问题

由于我们使用的服务系统架构,所以没办法像传统单体应用一样依靠数据库的 join 查询来得到最终结果,那么如何才能访问各个服务呢?按照微服务设计的指导原则,我们的微服务可能存在下面的问题:
  • 服务使用了多种协议,因为不同的协议有不同的应场景用,比如可能同时使用 HTTP, AMQP, gRPC 等。
  • 服务的划分可能随着时间而变化。
  • 服务的实例或者Host+端口可能会动态的变化。
那么,对于前端的UI需求也可能会有以下几种:
  • 粗粒度的API,而微服务通常提供的细粒度的API,对于UI来说如果要调用细粒度的api可能需要调用很多次,这是个不小的问题。
  • 不同的客户端设备可能需要不同的数据。Web,H5,APP
  • 不同设备的网络性能,对于多个api来说,这个访问需要转移的服务端会快得多
以上,就是我们构建微服务的过程中可能会遇到的问题。那么如何解决呢?这种情况下,我们就需要一个今天要讲的这个东西, API 网关(API Gataway)。# API 网关

下面是百度上针对于 API 网关的介绍:

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。
API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。

Chris Richardson 在他的博客中把 API 网关划分为以下两种:

  • 单节点 API 网关

  • Backends for frontends 网关

单节点网关

c00c105063b9cfa8ded3b3f2f4393d9c.png

单节点的 API网关为每个客户端提供不同的API,而不是提供一种万能风格的API。

这个网关和微软在 eShop 项目中推荐的网关是一致的。

更多详细信息我会在下文进行说明。

Backends for frontends 网关

95dab59dda68b3e805e1d241bd4de4cb.png

这种模式是针对不同的客户端来实现一个不同的API网关。

# 落地方案我一直在寻思一种最佳的 API 网关的落地方案,以上两种 API 网关有什么问题呢?通常情况下, API 网关要做很多工作,它作为一个系统的后端总入口,承载着所有服务的组合路由转换等工作,除此之外,我们一般也会把安全,限流,缓存,日志,监控,重试,熔断等放到 API 网关来做,那么可以试想在高并发的情况下,这里可能会出现一个性能瓶颈。关注公众号小黄鸭编程社区,回复关键字资料,领取最新的编程视频资料。另外,如果没有开源项目的支撑前提下,自己来做这样一套东西,是非常大的一个工作量,而且还要做 API 网关本身的高可用等,如果一旦做不好,有可能最先挂掉的不是你的其他服务,而就是这个API网关。这个时候,通常我们会去找一些开源的 API 网关项目,博主已经给你找好了,目前社区的关于 API Gataway 的项目有以下这些:Tyk:Tyk是一个开放源码的API网关,它是快速、可扩展和现代的。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。Try 是一个基于Go实现的网关服务。Kong:Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。Orange:和Kong类似也是基于OpenResty的一个API网关程序,是由国人开发的,学姐也是贡献者之一。Netflix zuul:Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。apiaxle: Nodejs 实现的一个 API 网关。api-umbrella: Ruby 实现的一个 API 网关。我们来说说上面的这些开源项目适不适合作为 API 网关来供我们使用。拿单节点网关来说,这种网关相当于是处于 Web 层和 Service 之间,用来聚合服务的?注意,我们需要的是聚合服务,而以上这些开源项目都不具备这个功能,我说的聚合具体指的是开箱即用。我们要想使用这些服务需要来自己对API网关过一些扩展或者是开发一些插件,这个时候问题就来了。扩展Tyk我需要会Go语言,扩展Kong我需要会写lua脚本,使用 zuul 还得会Java,这对于开发人员来说是不太现实的,那么这个时候怎么办?有些同学可能会说 ASP.NET Core 可以使用 Ocelot,说得没错,我们可以通过引入Ocelot来处理API聚合服务这一块的业务,但是,这中间有一个问题,就像我在上面说的一样,这很容易造成性能问题,另外一方面,Ocelot的功能相比上面的那些开源项目来说功能要弱很多,具体体现在哪些方面呢?除了最重要的高性能的IO模型和集群方案外, 比如会经常使用的 Dashboard 功能,这个对于运维来说是非常重要的,另外还有日志,监控,安全,服务发现,版本控制等。但是上面的这些 API 网关缺少什么功能呢?比如超时,熔断,重试,聚合查询等。

注意:以下内容的这些想法全是我个人对于 API 网关的理解而诞生的,如有错误还请指正。

聪明的同学可能想出来了,怎么办呢?我们可以充分来结合两者的优势来在我们的 ASP.NET Core 应用程序中实现一个“双重网关”。

下面是我画的一个 API 网关在微服务架构中的一个作用图:

7700529d6ed887b452209067ed6616e2.png

应该大部分同学都可以看懂,我就简单解释一下。
  • OpenResty Api Gateway
从左至右 HTTP 请求先由DNS在拿到第一手流量后负载均衡到基于 OpenResty 的 API Gataway 网关集群,在这个流程我们可以使用像 Kong,Orage,Tyk 这些开源的支持高并发高访问量 API 网关程序在做第一层流量的防护,在这一级我们可以做一些像身份认证,安全,监控,日志,流控等策略。除了这些我们还可以做一些服务的发现和注册(这个要看不同网关的支持程度),接口的版本控制,路由重写等。
  • Aggr Api Gateway
然后再由这些 API 网关把请求再负载到不同的 Aggr Api Gateway,在这里我们做聚合服务这个操作,具体体现也就是图中的黄色区域是需要由各个语言的开发人员来需要写代码实现的。具体流程也就是我们可以引入像 Ocelot 这种和语言相关的 API 网关开源项目,然后通过 NuGet 包引入之后通过 Json配置+聚合代码的方式来整合后端的各个微服务提供聚合查询等操作。这期间对于有需求的接口,我们可以应用超时,缓存,熔断,重试等策略。从 Aggr Api Gateway 到后端微服务集群这中间就属于内部的通讯了,我们可以使用对内部友好的通讯协议比如 gRPC 或者 AMQP 等,然后进行 RPC调用提高通讯性能。注意:Aggr Api Gateway 这个网关对于一些接口来说的话并不是必须的,也可以由后端微服务直接提供REST API给第一层网关使用。以上,就是我理解的 API 网关在整个微服务架构中的一个地位,承上启下,还是非常的重要。我们知道,在 API 网关的后端是微服务的集群,那么除了聚合查询之外有时候我们有时候需要做一些跨不同服务的操作,比如一次电商系统的下单操作,可以会设计到产品、价格、库存等一系列跨微服务操作,在中间我们一般会采用集成事件(EventBus)来进行通讯这种解决方案,在这个过程中我们不仅仅的是需要通讯,那么这些操作还需要保证事务一致性,而一般分布式系统中的事务我们追求的是最终一致性。如果是在 .NET Core 中,我们可以使用博主开源的 EventBus + 分布式事务 解决方案 CAP。
GitHub:https://github.com/dotnetcore/CAP
# 总结通过本文我们了解到了什么是 API 网关以及API网关的作用和其在微服务架构中所处的地位。然后我们了解到了 API 网关的一些开源项目以及博主介绍的落地方案,在实际的实践中还是多希望大家能够多多思考总结,这样我们才能够变得更加强大。

作者:Savorboard

来源:https://www.cnblogs.com/savorboard/p/api-gateway.html

往期推荐

?

  • 快讯:Eclipse 4.16 稳定版发布了!
  • Logback 配置文件这么写,TPS 提高 10 倍!
  • Spring Boot 2.3.1 发布了!与鸭哥一起解读新特性:-)

b8efc822ec8daed8f2416abf08b29cfe.png

73fccea634154c0f76e66d0eb16fe960.gif

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

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

相关文章

Docker(4)-容器互联与端口映射

容器互联 默认情况下,容器都是各自独立运行,与世隔绝。 Docker提供了一个名为docker0的虚拟网桥,它会为每个相连的容器分配一个虚拟子网。但是尽管容器都连在同一个虚拟网桥上,如果没有额外的配置,它们还是不能够相互通…

设计规范-导航、弹窗、视图

常见导航样式: 根据产品的特性,导航可以混合使用,体现形式多样化。 不能为了追求多样化,滥用导航类型。 扁平式导航: 在一级页面提供导航栏,一般处于顶部/底部,适合频繁切换的模块&#xff0c…

f3arra1n3.4.1版本_GDB 10.1版本发布了

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)GDB的10.1版,即GNU调试器,现已发布。GDB是Ada,C,C ,Fortran,Go,Rust等许多源代码级的调试器。GDB可以定位(调试正在运行的程序…

使用密钥登录CentOS系统(基于密钥的认证)

在Window客户端有多种软件可以登陆ssh,比如putty,xshelll,secureCRT,我就以xshell为例设置使用公钥和私钥验证登陆服务器。 使用Xshell密钥认证机制远程登录Linux 1、使用xshell生成公钥 Key Type 选择RSA (SSH1只支持…

华为8545m5补全shell_华为hs8145v5 改华为界面和默认超密(一)

重点从电信界面改华为界面要点:修改配置文件必须要有 Root 权限,也就是要能登陆 Telnet 和补全 Shell 。开 Telnet 方法:1.需要有超密,登陆到电信管理页面,打开 Telnet 选项。在后台页面点击“安全”--->“ONT访问控…

小程序产品的特点

认识小程序: 小程序:一种不需要下载安装,即可使用的应用。 小程序的特点: 开发成本低。 流畅的使用体验。 庞大的流量池可供使用。 用完即走,不占用手机内存,但是有使用记录供用户可方便的再次找回产品。…

数据库优化 - 多列索引经典题目

题目 假设某个表有一个联合索引(c1,c2,c3,c4)一下——只能使用该联合索引的c1,c2,c3部分 A where c1x and c2x and c4>x and c3x B where c1x and c2x and c4x order by c3 C where c1x and c4 x group by c3,c2 D where c1x and c5x order by c2,c3 …

网站设计规范

网站不同于移动应用: 屏幕适配(屏幕尺寸、分辨率)。 交互方式不同,鼠标相对手指具备更精准的点击范围,有更多的控件状态。 在设计网站原型时,并没有具体的控件大小和条栏规范,需要注意相关设计…

产品设计七大定律

Alan Cooper(交互设计之父):除非有更好的选择,否则就遵从标准。 许多设计准则都基于人类心理学:人们如何感知、学习、推理、记忆,以及把意图转换为行动。 菲茨定律: 菲茨定律用来预测某点到目…

插入网站连接_带你了解网站设计的五个基本步骤

网站制作设计并不是一件简单的事情,一个好的网站不但里面包含的内容要全面,而且还要能够持续运转,为我们带来流量。下面简单为大家介绍一下网站设计的基本步骤,希望能够帮助大家更好的了解网站建设。网站设计1、站点定位确定网站的…

内容型的产品该怎么做?

内容产品: 什么是内容型产品:以图文、视频/直播、音频等形式提供服务的产品形态。 例:抖音、快手、微博、今日头条、知乎、得到… 内容产品的发展: 内容产品生态: 内容产品用户角色及职责: 内容模型&#x…

复杂电路简化经典例题_一天搞定考试系列之电路原理(3)

经过了前两章对阅读理解学习法的实践运用,想必大家知道该怎么做了,至于效果,我不敢保证对每个人都有效,欢迎大家实践后给予反馈,大家一起寻找更好的方法。下面进入第三章,需要说明的是前两章虽然简单但是很…

【前端】Github Pages 与域名关联简明教程

Github Pages 与域名关联简明教程 1. 向你的 Github Pages 仓库添加一个CNAME(一定要*大写*)文件 其中只能包含一个顶级域名,像这样: example.com如果你是用 hexo 框架搭建博客并部署到 Github Pages 上,每次 > hexo g > hexo d 后会把…

怎么把东西去掉修图_很多人花几千块学习商业修图,其实跟把钱扔了一样。?...

很多人花几千块学习商业修图,其实跟把钱扔了一样。我所说的商业修图是指那些杂志、明星修图,很多人觉得修杂志、明星就是大师,就非常厉害,其实商业修图重要的不是技术,而是资源、圈子;大部分人看作品也不是…

算法入门经典-第七章 例题7-2最大乘积

最大乘积 输入n个元素组成的序列s&#xff0c;你需要找出一个乘积最大的连续子序列。如果这个最大的成绩不是正数&#xff0c;应输入-1&#xff08;表示无解&#xff09;。输入0结束输入。1<n<18,-10<Si<10。 样例输入&#xff1a; 3 2 4 -3 样例输出&#xff1a; …

h5页面生成图片分享到微信js_html2canvas 动态生成微信分享海报的优质js库

如何把网页上的内容用javascript来实现截图&#xff1f;今天分享的html2canvas就可以。介绍在微信项目中经常会遇到动态生成海报的需求&#xff0c;Web前端合成图片往往会使用canvas。canvas虽然强大&#xff0c;但用来合成海报非常繁琐&#xff0c;一不小心就几百行代码了。而…

expires为session_面试必问:session,cookie和token的区别

点击上方蓝字关注我们 !session&#xff0c;cookie和token究竟是什么简述cookie&#xff0c;session&#xff0c;token作为面试必问题&#xff0c;很多同学能答个大概&#xff0c;但是又迷糊不清&#xff0c;希望本篇文章对大家有所帮助http是一个无状态协议什么是无状态呢&…

测试用例设计方法 - 场景分析法

现在的软件几乎都是用事件触发来控制流程的。象GUI软件、游戏等。事件触发时的情景并形成了场景&#xff0c;而同一事件不同的触发顺序和处理结果就形成了事件流。这种在软件设计方面的思想可以引入到软件测试中&#xff0c;可以生动地 描绘出事件触发时的情景&#xff0c;有利…

Lucene第一讲——概述与入门

一、概述 1.什么是Lucene? Lucene是apache下的一个开源的全文检索引擎工具包。 它为软件开发人员提供一个简单易用的工具包&#xff08;类库&#xff09;&#xff0c;以方便的在目标系统中实现全文检索的功能。 2.能干什么&#xff1f; 主要运用&#xff1a;全文检索 3.全文检…

(一)svn介绍

项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对代码文件、文档等没有进行版本控制&#xff0c;将会出现很多问题&#xff1a; 备份多个版本&#xff0c;占用磁盘空间大解决代码冲突困难容易引发BUG难于恢复至以前正确版本无法进行权限控制项目版本发布困难什么是…