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