什么是服务网关

  API Gateway,是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,可以理解为 企业级应用防火墙 ,主要起到 隔离外部访问与内部系统的作用 。在微服务概念的流行之前,API网关就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的。

  API网关的流行,源于近几年来移动应用与企业间互联网需求的兴起。移动应用、企业互联,使得后台服务支持的对象,从以前单一的web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件

  API网关是一个服务器,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供了定制的API,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。API网关并不是微服务场景中必须的组件,如下图,不管有没有API网关,后端微服务都可以通过API很好的支持客户端的访问。
在这里插入图片描述
  但是对于服务数量众多、复杂度比较高、规模比较大的业务来说,引入API网关也有一系列的好处:

  • 聚合接口使得服务对调用者透明,客户端和后端的耦合降低
  • 聚合后台服务,节省流量,提高性能,提升用户体验
  • 提供安全、流控、过滤、缓存、计费、监控等API管理功能

为什么使用网关

  • 单体应用:浏览器发起请求到单体应用所在的机器,应用从数据库查询数据原路返回给浏览器,对单体应用来说是可以不用网关的
  • 微服务:微服务的应用是部署在不同机房、不同地区、不同域名下的。此时客户端想要请求对应的服务,都需要知道机器的具体IP或域名;当微服务实例众多时,对客户端来说就难以维护。此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识解析判断出具体的微服务网址,再把请求发送到服务实例上。这其中的记忆功能就全部交由网关来操作了
      
      
    在这里插入图片描述
      可入客户端直接请求各个微服务:
  • 客户端多次请求不同的微服务,增加了客户端的复杂性
  • 存在跨域请求,在一定场景下处理相对复杂
  • 身份认证问题,每个微服务都需要独立身份认证
  • 难以重构,随着项目的迭代,可能需要重新规划微服务
  • 某些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会有一定的困难

  因此,我们需要网关介于客户端和服务端之间的中间层,所有外部请求率先经过网关,客户端只需要与网关交互,只需要知道网关地址即可,这样简化了开发,并且有以下优点:

  • 易于监控,可在微服务网关收集监控数据并将其推送到外部系统进行分析
  • 易于认证,可在微服务网关上进行认证,然后再将请求转发到后端的微服务,从而无需在每个微服务中进行认证
  • 减少了客户端与每个微服务之间的交互次数

网关解决了什么问题

在这里插入图片描述
  网关具有身份认证与安全、审查与监控、动态路由、负载均衡、缓存、请求分片与管理、静态响应处理等功能。当然最主要的职责还是与"外界联系"

  • 性能:API高可用、负载均衡、容错机制
  • 安全:权限身份认证、敏脱、流量清洗、后端签名(保证全链路可信调用)、黑名单(非法调用的限制)
  • 日志:日志记录,一旦涉及分布式,全链路跟踪是必不可少的
  • 缓存:数据缓存
  • 监控:记录请求响应数据,API耗时分析,性能监控
  • 限流:流量监控、错峰流控,可以定义多种限流规则
  • 灰度:线上灰度部署,可以减少风险
  • 路由:动态路由规则

常用网关解决方案

1. Nginx + Lua

  Nginx是一个高性能的HTTP和反向代理服务器,Nginx一方面可以做反向代理,另一方面可以做静态资源服务器。Nginx是由C语言开发的,其负载均衡的实现是采用服务器实现的;它适用于服务器端负载均衡,可以整合Lua脚本。Nginx适合做门户网关,是作为整个全局的网关,对外的处于最外层的那种。但是Nginx不具备熔断、重试等功能

2. Kong

  Kong本身是基于 Nginx + Lua 的,但比Nginx提供了更简单的配置方式,数据采用了ApacheCassandra/PostgreSQL储存,并且提供了一些优秀的插件,例如验证、日志、调用频次限制等。Kong提供了大量的插件来扩展应用,通过设置不同的插件可以为服务提供各种增强的功能,但是和SpringCloud整合比较难

3. Traefik

  Traefik是一个开源的GO语言开发的为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具,它支持多种后台来自动化、动态的应用它的配置文件设置。Traefik拥有一个基于AngularJS编写的简单网站界面,支持Rest API,配置文件热更新,无需重启进程,高可用集群模式。适用于K8s

Spring Cloud Netflix Zuul

  Zuul是NetFlix公司开源的一个API网关组件,SpringCloud对其进行二次基于SpringBoot注解式封装做到开箱即用。目前来说结合SpringCloud提供的服务治理体系,可以做到请求转发,根据配置或者默认的路由规则进行路由和LoadBalance,无缝继承Hystrix。Zuul本身是的设计是基于 单线程的接收请求和转发处理,是阻塞IO,不支持长连接。2.0开始支持异步调用模式

Spring Cloud Gateway

  Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,其不仅是提供统一的路由方式,并且还基于Filter链的方式提供了网关的基本功能。它旨在提供一种简单有效的方法来路由到API,并为它们提供跨域的关注点

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐