微服务架构中APIGateway原理

背景

我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 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 功能,这个对于运维来说是非常重要的,另外还有日志,监控,安全,服务发现,版本控制等。

但是上面的这些 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 网关在整个微服务架构中的一个地位,承上启下,还是非常的重要。

原文地址:https://www.cnblogs.com/liuzhiqaingxyz/p/10385497.html

时间: 2024-08-02 05:26:46

微服务架构中APIGateway原理的相关文章

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与处理呢? 到底有没有一些好的建议与方案呢? 下面这个文章将揭晓上面的问题,让你对SpringCloud微服务网络请求性能有一个全新的认识. 目录简介 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06

微服务架构中整合网关、权限服务

前言:之前的文章有讲过微服务的权限系列和网关实现,都是孤立存在,本文将整合后端服务与网关.权限系统.安全权限部分的实现还讲解了基于前置验证的方式实现,但是由于与业务联系比较紧密,没有具体的示例.业务权限与业务联系非常密切,本次的整合项目将会把这部分的操作权限校验实现基于具体的业务服务. 1. 前文回顾与整合设计 在认证鉴权与API权限控制在微服务架构中的设计与实现系列文章中,讲解了在微服务架构中Auth系统的授权认证和鉴权.在微服务网关中,讲解了基于netflix-zuul组件实现的微服务网关.

微服务架构中的安全认证与鉴权

转载:http://www.bootdo.com/blog/open/post/125 从单体应用架构到分布式应用架构再到微服务架构,应用的安全访问在不断的经受考验.为了适应架构的变化.需求的变化,身份认证与鉴权方案也在不断的变革.面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本文将会为大家阐述微服务架构下的安全认证与鉴权方案. 单体应用 VS 微服务 随着微服务架构的兴起,传统的单体应用场景下的身份认证和鉴权面临的挑战越来越大

微服务架构中zuul的两种隔离机制实验

ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常.查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高于100那么就拒绝服务了,返回500. 信号量隔离 既然默认值太小,那么就在gateway的配置提高各个路由的信号量再实验.两个路由的信号量分开提高到2000和1000.我们再用gatling测试一下. 1setUp(scn.inject(rampUsers(200)

微服务----微服务架构中的提取基础组件

一.前言 在第一家公司中,接触到了公司的项目代码,在代码中使用了微服务的功能,使用到了公司封装的xx架构服务,简称为B架构,在B架构中具有基础业务功能服务,比如组织架构服务,日志服务,权限服务. 然后我们在项目中使用B架构中的服务,能够很容器也能很快捷地进行项目的开发,从而避免其他的非核心业务的编写. 二.基础功能组件 这些组件肯定是每一个应用到可以需要使用到的,这些组件是可以提取出来的,比如日志服务.监控服.统计服务.权限服务.认证服务等等.通过微服务的注册发现.配置.网关等,从而搭建出基础功

微服务架构中主流的配置中心对比分析?

为什么需要配置中心 配置实时生效: 传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化.轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中.配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置. 配置管理流程: 配置的权限管控.灰度发布.版本管理.格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分. 开源配置中心基本介

微服务架构的核心要点和实现原理

微服务架构中职能团队的划分 传统单体架构将系统分成具有不同职责的层次,对应的项目管理也倾向于将大的团队分成不同的职能团队,主要包括:用户交互UI团队.后台业务逻辑处理团队与数据存取ORM团队.DBA团队等.每个团队只对自己分层的职责负责,并对使用方提供组件服务质量保证.如果其中一个模块化组件需要升级.更新,那么这个变更会涉及不同的分层团队,即使升级和变更的改变很小,也需要进行跨团队沟通:需求阶段需要跨团队沟通产品功能,设计阶段需要跨团队沟通设计方案,开发阶段需要跨团队沟通具体的接口定义,测试阶段

从经典架构项目中透析微服务架构的核心概念和充血模型

微服务架构和SOA区别 微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系统,或者说SOA(面向服务架构)是什么区别呢? 我们先看相同点: 需要Registry,实现动态的服务注册发现机制:需要考虑分布式下面的事务一致性,CAP原则下,两段式提交不能保证性能,事务补偿机制需要考虑:同步调用还是异步消息传递,如何保证消息可靠性?SOA由ESB来集成所有的消息:都需要统一的Gateway来汇

微服务开发中的数据架构设计

本文来自作者 陈伟荣 在 GitChat 分享的文章[微服务开发中的数据架构设计] 前言 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合.业务的灵活调整组合以及系统的高可用性.为业务创新和业务持续提供了一个良好的基础平台.本文分享在这种技术架构下的数据架构的设计思想以及设计要点,本文包括下面若干内容. 微服务技术框架中的多层数据架构设计 数据架构设计中的要点 要点1:数据易用性 要点2:主.副数据及数据解耦 要点3:分库分表