0、Gateway基本知识
Gateway 是在 Spring 生态系统之上构建的 API 网关服务,基于 Spring ,Spring Boot 和 Project Reactor 等技术。
Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,以及提供一些强大的过滤器功能,例如∶熔断、限流、重试等。
官网:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
先认识网关:
在没有网关服务之前:
有了网关服务之后:
网关服务核心功能
统一调用接口
- 对外提供统一入口,根据请求URL路径转发到对应的后端服务
- 配置化路由:通过配置即可实现断言(匹配规则)和过滤
流量治理与安全
- 负载均衡(商品服务集群多实例场景)
- 限流(防止刷接口)
- 熔断(服务异常时快速失败)
- 鉴权(拦截非法请求)
- 日志监控
- 反向代理
1、网络拓扑图
2、Gateway 和 Zuul 区别
- SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul
- SpringCloud Gateway 是基于 Spring WebFlux 框架实现的
- Spring WebFlux 框架底层则使用了高性能的 Reactor 模式通信框架 Netty , 提升了网关性能
3、Gateway 特性
Spring Cloud Gateway 基于 Spring Framework(支持 Spring WebFlux),Project Reactor 和 Spring Boot 进行构建,具有如下特性:
- 动态路由:根据url动态的决定调用的哪个远程地址
- 可以对路由指定 Predicate(断言)和Filter(过滤器):判断这个请求能不能处理,过滤器用于在请求被路由到后端服务 前(Pre) 或 后(Post) 对请求或响应进行修改或增强。
- 集成Hystrix的断路器功能:熔断
- 集成 Spring Cloud 服务发现功能:从 Eureka Server 获取远程Service地址
- 请求限流功能:
- 支持路径重写:根据业务需求进行重写
4、Gateway 核心组件
1、Route(路由):
路由是构建网关的基本模块,它由 ID,目标 URI,一系列的断言和过滤器组成,如果断言为 true 则匹配该路由
2、Predicate(断言):
对 HTTP 请求中的所有内容(例如请求头或请求参数)进行匹配,如果请求与断言相匹配则进行路由。
简单举例, 比如配置路径, - Path=/member/get/** ==>断言:路径相匹配的进行路由转发, 如果Http请求的路径不匹配, 则不进行路由转发.
3、filters(过滤器):
使用过滤器,可以在请求被路由前或者之后对请求进行处理
你可以理解成, 在对 Http 请求断言匹配成功后, 可以通过网关的过滤机制, 对 Http 请求处理
简单举例:
- AddRequestParameter=color, blue #过滤器在匹配的请求头加上一对请求头,名称为color 值为blue, 比如原来的http 请求是 http://localhost:10000/member/get/1
==过滤器处理=> 统一携带参数:http://localhost:10000/member/get/1?color=blue
5、流程梳理
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前("pre")或之后("post")执行业务逻辑。
Filter 在"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等
在"post"类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
红色方框为一个过滤器
一句话说:路由转发+执行过滤器链
路由转发=发送到后端服务之前=‘pre’执行过后
6、其他
后续服务网关代替消费端,被视为Erueka Client