写点什么

云上应用技术架构 -API 网关

作者:深蓝
  • 2023-11-20
    北京
  • 本文字数:8826 字

    阅读完需:约 29 分钟

链接: https://github.com/svc-design/ebooks/

概述

在分布式架构中,一个复杂的应用被拆分为多个小而独立的服务,每个服务都运行在自己的进程中,并通过轻量级的机制(如 HTTP RESTful API)进行通信。每个服务都围绕一个特定的业务功能进行构建,并可以独立地进行开发、部署和扩展。

应用分布式架构提供了许多优点,包括:

  • 模块化:微服务是独立的,可以单独开发和部署。这使得团队可以更快地迭代和发布新功能。

  • 可扩展性:每个服务可以根据需要进行独立扩展,这使得系统可以更好地处理不均匀的负载。

  • 容错性:如果一个服务出现故障,它不会影响到其他的服务。

由于有大量的服务需要进行通信,这就需要一种统一的方式来管理这些通信。这就是 API 网关的角色。API 网关是应用分布式架构中的一个关键组件,它提供了一种统一的方式来路由请求到正确的服务。

API 网关

API 网关是分布式应用架构中的一个重要组件,它是所有 API 请求的入口点,起到了把多个微服务的 APIs 封装为一个统一的 API 接口的作用。这样做可以简化客户端的操作,同时也可以对请求进行预处理和响应进行后处理,以此实现一些共享的、跨服务的功能。

API 网关可以提供包括认证、授权、限流、负载均衡、缓存、请求分片和协议转换等功能,以下是作为一个网关的通用功能说明:

  1. 请求路由:API 网关负责将请求转发到适当的微服务。它根据请求的路径、HTTP 方法或其他参数,将请求路由到适当的后端服务。

  2. 组合 API:API 网关可以将多个微服务的 API 调用组合成一个单一的 API 调用。这可以减少客户端与服务器之间的通信次数,从而提高应用程序的性能。

  3. 协议转换:API 网关可以在不同的协议之间进行转换,例如,将 HTTP/1.1 请求转换为 HTTP/2 或 gRPC 请求。

  4. 数据转换:API 网关可以在请求和响应中进行数据格式转换。例如,它可以将 JSON 格式的请求体转换为 XML 格式,或者将后端服务返回的 Protobuf 消息转换为 JSON 格式。

  5. 验证和授权:API 网关可以进行身份验证和授权检查,确保只有具有适当权限的用户才能访问后端服务。

  6. 负载均衡:API 网关通常内置了负载均衡器,可以根据各种策略(如轮询、最少连接、响应时间等)将请求分发到后端服务的多个实例。

  7. 缓存:API 网关可以对后端服务的响应进行缓存,以减少对后端服务的负载,并提高响应速度。

  8. 请求分片和管理:对于大型请求,API 网关可以将其分割成更小的片段,并进行有效管理。这对于处理大型文件上传或下载、流媒体传输等场景非常有用。

  9. 异常处理:API 网关可以捕获后端服务抛出的异常,将其转换为客户端可理解的错误信息,并返回给客户端。此外,它还可以实现重试逻辑和断路器功能,增强系统的健壮性。

网关接口协议

API 接口协议是定义 API 如何交互和通信的规则和标准。它规定了请求和响应的格式、数据类型、操作(如 GET、POST、PUT、DELETE 等)、安全验证方式,以及错误处理等。API 接口协议是构建和使用 API 的基础,它决定了 API 的性能、可用性、可扩展性和安全性。

API 接口协议的重要程度不言而喻。以下是几个主要的原因:

  • 可互操作性:API 接口协议使得不同的软件系统能够彼此交互和通信,实现数据和功能的共享。

  • 一致性:API 接口协议提供了一致的规则和标准,使得开发者在使用或构建 API 时知道应该如何进行。

  • 效率:好的 API 接口协议可以提高通信的效率,减少错误,提高系统的整体性能。

  • 安全性:API 接口协议通常包含了安全验证和错误处理的规则,保证了 API 的安全使用。

因此,选择适当的 API 接口协议并正确地实现它,对于构建高效、可用、安全和可扩展的 API 至关重要。常用的 API(Application Programming Interface) 接口协议的如下:

  1. RESTful API:REST(Representational State Transfer)是一种设计风格。通常使用 HTTP 作为通信协议,使用 URL 来表示资源,并使用 JSON 作为数据格式。RESTful API 基于 HTTP 协议,并通过 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。RESTful API 简单易用,是目前被广泛应用的 Web 服务设计模型。

  2. OData (Open Data Protocol):OData 是一种开放标准,允许消费者使用 RESTful API 查询和操作数据。

  3. WebSockets:WebSocket 是一种通信协议,提供了全双工通信通道。它在单个 TCP 连接上进行通信,以实现实时数据交换。

  4. SOAP:SOAP(Simple Object Access Protocol)是一种通信协议,它定义了在 Web 服务中交换结构化信息的格式。SOAP 可以使用多种协议,包括 HTTP 和 SMTP。

  5. JSON-RPC 和 XML-RPC:这两种都是远程过程调用(RPC)协议,允许一个网络中的计算机调用另一个计算机的函数或方法。JSON-RPC 使用 JSON 进行数据编码,而 XML-RPC 使用 XML。

  6. gRPC:gRPC 是一个高性能、开源的通用 RPC 框架,由 Google 开发。它基于 HTTP/2 协议,使用 Protocol Buffers 作为接口描述语言,并支持多种语言。支持多种语言,可以提供高性能的远程过程调用(RPC)。gRPC 使用 Protocol Buffers 作为接口描述语言,这使得其能够提供强类型的服务接口和消息类型。

  7. GraphQL:GraphQL 允许客户端精确地指定其需要的数据,避免了过度获取和欠获取的问题。GraphQL 既可以作为 RESTful API 的替代品,也可以与之并存。它使得 API 更加灵活,更好地适应了客户端的需求。

其中 SOAP、XML-RPC 和 JSON-RPC 等老旧的协议由于其复杂性和效率问题,已经被 RESTful API、gRPC 和 GraphQL 等更现代、更高效的协议取代。

开源 API 网关

选择一个 API 网关的因素有很多,包括性能、功能、易用性、社区支持、文档质量等。Nginx、Envoy、Traefik、Netty 和 Express.js 这五种 API 网关在 GitHub 上都有很高的热度,并且在实际使用中都表现出了很好的性能和稳定性。这些 API 网关都有丰富的功能,可以满足不同类型和规模的应用需求。以下是这五种 API 网关内核的详细介绍,包括它们的优缺点以及使用语言范围:

以下是分别针对 Nginx、Envoy、Traefik、Netty 和 Express.js 这五种内核选取的典型 API 网关的开源实现的详细介绍:

APISIX

APISIX 是基于 OpenResty 框架构建的高性能 API 网关。它利用 Nginx 作为核心代理服务器,并使用 Lua 脚本进行动态配置和请求/响应处理。APISIX 提供可扩展和可定制的解决方案,用于管理和路由 API 流量,使其成为构建现代微服务架构的理想选择。凭借其性能、灵活性和可扩展性,APISIX 使开发人员能够高效处理 API 请求并构建强大的 API 生态系统。提供了丰富的流量管理功能,如负载均衡、动态上游、灰度发布、服务熔断和限流等。

APISIX 提供了一系列功能,使其成为强大的 API 网关解决方案。以下是 APISIX 的一些主要特色功能:

  • API 管理:APISIX 通过提供 API 版本控制、速率限制、身份验证、请求/响应转换和请求/响应验证等功能,有效地管理 API。它使您能够控制和保护 API 流量。

  • 负载均衡:APISIX 支持各种负载均衡算法,如轮询、一致性哈希和最少连接。它将传入的请求分发到多个后端服务,以确保最佳性能和高可用性。

  • 动态路由:APISIX 提供动态路由功能,允许您根据路径、标头、查询参数或自定义条件定义灵活的路由规则。它使您能够根据特定条件轻松将请求路由到不同的后端服务。

  • 插件系统:APISIX 具有插件系统,允许您扩展其功能并自定义 API 网关的行为。它提供了各种插件,用于速率限制、JWT 身份验证、缓存、日志记录等功能。您还可以开发自己的自定义插件以满足特定需求。

  • 服务发现:APISIX 与 Consul 和 etcd 等服务发现机制集成,实现自动服务发现和注册。它根据后端服务的更改动态更新路由配置,确保与微服务架构的无缝集成。

  • 监控和分析:APISIX 提供内置的监控和分析功能,用于跟踪 API 性能、流量模式、错误率和其他指标。它与 Prometheus 和 Grafana 等流行的监控工具集成,使您能够深入了解 API 生态系统。

  • 可扩展性和高性能:APISIX 旨在处理大量的 API 流量,并具有低延迟。它利用 Nginx 和 Lua 脚本的性能优势,确保请求的快速和高效处理。

APISIX 提供了全面的功能集,用于管理、保护和优化 API 流量。它提供了灵活性、可扩展性和可扩展性,使其成为构建强大且高性能的 API 架构的理想选择。

Envoy 网关

Envoy 是一个由 Lyft 开发并开源的高性能 C++分布式代理,它被设计为单体应用的网络抽象,适用于服务网格、中间件和 API 网关。Envoy 的所有功能都构建在统一的、模块化的和可插拔的输入/输出过滤器链中。

以下是一些基于 Envoy 的 API 网关的主要特性:

  1. 动态配置:Envoy 支持动态配置,这意味着你可以在不重启 Envoy 的情况下,动态添加、修改或删除你的后端服务。

  2. 观察性:Envoy 提供了详细的度量标准和日志记录,这对于观察、监控和调试分布式系统至关重要。

  3. HTTP/2 和 gRPC 支持:Envoy 不仅支持 HTTP/2 作为客户端和服务器,而且还支持 gRPC。

  4. 负载均衡:Envoy 支持多种负载均衡策略,包括简单的轮询、最少请求、会话亲和性等。

  5. 服务发现和健康检查:Envoy 可以定期进行服务发现和健康检查,当后端服务的状态发生变化时,Envoy 可以自动更新其路由。

  6. 弹性和故障处理:Envoy 支持各种故障处理方式,包括超时、重试、熔断、限流等。

  7. 安全:Envoy 支持 TLS 和 HTTP/2,并允许强制执行各种安全策略。

基于 Envoy 的 API 网关有很多,其中最知名的可能是 Istio。Istio 是一个开源服务网格,它为微服务架构提供了流量管理、服务发现、负载均衡、故障恢复、指标收集、访问控制和认证等功能。Istio 使用 Envoy 作为数据平面,处理所有网络交互,并生成详细的遥测数据。

Traefik 网关

Traefik 是一个现代的 HTTP 反向代理和负载均衡器,它被设计为无缝地嵌入到现代的微服务架构中。以下是一些 Traefik 的主要特性:

  • 动态配置:Traefik 可以动态地从各种来源获取配置,包括 Kubernetes、Docker、Rancher、Consul、Etcd 等。当后端服务的状态发生变化时,Traefik 可以自动更新其路由。

  • 自动服务发现:Traefik 可以自动发现新的服务,并自动为它们创建路由。这意味着你不需要手动配置每一个服务。

  • 负载均衡:Traefik 支持多种负载均衡策略,包括 Round Robin、Least Connections 等。

  • HTTP/2 和 gRPC 支持:Traefik 支持 HTTP/2 和 gRPC,这使得它可以处理现代的互联网流量。

  • Let's Encrypt 支持:Traefik 内置了对 Let's Encrypt 的支持,可以自动为你的服务获取和更新 SSL 证书。

  • 中间件:Traefik 支持多种中间件,可以轻松地添加各种功能,如身份验证、重试、限流等。

  • 观察性:Traefik 提供了详细的度量标准和日志记录,这对于观察、监控和调试分布式系统至关重要。

  • 高可用性:Traefik 支持集群模式,可以确保在某个节点失败时,服务仍然可用。

  • 简单易用:Traefik 的设计目标之一就是简单易用。它的配置文件简洁明了,而且有一个友好的 Web UI,可以方便地查看和管理你的服务。

总的来说,Traefik 是一个强大而灵活的 API 网关,非常适合用于微服务架构。

Spring Cloud Gateway

Spring Cloud Gateway 是一个基于Spring Framework 5,Project Reactor 和 Spring Boot 2.0 的 API 网关。它旨在提供一种简单而有效的方式来路由到 API,并提供跨关切面的功能,例如:安全性,监控/指标和弹性。

然而,你要求的是一个基于 Netty 的 Spring Cloud Gateway 的详细介绍。这是因为 Spring Cloud Gateway 在底层使用了 Project Reactor 和 Netty。以下是一些关于这个主题的详细信息:

  • 基于 Netty:Netty 是一个异步的,事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Spring Cloud Gateway 使用 Netty 作为其网络层,提供高效的数据流和非阻塞 I/O。

  • 非阻塞 API:Spring Cloud Gateway 使用了 Project Reactor,这是一个完全非阻塞的响应式编程基础设施。它利用 Java 8 的函数式编程特性,使得开发者能够以声明式方式处理流式数据。

  • 动态路由:Spring Cloud Gateway 支持动态路由,即在不重启 Gateway 服务的情况下,动态添加、修改或删除路由规则。

  • 路由:Spring Cloud Gateway 提供了强大的路由功能。你可以通过配置文件或者代码定义路由规则,指定 ID,目标 URI,断言和过滤器列表。

  • 过滤器:Spring Cloud Gateway 提供了许多预定义的 GatewayFilter 工厂。例如,AddRequestHeader、PrefixPath、SetPath 等。你也可以自定义过滤器。

集成 Spring Cloud Discovery:Spring Cloud Gateway 可以与服务发现组件(如 Eureka)集成,实现自动路由到注册的服务。

  • 断路器和限流:Spring Cloud Gateway 支持 Netflix Hystrix 断路器和 Spring Cloud Gateway 自己的限流功能,可以很好地实现微服务的保护和控制。

  • 监控:Spring Cloud Gateway 也支持 Spring Boot Admin 和 Micrometer,可以集成 Prometheus 等监控工具,方便观察系统状态和性能。

  • 路由断言工厂:Spring Cloud Gateway 提供了多种断言工厂,如路径断言工厂、请求方法断言工厂、请求头断言工厂等,可以根据各种条件匹配路由。

  • 集成 Hystrix:Spring Cloud Gateway 集成了 Hystrix 断路器,可以对路由请求进行容错处理。

  • 限流:Spring Cloud Gateway 支持对路由请求进行限流,防止系统过载。

  • 安全:Spring Cloud Gateway 可以与 Spring Security 集成,提供强大的安全控制。

  • 观察性:Spring Cloud Gateway 可以与 Spring Boot Actuator 集成,提供详细的度量标准和健康检查。

  • 云原生:作为 Spring Cloud 生态系统的一部分,Spring Cloud Gateway 天然地支持云原生应用,可以与服务注册中心(如 Eureka)、配置中心(如 Config)等组件无缝集成。

Express Gateway

Express Gateway 是一个基于 Express.js 和 Node.js 的开源 API 网关。它可以作为微服务、Serverless、容器、移动应用等的 API 网关使用。Express Gateway 提供了 API 路由、请求转发、认证和授权、监控等功能。

以下是一些 Express Gateway 的主要特性:

  • 动态路由和请求转发:Express Gateway 支持动态路由,可以根据 URL、HTTP 方法、请求头等条件将请求转发到不同的后端服务。

  • 认证和授权:Express Gateway 支持多种认证和授权机制,如 OAuth 2.0、JWT、Key Auth 等。你可以通过插件扩展更多的认证和授权机制。

  • 限流和熔断:Express Gateway 支持对 API 请求进行限流,防止系统过载。它也支持熔断机制,当后端服务出现问题时,可以自动切断对该服务的请求,防止故障扩散。

  • 插件机制:Express Gateway 提供了插件机制,你可以开发自己的插件来扩展 Gateway 的功能。

  • 监控和日志:Express Gateway 可以记录详细的日志,方便进行问题排查。你也可以通过插件集成其他监控行工具,如 Prometheus、Grafana 等。

  • 性能:由于基于 Express.js 和 Node.js,Express Gateway 具有很高的性能,并且能够处理大量并发连接。

Express Gateway 是一个功能丰富、易于扩展的 API 网关,适合用于构建现代化的、基于微服务的应用。

各大云服务供应商 API 网关托管服务

以下是一个基于您的请求制作的各大云服务供应商 API 网关服务的比较表格。请注意,这是一个基本的比较,具体的功能和支持可能会因不同的服务级别和定制选项而有所不同。

注意:以上信息可能会随着各个服务提供商产品更新而改变,建议在选择具体产品时查阅最新的官方文档。

网关技术的发展趋势

随着微服务架构的广泛应用,API 网关的角色变得越来越重要。以下是一些主要的发展趋势:

  • 更强大的流量管理能力:微服务架构下的应用程序可能包含数十甚至数百个服务,每个服务都可能有自己的 API。这就需要 API 网关具有更强大的流量管理能力,以确保所有请求都能正确、高效地路由到目标服务。这包括支持复杂的路由规则、负载均衡、熔断机制等。

  • 更深入的安全集成:API 网关是应用程序的前门,是保护内部服务不受恶意访问的重要防线。因此,API 网关需要提供强大的安全功能,包括身份验证、授权、防止 SQL 注入和 XSS 攻击等。

  • 更好的性能:随着业务量的增长,API 网关需要处理的请求也在增加。因此,未来的 API 网关需要提供更低的延迟、更高的吞吐量,以满足性能需求。

  • 更丰富的协议支持:除了传统的 HTTP/REST API 外,现代应用程序还可能使用 gRPC、GraphQL 等新协议。因此,API 网关需要支持多种协议,以满足不同应用程序的需求。

云原生时代的 API 变化与诉求

在云原生时代,API 面临着新的挑战和需求。

  • 动态性:在云原生环境中,服务可能会频繁地启动和停止,服务的位置也可能会变化。因此,API 需要能够适应这种动态性,例如通过服务发现机制动态更新路由信息。

  • 可观察性:由于微服务架构的复杂性,需要通过 API 收集更多的运行时信息,以便进行监控和故障排查。这就需要 API 支持日志记录、跟踪、度量等可观察性功能。

  • 自动化:在云原生环境中,应用程序的部署和运维需要高度自动化。因此,API 的创建、发布、下线等过程也需要自动化,例如通过 CI/CD 流水线自动部署 API。

云原生时代的 API 规范

在云原生时代,由于技术的多样性和快速发展,可能会出现各自为政的问题。为了解决这个问题,社区正在努力制定统一的 API 规范。

  • 开放标准:开放标准是实现 API 统一的重要手段。例如,OpenAPI 规范定义了一种标准的、语言无关的接口,让人们可以在任何编程语言中发现和使用 API。gRPC 则提供了一种高性能、通用的 RPC 框架。

  • 接口描述语言:接口描述语言(IDL)可以帮助开发者定义和理解 API。例如,Protocol Buffers(Protobuf)是 Google 开发的一种数据序列化协议,它可以用于定义服务接口和消息类型。

  • 服务网格:服务网格是一种基础设施层,它可以提供统一的、平台无关的方式来管理、控制和监视服务之间的通信。例如,Istio 和 Linkerd 都提供了服务网格解决方案。

Gateway API

Gateway API 是由 Kubernetes SIG-Network 社区推动的一个项目。它的诞生源于对 Kubernetes 现有的 Ingress API 的一些限制的认识。Ingress API 是 Kubernetes 提供的一种服务暴露机制,但它的功能相对较为简单,很多复杂的路由、重定向、流量控制等场景无法满足。

因此,Kubernetes 社区开始探索一种新的 API 设计,旨在提供更加强大和灵活的服务暴露机制。这个新的 API 最初被称为 "Service APIs",后来在 2020 年底改名为 "Gateway API"。Gateway API 的设计目标是提供一种声明式 API,可以描述各种复杂的网络连接模型,包括各种路由、重定向、后端选择等。

Gateway API 和 Ingress 的差异

Gateway API 和 Ingress 的主要差异在于其功能的丰富性和灵活性。Ingress API 主要用于处理 HTTP 和 HTTPS 流量的基本路由,而 Gateway API 则旨在处理更复杂的网络用例。

以下是两者的主要区别:

  • 路由功能:Ingress 主要支持基于路径和主机名的路由,而 Gateway API 支持更多的匹配条件,如 HTTP header、请求参数等。

  • 协议支持:Ingress 主要支持 HTTP/HTTPS,而 Gateway API 则支持更多的协议,如 TCP、UDP 等。

  • 多网关支持:Ingress 通常只有一个全局配置,而 Gateway API 支持定义多个 Gateway,每个 Gateway 可以有自己的独立配置。

  • 跨命名空间的流量路由:Ingress 通常只能路由到同一命名空间下的服务,而 Gateway API 则支持跨命名空间的流量路由。

Gateway API 是 Kubernetes SIG-Network 社区推动的项目,其诞生和发展是为了解决 Ingress API 的局限性,并提供一种更强大、更灵活的服务暴露机制。在设计和实现过程中,社区积极收集和倾听用户和开发者的反馈,通过不断迭代和改进 API,使其更好地满足复杂的网络连接需求。然而,这是一个持续的过程,社区仍在努力解决各种技术挑战,以期 Gateway API 成为下一代 Kubernetes 网络接口标准。

为了让 Gateway API 得到广泛应用和支持,社区与各大云服务供应商和开源项目进行了合作。他们积极推动这些组织支持 Gateway API,并通过提供详尽的文档和示例来帮助用户和开发者理解和使用这个新的 API。这些努力已经取得了成果,目前包括 Istio、Contour、Gloo、Kong、APISIX 等在内的多个开源 API 网关已经开始支持 Gateway API。

Gateway API 的诞生是为了提供一个比 Ingress API 更强大、更灵活的服务暴露机制。尽管它仍在发展中,但已经得到了广泛的支持,并有望成为下一代 Kubernetes 网络接口标准。

云服务商对 Gateway API 的支持

以下是各大云服务供应商对 Gateway API 的支持情况的比较。

请注意,这些信息可能会随着各个服务提供商产品更新而改变,建议在选择具体产品时查阅最新的官方文档。

微服务、服务网格和 API 网关的未来

微服务、服务网格和 API 网关是现代应用架构的三个关键组成部分,它们之间存在密切的关联性,也与基础网络和基础设施有着重要的交互。

  1. 微服务是一种将单一应用程序划分为一组小的服务的架构风格,每个服务运行在其独立的进程中,服务之间通过网络进行通信。微服务架构使得系统具有更高的模块化,可以独立开发、部署和扩展单个服务,从而提高开发效率和系统的可扩展性。

  2. 服务网格是一种基础设施层,用于处理服务到服务的通信。在微服务架构中,由于服务数量众多、交互复杂,直接管理这些通信非常困难。服务网格通过提供一个统一的、可配置和可控的连接层来解决这个问题。服务网格可以实现负载均衡、故障恢复、身份验证和授权、以及可观察性等功能,从而极大地简化了微服务的管理和运维。

  3. API 网关是系统的入口,所有客户端的请求都会首先经过 API 网关。API 网关负责请求的路由、组合和转换,以及安全性、监控和限流等功能。API 网关对外提供一致的 API 接口,隐藏了后端微服务的复杂性。

在技术发展趋势方面,随着云原生和 DevOps 文化的推广,微服务、服务网格和 API 网关将更加普及。微服务将更加关注开发者体验和开发效率;服务网格将更加关注性能优化和易用性;API 网关将更加智能化,能够更好地管理和控制 API 的生命周期。

与基础网络和基础设施的关联方面,微服务、服务网格和 API 网关都需要在稳定、高效的基础网络和基础设施上运行。同时,随着网络技术如 SDN(软件定义网络)和 NFV(网络功能虚拟化)的发展,以及新技术如 eBPF(扩展伯克利包过滤器)的出现,将这些功能下沉到网络层,成为基础网络的一部分,可以提高性能和安全性,但同时也带来了新的挑战,如管理和监控的复杂性。

文档链接

以下是您所提到的各类开源项目的官方文档链接:

API 网关

以下是这些开源 API 网关的社区文档链接:

发布于: 刚刚阅读数: 5
用户头像

深蓝

关注

还未添加个人签名 2018-08-28 加入

还未添加个人简介

评论

发布
暂无评论
云上应用技术架构-API网关_深蓝_InfoQ写作社区