9.1 API 网关
API 网关本身也是一个服务。作为一种微服务的统一入口,API 网关不仅为客户端提供接口,而且还增加了一些功能,如权限管理、指标监控、限流、降级、缓存及负载均衡等。简而言之,网关为客户端提供统一的访问入口,并做一些非业务的逻辑处理。
9.1.1 网关简介
当前常见的 API 主要有基于 OpenResty 的 Kong、基于 Go 语言开发的 Tyk、基于 Netflix 开源的 Zuul 及 Spring Cloud 出品的 Spring Cloud 网关。本节主要介绍 Spring Cloud 网关。
API 网关作为业务网关,可以定制与扩展,一般包含以下功能和特性:
- 性能:具有高可用、负载均衡和容错机制等特性。
- 安全:提供权限认证。
- 全链路日志:可以进行全链路调用系统分析。
- 缓存:返回数据缓存。
- 监控:进行 QPS 和响应时间等的信息监控。
- 限流:进行流量限流控制。
- 降级:进行系统降级与熔断。
- 路由:提供动态路由规则。
Spring Cloud 网关提供了一个基于 Spring 5、Spring Boot 2.x 和 Project Reactor 等技术的 API 网关,旨在为微服务架构提供一种简单、有效的方式对接口进行路由调用,并提供安全、监控、埋点和限流等方面的功能。Spring Cloud 网关是基于 Spring WebFlux 框架实现的,而 Spring WebFlux 框架的底层是基于 Reactor 模式的 Netty 框架。
Spring Cloud 网关的主要特性如下:
- 基于 Spring 5、Spring Boot 2.x 及 Project Reactor 进行架构。
- 集成 Hystrix 断路器。
- 集成服务发现。
- 集成 Actuator API。
- 提供动态路由规则。
- 可以进行限流。
- 提供 Predicates 和 Filters 规则。
下面介绍 Spring Cloud 网关中的 3 个重要概念。
- Route(路由):Spring Cloud 网关的基本组成模块。Route 模块是由一个 ID、目标 URI、一组断言和一组过滤器来定义的,如果断言为真,则路由匹配,目标 URI 就会被访问。
- Predicate(断言):从 Java 8 以后提供了断言函数。Spring Cloud 网关中的断言函数的输入类型是 ServerWebExchange,该函数允许开发者定义来自于 HTTP 请求中的任何信息,如请求头和参数等。
- Filter(过滤器):Spring Framework GatewayFilter 的实例,由特定工厂生成,可以对请求和响应进行修改。
Spring Cloud 网关的架构如图 9.1 所示。
图 9.1 Spring Cloud 网关的架构
从图 9.1 中可以看到,客户端首先向 Spring Cloud 网关发出请求,然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送给 Gateway Web Handler 进行处理,Gateway Web Handler 再通过指定的 Filter Chain 将请求发送给代理服务执行业务逻辑,最终将结果返回。过滤器可能会在发送代理服务之前(pre)或之后(post)执行过滤逻辑。
9.1.2 网关示例
配置断言与过滤器一般有两种方式,一种是快捷方式,另一种是全展开参数方式。下面分别给出两种官方示例。
下面的例子使用快捷方式定义一个 Cookie 断言,其中有两个参数,表示 Cookie 名称的是 mycookie, Cookie 的值为 mycookievalue。
spring: cloud: gateway: routes: -id: after_route uri: https://example.org predicates: -Cookie=mycookie,mycookievalue
下面的例子使用全展开参数的方式配置断言,其类似于标准的 YAML 配置方式。本例提供了 name key 和 args key,其中,args key 的值是一个 map 类型的参数。
spring: cloud: gateway: routes: -id: after_route uri: https://example.org predicates: -name: Cookie args: name: mycookie regexp: mycookievalue
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论