介绍和使用场景
Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关,它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中,Filter 扮演着非常重要的角色,以下是 Filter 的一些主要作用:
-
请求路由:Filter 可以根据请求的特定条件(如路径、头信息、参数等)将请求路由到不同的服务。
-
请求修改:在请求被路由到目标服务之前,Filter 可以修改请求的内容,比如添加或删除请求头、修改请求参数等。
-
响应修改:Filter 可以在将响应返回给客户端之前修改响应的内容,比如添加或删除响应头、修改响应体等。
-
身份验证和授权:Filter 可以用于实现安全控制,比如检查请求中的认证信息,确保只有授权的用户才能访问特定的资源。
-
限流和熔断:Filter 可以实现限流功能,控制对特定服务的访问频率,以及熔断机制,防止服务过载。
-
日志记录和监控:Filter 可以在请求和响应的生命周期中记录日志,用于监控和调试。
-
请求聚合:Filter 可以将多个微服务的响应聚合到一个响应中,实现数据的聚合和重组。
-
错误处理:Filter 可以捕获和处理请求处理过程中的错误,返回给客户端统一的错误响应。
-
跨域资源共享(CORS):Filter 可以处理跨域请求,添加必要的响应头,以支持前端应用的跨域请求。
-
缓存控制:Filter 可以实现缓存机制,减少对后端服务的请求,提高系统性能。
常见gateway的filter
spring gateway的filter 包路径org.springframework.cloud.gateway.filter
-
Built-in Filter Factories(内置过滤器工厂):Spring Cloud Gateway 提供了一系列内置的过滤器工厂,这些工厂可以用来实现常见的功能,如请求头修改、路径重写等。这些过滤器工厂是预定义的,可以直接在配置中使用。
-
Custom Filters(自定义过滤器):除了内置的过滤器工厂,Spring Cloud Gateway 还支持自定义过滤器的开发。开发者可以根据自己的需求实现特定的逻辑,比如添加认证、日志记录等。
-
Pre-filter(前置过滤器):在路由到微服务之前执行的过滤器。这类过滤器通常用于修改请求头、认证、日志记录等。
-
Post-filter(后置过滤器):在路由到微服务之后执行的过滤器。这类过滤器可以用于修改响应头、日志记录等。
-
Global Filter(全局过滤器):全局过滤器会对所有的路由请求生效,通常用于实现跨域资源共享(CORS)等全局性的功能。
-
Route Filter(路由过滤器):与特定路由关联的过滤器,用于处理特定路由的请求和响应
1. AddRequestHeader
这个 Filter
用于在请求中添加一个 HTTP 头。
filters:
- AddRequestHeader=X-Request-Foo, Bar
这会在请求中添加一个名为 X-Request-Foo
的头,其值为 Bar
。
2. AddRequestParameter
这个 Filter
用于在请求中添加一个查询参数。
filters:
- AddRequestParameter=foo, bar
这会在请求中添加一个名为 foo
的查询参数,其值为 bar
。
3. AddResponseHeader
这个 Filter
用于在响应中添加一个 HTTP 头。
filters:
- AddResponseHeader=X-Response-Foo, Bar
这会在响应中添加一个名为 X-Response-Foo
的头,其值为 Bar
。
4. DedupeResponseHeader
这个 Filter
用于在响应中删除重复的 HTTP 头。
filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
这会删除响应中重复的 Access-Control-Allow-Credentials
和 Access-Control-Allow-Origin
头。
5. PrefixPath
这个 Filter
用于在请求路径前添加一个前缀。
filters:
- PrefixPath=/mypath
这会在请求路径前添加 /mypath
前缀。
6. PreserveHostHeader
这个 Filter
用于保留原始请求的主机头。
filters:
- PreserveHostHeader
7. RequestRateLimiter
这个 Filter
用于限制请求速率。
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
这会使用 Redis 来限制请求速率。
8. RewritePath
这个 Filter
用于重写请求路径。
filters:
- RewritePath=/foo/(?<segment>.*), /$\{segment}
这会将 /foo/bar
重写为 /bar
。
9. SetPath
这个 Filter
用于设置请求路径。
filters:
- SetPath=/{segment}
这会将请求路径设置为 /segment
。
10. SetRequestHeader
这个 Filter
用于设置请求头。
filters:
- SetRequestHeader=X-Request-Foo, Bar
这会将请求头 X-Request-Foo
设置为 Bar
。
11. SetResponseHeader
这个 Filter
用于设置响应头。
filters:
- SetResponseHeader=X-Response-Foo, Bar
这会将响应头 X-Response-Foo
设置为 Bar
。
12. StripPrefix
这个 Filter
用于去除请求路径的前缀。
filters:
- StripPrefix=1
这会去除请求路径的第一个前缀。
13. Retry
这个 Filter
用于重试请求。
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
这会在请求失败时重试 3 次。
14. RequestSize
这个 Filter
用于限制请求的大小。
filters:
- name: RequestSize
args:
maxSize: 5000000
这会限制请求的大小为 5MB。
15. ModifyRequestBody
这个 Filter
用于修改请求体。
filters:
- name: ModifyRequestBody
args:
contentType: "application/json"
rewriteFunction: "com.example.RewriteRequestBody::rewrite"
这会使用自定义的 rewrite
方法来修改请求体。
16. ModifyResponseBody
这个 Filter
用于修改响应体。
filters:
- name: ModifyResponseBody
args:
contentType: "application/json"
rewriteFunction: "com.example.RewriteResponseBody::rewrite"
这会使用自定义的 rewrite
方法来修改响应体。
17. SecureHeaders
这个 Filter
用于添加安全相关的响应头。
filters:
- SecureHeaders
这会添加一些安全相关的响应头,如 X-XSS-Protection
、X-Frame-Options
等。
18. FallbackHeaders
这个 Filter
用于在发生错误时添加响应头。
filters:
- FallbackHeaders
这会在发生错误时添加一些响应头。
19. RequestHeaderToRequestUri
这个 Filter
用于将请求头转换为请求 URI。
filters:
- RequestHeaderToRequestUri=X-CF-Forwarded-Url
这会将 X-CF-Forwarded-Url
头的内容转换为请求 URI。
20. SetStatus
这个 Filter
用于设置响应状态码。
filters:
- SetStatus=401
这会将响应状态码设置为 401。