API网关学习及介绍

一、什么是API网关

        

     API网关是一个服务器,是系统的后端统一入口。首先,它会提供最基本的路由服务,将调用转发到上游服务。其次,作为一个入口,它还可以进行认证,鉴权,限流等操作,对上游服务保护。所以说,有了API网关,就可以做到“一夫当关,万夫莫开”

    从技术设计的角度上来说,API是一种抽象,它隔离了我们的使用以及实现;从开发管理的角度上来说,API是一种契约。

    API网关是一种微服务的架构解决方案,服务于API“契约”精神,并尽可能的扩大这种契约的影响力,构建一种围绕API开发的“生态”。

二、API网关特性

使用面向切面编程在完成一些功能时,可以让代码的侵入性更小,实现更加优雅。而在微服务架构中,API网关可以给整个微服务增加面向切面编程的能力。API网关特性如下:

  • 路由转发
    之前说了「API网关」是内部微服务的对外唯一入口,所以外面全部的请求都会先发到这个「API网关」上,然后由「API网关」来根据不同的请求去路由到不同的微服务节点上。例如可以 根据路径 来转发、也可以 根据参数 来转发。
    并且由于内部微服务实例也会随着业务调整不停的变更,增加或者删除节点,「API网关」可以与「服务注册」模块进行协同工作,保证将外部请求转发到最合适的微服务实例上面去。
  • 负载均衡
    既然「API网关」是内部微服务的单一入口,所以「API网关」在收到外部请求之后,还可以根据内部微服务每个实例的负荷情况进行动态的负载均衡调节。一旦内部的某个微服务实例负载很高,甚至是不能及时响应,则「API网关」就通过负载均衡策略减少或停止向这个实例转发请求。当所有的内部微服务实例都处理不过来的时候,「API网关」还可以采用限流或熔断的形式阻止外部请求,以保障整个系统的可用性。
  • 安全认证
    「API网关」就像是微服务的大门守卫,每一个请求进来之后,都必须先在「API网关」上进行身份验证,身份验证通过后才转发给后面的服务,转发的时候一般也会带上身份信息。
    同时「API网关」也需要对每一个请求进行安全性检查,例如参数的安全性、传输的安全性等等。
  • 日志记录
    既然所有的请求都需要走「API网关」,那么我们就可以在「API网关」上统一集中的记录下这些行为日志。这些日志既可以作为我们后续事件查询使用,也可以作为系统的性能监控使用。
  • 数据转换
    因为「API网关」对外是面向多种不同的客户端,不同的客户端所传输的数据类型可能是不一样的。因此「API网关」还需要具备数据转换的功能,将不同客户端传输进来的数据转换成同一种类型再转发给内部微服务上,这样,兼容了这些请求的多样性,保证了微服务的灵活性。

三、常用API网关及其原理

1)Kong  

  

优点:

  1. 可扩展性,Kong依赖一个数据库来实现配置存储,依赖 serf 来实现 instance 之间的通信。任何一个节点修改了其他节点会收到通知并重新reload配置。
  2. 模块化,Kong 可以方便地增加新的插件,并且插件可以通过 Restful API 进行管理。

缺点:

        lua语言开发,某些功能是收费,维护成本高。

主要分析一下其源码和原理:

  1. core目录里面是一些基础框架代码,包括hooks,事件,插件基础
  2. plugins目录包括所有kong自带的插件,kong的插件扩展有一套自己的规范,按照规范来非常容易地就能扩展kong
  3. dao是数据库抽象层,目前kong自带支持数据库postgresql和cassandra。
  4. tools为一些工具函数,需要注意的是cache。因为所有配置(包括插件的配置)都会是用cache来缓存,为了减少读取数据库次数。
  5. api Kong会提供一个系列接口来更新配置

 2)Netflix Zuul 

        Zuul1 是基于 Servlet 框架构建,如图所示,采用的是阻塞和多线程方式,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。

  

   Zuul2 的巨大区别是它运行在异步和无阻塞框架上,每个 CPU 核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。又由于数据被存储在同一个 CPU 里,可以复用 CPU 级别的缓存,前面提及的延迟和重试风暴问题也通过队列存储连接数和事件数方式减轻了很多(较线程切换来说轻量级很多,自然消耗较小)

缺点: 没有动态化配置,不利于管理。

3)sc-gateway

  spring Cloud Gateway 是 Spring Cloud 的一个全新项目,基于webflux的,底层也是基于netty,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

  Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

相关概念:

  • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

工作流程:

 缺点:没有动态化的配置,只是spring-cloud体系的,其他的业务系统的接入、公用服务的实现、新上接口的添加、动态调整接口的限流速率等等很多问题都很棘手。

四、API网关优缺点

      使用API网关的最大优点是,它封装了应用程序的内部结构。客户端只需要同网关交互,而不必调用特定的服务。API网关为每一类客户端提供了特定的API。这减少了客户端与应用程序间的交互次数,还简化了客户端代码。
     API网关也有一些不足,它增加了一个我们必须开发、部署和维护的高可用组件。为了暴露每个微服务的端点,开发人员必须更新API网关。API网关的更新过程要尽可能地简单,这很重要。否则,为了更新网关,开发人员将不得不排队等待。由于所有API请求都要经过网关,它很容易成为系统的性能瓶颈。不过,虽然有这些不足,但对于大多数现实世界的应用程序而言,使用API网关是合理的。

参考:

https://zhuanlan.zhihu.com/p/63944586

https://zhuanlan.zhihu.com/p/32660126

API网关作用、方案及如何选择 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126

https://www.zhihu.com/question/309582197  

https://tech.youzan.com/gateway/

https://mp.weixin.qq.com/s/QqFNcZfHdFbY31rVrsLsEA

https://www.zybuluo.com/yishuailuo/note/844059?utm_source=tool.lu

http://blog.didispace.com/hzf-ms-apigateway-1/

http://blog.didispace.com/hzf-ms-apigateway-2/#lg=1&slide=1

API网关作用、方案及如何选择 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126

API网关作用、方案及如何选择 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126

API网关作用、方案及如何选择 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126

API网关作用、方案及如何选择 - frankyan的文章 - 知乎 https://zhuanlan.zhihu.com/p/32660126

原文地址:https://www.cnblogs.com/thiaoqueen/p/10789458.html