服务网关
基本介绍
Spring Cloud Gateway
Spring Cloud Gateway
是 Spring Cloud
团队为云服务生态系统构建的API网关。
Spring Cloud Gateway
旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标,限流等。
微服务的应用可能部署在不同机房,不同地区,不同域名下。此时客户端(浏览器/手机/软件工具)想 要请求对应的服务,都需要知道机器的具体 IP 或者域名 URL,当微服务实例众多时,这是非常难以记忆的,对 于客户端来说也太复杂难以维护。 此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识 解析判断出具体的微服务地址,再把请求转发到微服务实例。这其中的记忆功能就全部交由网关来操作了。
核心设计
路由(Route)
路由是网关最基础的部分,路由信息由 ID、目标 URI、一组断言和一组过滤器组成。如果断言 路由为真,则说明请求的 URI 和配置匹配。
断言(Predicate)
Spring Cloud Gateway
中的断言函数输入类型是 Spring 5.x
框架中的 ServerWebExchange
。
Spring Cloud Gateway
中的断言函数允许开发者去定义匹配来自于 Http Request
中的任 何信息,比如请求头和参数等。
过滤器(Filter)
Spring Cloud Gateway
中的 Filter 分为两种类型,分别是 Gateway Filter
和 Global Filter
。过滤器将会对请求和响应进行处理。
使用方式
本章主要是讲述 Spring Cloud Gateway
基础用法,详细以及进阶内容请参考官方文档
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
路由配置
WARNING
StripPrefix=1
配置,表示网关转发到业务模块时候会自动截取前缀。
spring:
application:
name: wemirr-platform-gateway
cloud:
gateway:
enabled: true
discovery:
locator:
enabled: true
lowerCaseServiceId: true
routes:
- id: wemirr-platform-authority
uri: lb://wemirr-platform-authority
predicates:
- Path=/authority/**
filters:
# 黑白名单过滤器
- name: BlackWhiteList
args:
type: BLACK_LIST
ip-list: 127.0.0.1,0:0:0:0:0:0:0:1
ignore-intranet: true
# 限流过滤器
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 100 # 允许用户每秒处理多少个请求
redis-rate-limiter.burstCapacity: 100 # 令牌桶的容量,允许在一秒钟内完成的最大请求数
# 使用 IP 限流策略(使用 SpEL 按名称引用 bean)
key-resolver: "#{@ipKeyResolver}"
- StripPrefix=1
- PreserveHostHeader
# 重试
- name: Retry
args:
retries: 1
statuses: BAD_GATEWAY
backoff:
firstBackoff: 200ms
maxBackoff: 500ms
factor: 1
basedOnPreviousValue: false
exceptions: TimeoutException
提示
目前已经存在 wemirr-platform-gateway
网关服务,用于路由转发、异常处理、限流、降级、接口、鉴权等等。
路由规则
Spring Cloud Gateway
创建 Route
对象时, 使用RoutePredicateFactory
创建Predicate
对象,Predicate
对象可以赋值给Route
。
- Spring Cloud Gateway包含许多内置的Route Predicate Factories。
- 所有这些断言都匹配 HTTP 请求的不同属性。
- 多个Route Predicate Factories可以通过逻辑与(and)结合起来一起使用。
路由断言工厂RoutePredicateFactory
包含的主要实现类如图所示,包括Datetime
、请求的远端地址、路由权重、请求头、Host 地址、请求方法、请求路径和请求参数等类型的路由断言。