Gateway:Spring Cloud API网关组件
Gateway:Spring Cloud API网关组件
问题总结
- API网关?
- Spring Cloud Gateway?
- GateWay的工作流程?(重点)
- Predicate断言?
- Filter过滤器?
问题答案
- API网关
- 优点:
- 客户端只需要维护API网关地址即可,不用维护大量的服务地址,简化了客户端开发。
- 客户端直接与API网关通信,能够减少客户端与各个服务的交互次数。
- 客户端与后端的服务耦合度降低。
- 节省流量,提升性能,提升用户体验。
- API网关还提供了安全、流控、过滤、计费以及监控等功能。
- Spring Cloud GateWay
核心概念 | 描述 |
---|---|
Route(路由) | 网关最基本的模块。它由一个ID、一个目标URI、一组断言(Predicate)和一组过滤器(Filter)组成。 |
Predicate(断言) | 路由转发的判断条件,通过Predicate对HTTP请求进行匹配,例如请求方式、请求路径、请求头、参数等。 |
Filter(过滤器) | 对请求进行拦截和修改,对上文的响应进行再处理。 |
- GateWay的特征
- 能够在任意请求属性上匹配路由。
- predicates和filters是特定于路由的。
- 集成了Hystrix熔断器。
- 能够限制请求频率。
- 能够重写请求路径。
- GateWay的工作流程(重点)
-
Spring Cloud GateWay工作流程
- 客户端将请求发送到 GateWay 上。
- GateWay 通过 GateWay Handler Mapping 找到与请求相匹配的路由,将其发送给GateWay Web Handler。
- Gateway Web Handler 通过指定的过滤器链(Filter Chain),将请求转发到实际的服务节点中,执行业务逻辑返回响应结果。
- 过滤器之间用虚线分开是因为过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑。
- 过滤器(Filter)可以在响应返回客户端之前,对响应进行拦截和再处理,例如参数校验、权限校验、流量控制、日志输出以及协议转换等。
- 过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量控制等。
- 响应原路返回给客户端。
- Predicate断言
Predicate是路由转发的判断条件,请求只有满足了Predicate的条件,才会被转发到指定的服务上进行处理。
- Route路由与Predicate断言的对应关系为 ”一对多“ ,一个路由可以有多个断言。
- 一个请求想要转发到对应的路由上,就必须同时匹配路由上的所有断言。
- 当一个请求满足多个路由的断言时,会转发给第一个匹配的路由。
断言 | 示例 | 说明 |
---|---|---|
Path | - Path=/dept/list/** | 当请求路径与/dept/list/**匹配时,该请求才能转发到 http://localhost:8080 上。 |
Before | - Before=2021-10-20T11:47:34.255+08:00[Asia/Shanghai] | 在 2021 年 10 月 20 日 11 时 47 分 34.255 秒之前的请求,才会被转发到 http://localhost:8001 上。 |
After | - After=2021-10-20T11:47:34.255+08:00[Asia/Shanghai] | 在 2021 年 10 月 20 日 11 时 47 分 34.255 秒之后的请求,才会被转发到 http://localhost:8001 上。 |
Between | - Between=2021-10-20T15:18:33.226+08:00[Asia/Shanghai],2021-10-20T15:23:33.226+08:00[Asia/Shanghai] | 在 2021 年 10 月 20 日 15 时 18 分 33.226 秒 到 2021 年 10 月 20 日 15 时 23 分 33.226 秒之间的请求,才会被转发到 http://localhost:8001 服务器上。 |
Cookie | - Cookie=name,c.biancheng.net | 携带 Cookie 且 Cookie 的内容为 name=c.biancheng.net 的请求,才会被转发到 http://localhost:8001 上。 |
Header | - Header=X-Request-Id,\d+ | 请求头上携带属性 X-Request-Id 且属性值为整数的请求,才会被转发到 http://localhost:8001 上。 |
Method | - Method=GET | 只有 GET 请求才会被转发到 http://localhost:8001 上。 |
- Filter过滤器
服务端提供服务通常需要一定的校验逻辑,如用户登录状态校验,签名校验等。(写入网关中)
过滤器类型 | 说明 |
---|---|
Pre类型 | 这种过滤器在请求被转发到微服务之前可以对请求进行拦截和修改, 如参数校验、权限校验、流量监控、日志输出以及协议转换等操作。 |
Post类型 | 这种过滤器在微服务对请求做出响应后可以对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。 |
- GateWayFilter:应用在单个路由或者一组路由上。
- GlobalFilter:应用在所有的路由上的过滤器。
Spring Cloud GateWay 内置了31种GateWayFilter,以下举例。
路由过滤器 | 描述 | 参数 | 使用示例 |
---|---|---|---|
AddRequestHeader | 拦截传入的请求,并在请求上添加一个指定的请求头参数。 | name:需要添加的请求头参数的 key; value:需要添加的请求头参数的 value。 | - AddRequestHeader=my-request-header,1024 |
AddRequestParameter | 拦截传入的请求,并在请求上添加一个指定的请求参数。 | name:需要添加的请求参数的 key; value:需要添加的请求参数的 value。 | - AddRequestParameter=my-request-param,c.biancheng.net |
AddResponseHeader | 拦截响应,并在响应上添加一个指定的响应头参数。 | name:需要添加的响应头的 key; value:需要添加的响应头的 value。 | - AddResponseHeader=my-response-header,c.biancheng.net |
PrefixPath | 拦截传入的请求,并在请求路径增加一个指定的前缀。 | prefix:需要增加的路径前缀。 | - PrefixPath=/consumer |
PreserveHostHeader | 转发请求时,保持客户端的 Host 信息不变,然后将它传递到提供具体服务的微服务中。 | 无 | - PreserveHostHeader |
RemoveRequestHeader | 移除请求头中指定的参数。 | name:需要移除的请求头的 key。 | - RemoveRequestHeader=my-request-header |
RemoveResponseHeader | 移除响应头中指定的参数。 | name:需要移除的响应头。 | - RemoveResponseHeader=my-response-header |
RemoveRequestParameter | 移除指定的请求参数。 | name:需要移除的请求参数。 | - RemoveRequestParameter=my-request-param |
RequestSize | 配置请求体的大小,当请求体过大时,将会返回 413 Payload Too Large。 | maxSize:请求体的大小。 | - name: RequestSize args: maxSize: 5000000 |
GlobalFilter是一种作用于所有路由上的全局过滤器,可以实现一些统一化的业务功能,如权限认证、IP访问限制。