一.什么是网关:
实现统一入口,接收所有的请求,并根据定义的规则转发到相应的服务上。
在此过程中还可以完成系统中一些通用统一的工作,如权限校验,限流等。
Zuul就是NetFlix提供的一个服务网关,用于实现路由、过滤器等功能(Zuul是异步阻塞模型)。
Gateway 也是服务网关(非阻塞模型)。
通俗一点来说,就是对服务提供一层保护,对外界的请求进行过滤转发到后端服务中。
这里我们可以通过几张简单的示例图来进行了解.。
1.1 不适用网关的实例图:
1.2 使用网关的示例图:
我们发现加了网关之后,实际上是将一对 N 的关系转变成了一对一的关系,用户只需跟网关打交道就好了,这样的好处是我们可以在网关层进行数据合法校验、权限认证、负载均衡等统一处理,这样可以在很大的程度上节省的人力和物力。
二. Gateway
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
相关概念:
- Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
- Predicate(断言):这是一个 Java 8 的 接口。该接口接受一个输入参数,返回一个布尔值结果。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
- Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
工作流程:
如上图所示:
客户端向 Spring Cloud Gateway 发出请求。首先将请求交给 Gateway Handler Mapping 处理,如果找到与请求相匹配的路由(这时就会用到断言),则将其发送到 Gateway Web Handler 处理。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
在执行所有的"pre" 过滤器逻辑时,一般可以实现权限,限流,日志输出,更改请求头和转换协议等功能。
在收到响应后,会执行所有的"post" 过滤器的逻辑,这里可以随响应数据进行修改,比如更换响应头和转换协议等。
Gateway 服务网关内置的断言
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。