网关
2024-12-25 22:12:16 0 举报
AI智能生成
网关知识点
作者其他创作
大纲/内容
作用
性能:API高可用,负载均衡,容错机制。
安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
缓存:数据缓存。
监控:记录请求响应数据,api耗时分析,性能监控。
限流:流量控制,错峰流控,可以定义多种限流规则。
灰度:线上灰度部署,可以减小风险。
路由:动态路由规则。
安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
缓存:数据缓存。
监控:记录请求响应数据,api耗时分析,性能监控。
限流:流量控制,错峰流控,可以定义多种限流规则。
灰度:线上灰度部署,可以减小风险。
路由:动态路由规则。
常见网关
OpenResty
Nginx + Lua
Kong
配置简单,提供付费插件
Zuul
性能相对不是很高
Spring Cloud Gateway
性能高
Spring Cloud Gateway
Route路由
包含ID、目标Uri、断言、过滤器
当前请求到达网关时,会通过gateway handler mapping
当前请求到达网关时,会通过gateway handler mapping
断言
基于断言进行路由匹配
当断言为true时,匹配到路由进行转发
当断言为true时,匹配到路由进行转发
配置
简化配置
这两个参数分别是 Cookie 名称 “mycookie” 以及要与之匹配的值 “mycookievalue”
全部配置
包含一个name和args
args中name为参数名、regexp为参数匹配值
args中name为参数名、regexp为参数匹配值
路由断言工厂
在…… 之后
predicates:
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
匹配该时间之后的请求
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
匹配该时间之后的请求
在...... 之前
predicates:
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
匹配该时间之前的请求
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
匹配该时间之前的请求
在...... 之间
predicates:
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
匹配该时间段之间的请求
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
匹配该时间段之间的请求
匹配Cookie
predicates:
- Cookie=chocolate, ch.p
名为 “chocolate” 的 Cookie,其值与 “ch.p” 这个正则表达式相匹配
- Cookie=chocolate, ch.p
名为 “chocolate” 的 Cookie,其值与 “ch.p” 这个正则表达式相匹配
匹配请求头
predicates:
- Header=X-Request-Id, \d+
请求包含一个名为 “X-Request-Id” 的头部,且其值与 “\d+” 这个正则表达式相匹配(也就是说,其值是一个或多个数字),那么此路由就会匹配
- Header=X-Request-Id, \d+
请求包含一个名为 “X-Request-Id” 的头部,且其值与 “\d+” 这个正则表达式相匹配(也就是说,其值是一个或多个数字),那么此路由就会匹配
匹配Host
predicates:
- Host=**.somehost.org,**.anotherhost.org
如果请求包含一个 “Host” 头部,其值为 “www.somehost.org” 或 “beta.somehost.org” 或 “www.anotherhost.org”
- Host=**.somehost.org,**.anotherhost.org
如果请求包含一个 “Host” 头部,其值为 “www.somehost.org” 或 “beta.somehost.org” 或 “www.anotherhost.org”
匹配方法
predicates:
- Method=GET,POST
Get和Host方法
- Method=GET,POST
Get和Host方法
匹配路径
predicates:
- Path=/red/{segment},/blue/{segment}
例如: /red/1 or /red/blue or /blue/green.
- Path=/red/{segment},/blue/{segment}
例如: /red/1 or /red/blue or /blue/green.
匹配查询参数
predicates:
- Query=green
请求中包含“green”请求参数
- Query=green
请求中包含“green”请求参数
predicates:
- Query=red, gree.
请求中包含“red”请求参数,值匹配到gree.,比如greer, green
- Query=red, gree.
请求中包含“red”请求参数,值匹配到gree.,比如greer, green
匹配远程地址
predicates:
- RemoteAddr=192.168.1.1/24
比如:192.168.1.10
- RemoteAddr=192.168.1.1/24
比如:192.168.1.10
过滤器
可以在请求发出的前后进行一些业务上的处理,比如授权、埋点、限流等。
可分为前置处理器、后置处理器 PreFilter/PostFilter
过滤器内可以进行:授权认证、限流、更改请求报文
可分为前置处理器、后置处理器 PreFilter/PostFilter
过滤器内可以进行:授权认证、限流、更改请求报文
过滤工厂
增加请求头
转发请求后,会在请求头上添加参数::::X-Request-red:blue
转发请求后,会在请求头上添加参数::::X-Request-red:blue
不存在时添加请求头
支持添加一组请求头参数与值
只有当请求头参数不存在时,再添加
只有当请求头参数不存在时,再添加
增加请求参数
添加请求参数:red=blue
增加响应头
增加响应头部,X-Response-Red:Blue
断路器过滤
自定义断路器myCircuitBreaker
熔断后服务降级
降级的服务不再同一个应用里面,转向另一个应用
根据状态触发熔断如果后端服务
缓存请求体
只能是http或者https请求中
响应头去重
响应头去重
添加异常响应
将后台服务的异常返回到客户端
JSON转成gRpc
不支持流的转换
本地缓存响应
1、它只能缓存无请求体的 GET 请求。
2、它仅针对以下状态码之一的响应进行缓存:HTTP 200(正常)、HTTP 206(部分内容)或 HTTP 301(永久移动)。
3、如果 “Cache-Control” 头部不允许缓存(请求中存在 “no-store” 或者响应中存在 “no-store” 或 “private”),则不会对响应数据进行缓存。
4、如果响应已被缓存,且新请求的 “Cache-Control” 头部中带有 “no-cache” 值,那么它将返回一个无响应体的 HTTP 304(未修改)响应。
此过滤器会针对每条路由配置本地响应缓存,并且只有在启用了 “spring.cloud.gateway.filter.local-response-cache.enabled” 属性时才可用。
此外,全局配置的本地响应缓存也可作为一项功能来使用。
它接受第一个参数用于覆盖缓存条目的过期时间(以 “s” 表示秒、“m” 表示分钟、“h” 表示小时),
接受第二个参数用于设置此路由缓存的最大容量,以便在缓存达到该容量时清除相应条目(单位为 KB、MB 或 GB)
要启用此功能,需将 “com.github.ben-manes.caffeine:caffeine” 以及 “spring-boot-starter-cache” 添加为项目依赖项。
2、它仅针对以下状态码之一的响应进行缓存:HTTP 200(正常)、HTTP 206(部分内容)或 HTTP 301(永久移动)。
3、如果 “Cache-Control” 头部不允许缓存(请求中存在 “no-store” 或者响应中存在 “no-store” 或 “private”),则不会对响应数据进行缓存。
4、如果响应已被缓存,且新请求的 “Cache-Control” 头部中带有 “no-cache” 值,那么它将返回一个无响应体的 HTTP 304(未修改)响应。
此过滤器会针对每条路由配置本地响应缓存,并且只有在启用了 “spring.cloud.gateway.filter.local-response-cache.enabled” 属性时才可用。
此外,全局配置的本地响应缓存也可作为一项功能来使用。
它接受第一个参数用于覆盖缓存条目的过期时间(以 “s” 表示秒、“m” 表示分钟、“h” 表示小时),
接受第二个参数用于设置此路由缓存的最大容量,以便在缓存达到该容量时清除相应条目(单位为 KB、MB 或 GB)
要启用此功能,需将 “com.github.ben-manes.caffeine:caffeine” 以及 “spring-boot-starter-cache” 添加为项目依赖项。
请求头映射换
将请求头中Blue的值,添加到X-Request-Red中,传递给下游的请求
更换请求体内容
只能通过Java DSL的方式进行配置
更换响应体内容
只能通过Java DSL的方式进行配置
请求路径前缀
这会将 “/mypath” 作为前缀添加到所有匹配请求的路径上。因此,发往 “/hello” 的请求会被发送至 “/mypath/hello”
保留请求头主机信息
目标地址接收到的请求就是带着原始主机头信息的请求
重定向
当此路由器起作用时,会返回一个302的状态码,通知客户端重新定向到https://acme.org这个地址
有三个参数:
status:状态码
url:重定向的地址
includeRequestParams:重定向的地址是否带参数
有三个参数:
status:状态码
url:重定向的地址
includeRequestParams:重定向的地址是否带参数
移除返回JSOn体中的属性
会在返回体顶层中移除id和color两个属性
如果配置成“id,color,true”,这样会将所有的id和color属性都移除,子实体中的id和color属性也会移除
如果配置成“id,color,true”,这样会将所有的id和color属性都移除,子实体中的id和color属性也会移除
移除请求头
会移除X-Request-Foo属性,再将请求发送到下游
移除请求参数
会移除red参数,再将请求发送到下游
移除响应头
移除返回的响应头,再将结果转发给客户端
可以在default-filter中配置一次,所有路由都起作用
可以在default-filter中配置一次,所有路由都起作用
请求头的大小限制:- RequestHeaderSize=1000B,如果任何一个请求的头部大小超过固定大小,会返回状态码431
(1)请求次数限制:用于限制1s多少请求
不适用于简化的配置,比如:
# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
(2)redis请求次数限制
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
不适用于简化的配置,比如:
# INVALID SHORTCUT CONFIGURATION
spring.cloud.gateway.routes[0].filters[0]=RequestRateLimiter=2, 2, #{@userkeyresolver}
(2)redis请求次数限制
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
redis-rate-limiter.requestedTokens: 1
修改响应头中的Location字段的值
filters:
- RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
filters:
- RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
路径重写:
filters:
- RewritePath=/red/?(?<segment>.*), /$\{segment}
对于请求路径 “/red/blue”,在向下游发起请求之前,此操作会将路径设置为 “/blue”。请注意,由于 YAML 规范的要求,
这里的 “$” 应该替换为 “$\”。
filters:
- RewritePath=/red/?(?<segment>.*), /$\{segment}
对于请求路径 “/red/blue”,在向下游发起请求之前,此操作会将路径设置为 “/blue”。请注意,由于 YAML 规范的要求,
这里的 “$” 应该替换为 “$\”。
重写请求参数值
filters:
- RewriteRequestParameter=campaign,fall2023
比如一个请求/products?campaign=old,将会被改为campaign=fall2023.
filters:
- RewriteRequestParameter=campaign,fall2023
比如一个请求/products?campaign=old,将会被改为campaign=fall2023.
重写响应头
filters:
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
filters:
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
保存会话信息
filters:
- SaveSession
filters:
- SaveSession
安全头部网关过滤器
filters:
- name: SecureHeaders
args:
# 以下是一些可配置的参数示例
content - security - policy: "default - src 'self'"
x - frame - options: DENY
strict - transport - security: max - age = 31536000; includeSubDomains
这些安全头部信息对于增强应用程序的安全性至关重要,例如防止跨站脚本攻击(XSS)、点击劫持(Click - Jacking)
等多种常见的网络安全威胁。
禁用的配置:spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transport-security
禁用使用全称的全小写
filters:
- name: SecureHeaders
args:
# 以下是一些可配置的参数示例
content - security - policy: "default - src 'self'"
x - frame - options: DENY
strict - transport - security: max - age = 31536000; includeSubDomains
这些安全头部信息对于增强应用程序的安全性至关重要,例如防止跨站脚本攻击(XSS)、点击劫持(Click - Jacking)
等多种常见的网络安全威胁。
禁用的配置:spring.cloud.gateway.filter.secure-headers.disable=x-frame-options,strict-transport-security
禁用使用全称的全小写
修改请求头部
filters:
- SetRequestHeader=X-Request-Red, Blue
将X-Request-Red的值修改为Blue
filters:
- SetRequestHeader=X-Request-Red, Blue
将X-Request-Red的值修改为Blue
修改响应头部:
filters:
- SetResponseHeader=X-Response-Red, Blue
filters:
- SetResponseHeader=X-Response-Red, Blue
设置状态
filters:
- SetStatus=401
返回客户端状态码:401
filters:
- SetStatus=401
返回客户端状态码:401
去除前缀
filters:
- StripPrefix=2
当通过网关向 “/name/blue/red” 发起请求时,发送到名称服务(nameservice)的请求看起来就像是 “nameservice/red”
filters:
- StripPrefix=2
当通过网关向 “/name/blue/red” 发起请求时,发送到名称服务(nameservice)的请求看起来就像是 “nameservice/red”
重试
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
methods: GET,POST
backoff:
firstBackoff: 10ms
maxBackoff: 50ms
factor: 2
basedOnPreviousValue: false
filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
methods: GET,POST
backoff:
firstBackoff: 10ms
maxBackoff: 50ms
factor: 2
basedOnPreviousValue: false
请求大小
filters:
- name: RequestSize
args:
maxSize: 5000000
默认的单位是B,可以设置为KB或者MB
filters:
- name: RequestSize
args:
maxSize: 5000000
默认的单位是B,可以设置为KB或者MB
重写主机请求头,可以用指定的值替换现有的主机请求头
filters:
- name: SetRequestHostHeader
args:
host: example.org
用这个请求头example.org,替换原始的Host
filters:
- name: SetRequestHostHeader
args:
host: example.org
用这个请求头example.org,替换原始的Host
令牌中继
filters:
- TokenRelay=
令牌中继(Token Relay)指的是 OAuth2 客户端充当一个代理角色,将接收到的令牌转发到对外发出的资源请求中
filters:
- TokenRelay=
令牌中继(Token Relay)指的是 OAuth2 客户端充当一个代理角色,将接收到的令牌转发到对外发出的资源请求中
默认过滤器
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
要添加一个过滤器并将其应用到所有路由上,你可以使用 “spring.cloud.gateway.default-filters”(Spring Cloud 网关默认过滤器)。
该属性接收一个过滤器列表
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
- PrefixPath=/httpbin
要添加一个过滤器并将其应用到所有路由上,你可以使用 “spring.cloud.gateway.default-filters”(Spring Cloud 网关默认过滤器)。
该属性接收一个过滤器列表
全局过滤器
作用于所有的路由
支持设定过滤器的优先级
用于指标收集
响应缓存,需要开启
转发路由过滤器
Netty 路由
Netty写响应
响应式负载均衡客户端过滤器
WebSocket 路由过滤器
“已路由”标记
http头部过滤器
转发表头
移除标头过滤器
X 转发标头过滤器
TLS 和SSL
支持https请求转发
支持https请求转发
信任所有的下游证书
配置信任的已知证书
TLS超时配置
流程
属性路由定义定位器
目前还不存在路由到redis、MongoDB等配置,新的版本中可能添加
目前还不存在路由到redis、MongoDB等配置,新的版本中可能添加
路由器指标
超时配置
全局的配置
connect-timeout
连接超时时间,单位毫秒
连接超时时间,单位毫秒
response-timeout
响应超时时间,要写明单位
响应超时时间,要写明单位
单个路由器配置
connect-timeout连接超时时间,单位毫秒
response-timeout响应时间,单位毫秒
值为-1时,不设置响应时间
值为-1时,不设置响应时间
流式JavaAPI
断言中支持and、or、negate
服务发现
DiscoveryClient Route Definition Locator
DiscoveryClient Route Definition Locator
对自动发现服务起到作用
支持根据服务名配置路由
为负载均衡提供基础
例子
响应式Netty日志配置
响应式Netty
请求记录
响应记录
故障排查与性能分析
日志格式与配置灵活性
跨域配置
全局跨域配置
单个路由配置
路由器监视
故障排渣
前编译和原生镜像支持
附录
属性配置
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/appendix.html
0 条评论
下一页