谈谈微服务中的 API 网关(API Gateway)

前言

又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉。

那么,在本篇文章中,我们就一起来探讨一下 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 网关

单节点网关

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

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

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

Backends for frontends 网关

这种模式是针对不同的客户端来实现一个不同的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 功能,这个对于运维来说是非常重要的,另外还有日志,监控,安全,服务发现,版本控制等。


小编注:比如说dashboard, https://github.com/dbarkwell/Ocelot.ConfigEditor ,很多想法还在探讨中,大家可以通过Issue 参与,或者直接贡献相关代码,自己撸。超时,熔断,重试这些功能ocelot都已经具备。


但是上面的这些 API 网关缺少什么功能呢? 比如超时,熔断,重试,聚合查询等。

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

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

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

应该大部分同学都可以看懂,我就简单解释一下。

  • 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

CAP 介绍:
http://www.cnblogs.com/savorboard/p/cap.html

有关分布式事务可以查看我的这篇文章。

感兴趣的同学可以给CAP一个 Star 以表支持,偷偷告诉你 Ocelot的作者也Star了哦。 :)

总结

通过本文我们了解到了什么是 API 网关以及API网关的作用和其在微服务架构中所处的地位。然后我们了解到了 API 网关的一些开源项目以及博主介绍的落地方案,在实际的实践中还是多希望大家能够多多思考总结,这样我们才能够变得更加强大。

相关文章:

  • Ocelot——初识基于.Net Core的API网关

  • Ocelot API网关的实现剖析

  • 微服务网关Ocelot

  • API网关Ocelot 使用Polly 处理部分失败问题

  • .NET Core 事件总线,分布式事务解决方案:CAP

  • CAP 介绍及使用【视频】

  • 分布式事务,EventBus 解决方案:CAP【中文文档】

原文:http://www.cnblogs.com/savorboard/p/api-gateway.html


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

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

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

相关文章

laravel如何生成swagger接口文档

php artisan serve --host 0.0.0.0 php artisan serve --port 8080 地址: http://127.0.0.1/blogkjh/public/api/documentation 1、安装包 composer require darkaonline/l5-swagger 2、配置 php artisan vendor:publish --provider “L5Swagger\L5SwaggerService…

jzoj4673,CF578D-LCS again【统计,字符串,容斥】

正题 luoguluoguluogu题目链接:https://www.luogu.org/problemnew/show/CF578D 题目大意 求有多少个字符串TTT使得其和字符串SSS的LCSLCSLCS长度为∣S∣−1|S|-1∣S∣−1 解题思路 首先考虑挖一个空再填一个字母。 这样方案数为n∗n∗mn*n*mn∗n∗m 但是我们考虑aabaabaab这样…

OAuth2 实现单点登录 SSO

转载自 OAuth2 实现单点登录 SSO 1. 前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”。网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么…

Ocelot网关

Ocelot是一个.net core框架下的网关的开源项目,下图是官方给出的基础实现图,即把后台的多个服务统一到网关处,前端应用:桌面端,web端,app端都只用访问网关即可。 Ocelot的实现原理就是把客户端对网关的请求…

linux服务器部署laravel出现putenv() has been disabled for security reasons

putenv() has been disabled for security reasons 进入 www/serve/php/72/etc 找到 disable_functions后面的函数,删除 putenv() 如果报错 The Process class relies on proc_open, which is not available on your PHP installation. 删除 proc_open

欢乐纪中A组周六赛【2019.3.23】

前言 做A组被虐好惨 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1313132017WYC2017WYC2017WYC1901901909090901001001000001919192017HZB2017HZB2017HZB1101101101001001001010100002727272017XJQ2017XJQ2017XJQ10010010010010010…

百度OCR文字识别-身份证识别

简介 答应了园区大牛张善友 要写AI 的系列博客,所以开始了AI 系列之旅。 一、介绍 身份证识别 API 接口文档地址:http://ai.baidu.com/docs#/OCR-API/top 接口描述 用户向服务请求识别身份证,身份证识别包括正面和背面。 请求说明 请求示例…

Spring Boot Elasticsearch 入门

转载自 芋道 Spring Boot Elasticsearch 入门 1. 概述 如果胖友之前有用过 Elasticsearch 的话,可能有过被使用的 Elasticsearch 客户端版本搞死搞活。如果有,那么一起握个抓。所以,我们在文章的开始,先一起理一理这块。 Elas…

内存不足The following exception is caused by a lack of memory or swap, or not having swap

在linux执行以下三个命令即可 /bin/dd if/dev/zero of/var/swap.1 bs1M count1024 /sbin/mkswap /var/swap.1 /sbin/swapon /var/swap.1

P2513-[HAOI2009]逆序对数列【dp,前缀和】

正题 题目链接:https://www.luogu.org/problemnew/show/P2513 题目大意 求长度为nnn逆序对为kkk个的序列总数。 解题思路 设fi,jf_{i,j}fi,j​表示1∼i1\sim i1∼i的排列逆序对个数为jjj 然后显然:fi,j∑k1i−1fi−1,j−kf_{i,j}\sum_{k1}^{i-1}f_{i-1,j-k}fi,j​k1∑i−1​…

在.NET Core类库中使用EF Core迁移数据库到SQL Server

前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题。 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合理,一些关于数据库的迁移,比如新增表,字段&…

Spring Boot MongoDB 入门

转载自 芋道 Spring Boot MongoDB 入门 1. 概述 可能有一些胖友对 MongoDB 不是很了解,这里我们引用一段介绍: FROM 《分布式文档存储数据库 MongoDB》 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最…

composer配置阿里云镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

CF735D-Taxes【数学,数论】

正题 luogu题目链接:https://www.luogu.org/problemnew/show/CF735D 题目大意 将一个数分解成若干个数使得这若干个数的最大因子最小。 解题思路 如果是质数就是1。如果是偶数根据哥德巴赫猜想就是2。或者把一个奇数减去2后是个质数也是2。否则就是3。 codecodecode #inclu…

Spring框架-事务管理注意事项

转载自 Spring框架-事务管理注意事项 常见事务问题 事务不起作用 可能是配置不起效,如扫描问题 事务自动提交了(批量操作中) 可能是在没事务的情况下,利用了数据库的隐式提交 事务配置说明 通常情况下我们的Spring Component扫…

P2568-GCD【欧拉函数,欧拉筛】

正题 题目链接:https://www.luogu.org/problemnew/show/P2568 题目大意 求有多少个数对满足gcd(x,y)pri(x,y≤n)gcd(x,y)pri(x,y\leq n)gcd(x,y)pri(x,y≤n) 解题思路 首先对于 gcd(x,y)pgcd(x,y)pgcd(x,y)p >gcd(x/p,y/p)1>gcd(x/p,y/p)1>gcd(x/p,y/p)1 那么对数就…

laravel允许所有网站进行跨域操作

共三步&#xff1a; 1、新建中间件&#xff1a; php artisan make:middleware EnableCrossRequestMiddleware2、EnableCrossRequestMiddleware.php中重写中间件里面的内容&#xff1a; <?php namespace App\Http\Middleware; use Closure; class EnableCrossRequestMidd…

Ocelot统一权限验证

Ocelot作为网关&#xff0c;可以用来作统一验证&#xff0c;接上一篇博客Ocelot网关&#xff0c;我们继续 前一篇&#xff0c;我们创建了OcelotGateway网关项目&#xff0c;DemoAAPI项目&#xff0c;DemoBAPI项目&#xff0c;为了验证用户并分发Token&#xff0c;现在还需要添…

P1081-开车旅行【倍增,链表,dp】

正题 题目大意:https://www.luogu.org/problemnew/show/P1081 题目大意 有若干个城市有不同的海拔hhh&#xff0c;两个城市之间的距离定义为∣hx−hy∣|h_x-h_y|∣hx​−hy​∣ 小A每次走次近的&#xff0c;小B每次走最近的。它们轮流开车。且只会往编号更大的城市开。 问一:…

Spring Boot之程序性能监控

转载自 Spring Boot之程序性能监控 Spring Boot特别适合团队构建各种可快速迭代的微服务&#xff0c;同时为了减少程序本身监控系统的开发量&#xff0c;Spring Boot提供了actuator模块&#xff0c;可以很方便的对你的Spring Boot程序做监控。 1. actuator接口说明 Spring B…