Gateway的介绍和使用
Gateway的介绍和使用
项目地址:https://spring.io/projects/spring-cloud-gateway
Gateway提供了一个用于在 Spring WebFlux 之上构建 API 网关。
Spring Cloud Gateway 底层使用了高性能的通信框架Netty。
特征:
基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0
能够匹配任何请求属性的路由。
谓词和过滤器特定于路由。
断路器集成。
Spring Cloud DiscoveryClient 集成
易于编写谓词和过滤器
请求速率限制
路径重写
网关在用户端与微服务之间建立了一道屏障,通过 API 网关为微服务访问提供了统一的访问入口,所有用户端的请求被 API 网关拦截并在此基础上可以实现额外功能,例如:
- 针对所有请求进行统一鉴权、熔断、限流、日志等前置处理,让微服务专注自己的业务。
- 统一调用风格,通常 API 网关对外提供 RESTful 风格 URL 接口。用户传入请求后,由 API 网关负责转换为后端服务需要的 RESTful、RPC、WebService 等方式,这样便大幅度简化用户的接入难度。
- 更好的安全性,在通过 API 网关鉴权后,可以控制不同角色用户访问后端服务的权利,实现了服务更细粒度的权限控制。
- API 网关是用户端访问 API 的唯一入口,从用户的角度来说只需关注 API 网关暴露哪些接口,至于后端服务的处理细节,用户是不需要知道的。从这方面讲,微服务架构通过引入 API 网关,将用户端与微服务的具体实现进行了解耦。
Gateway项目搭建
第一步,利用 Spring Initializr 向导创建 Gateway 工程。
1 | <dependency> |
第二步,修改application.yml配置信息。
1 | # 应用名称 |
通过网关访问其他服务:
1 | http://网关IP:端口/微服务id/URI |
路由转发流程:
- Gateway、provider-service,consumer-service 这些都是微服务实例,在启动时向 Nacos 注册登记;
- 用户端向 Gateway 发起请求,请求地址 http://localhost/service-a/serviceName;
- Gateway 网关实例收到请求,解析其中第二部分 service-a,即微服务 Id,第三部分 URI 为“/serviceName”。之后向 Nacos 查询 service-a 可用实例列表;
- Nacos 返回可用微服务service-a实例信息;
- Spring Cloud Gateway 内置 Ribbon,根据默认轮询策略将请求转发至其中一个实例,转发的完整 URL 将附加用户的 URI。
- service-a 实例处理后返回 JSON 响应数据给 Gateway;
- Gateway 返回给用户端,完成一次完整的请求路由转发过程。
Route(路由)
路由(Route)是指一个完整的网关地址映射与处理过程。一个完整的路由包含两部分配置:谓词(Predicate)与过滤器(Filter)。
路由配置模板:
1 | spring: |
Predicate(谓词)
谓词决定前端应用发来的请求要被转发到哪个微服务上,可以匹配HTTP请求的任何内容,Headers或Parameters。
- After 代表在指定时点后路由规则生效。
1 | predicates: |
- Before 代表在指定时点前路由规则生效。
1 | predicates: |
- Between 代表在该时间范围内的请求
1 | predicates: |
- Cookie 代表请求包含cookie,并且cookie的值符合value的规则
1 | predicates: |
value是正则表达式。
- Host 代表匹配对应的host
1 | predicates: |
- Method 代表匹配对应的请求方式
1 | predicates: |
- Path 代表 URI 符合映射规则时生效。
1 | predicates: |
- Query 代表匹配所有含有请求参数
param且它的值符合正则表达式value的请求,value可以省略,请求参数含有param即可
1 | predicates: |
- Header 代表包含指定请求头时生效。
1 | predicates: |
如果请求具有名为 X-Request-Id 的 Header,value是正则表达式,其值与\d+正则表达式匹配(具有一个或多个数字的值),则该路由匹配。
- Method 代表要求 HTTP 方法符合规定时生效。
1 | predicates: |
- RemoteAddr 代表匹配指定的Ip
1 | predicates: |
- Weight 匹配权重
1 | routes: |
参数 group 和 weight(int) ,group声明组,weight表示在该组内的权重
Filter(过滤器)
转发过程中请求、响应数据被网关如何加工处理。
- AddRequestParameter 是对所有匹配的请求添加一个查询参数。
1 | filters: |
- AddResponseHeader 会对所有匹配的请求,在返回结果给客户端之前,在 Header 中添加响应的数据。
1 | #在Response中添加Header头,key=X-Response-Foo,Value=Bar。 |
- Retry 为重试过滤器,当后端服务不可用时,网关会根据配置参数来发起重试请求。
1 | filters: |
Gateway 的执行原理与自定义过滤器

- Spring Cloud Gateway 启动时基于 Netty Server 监听指定的端口(该端口可以通过 server.port 属性自定义)。当前端应用发送一个请求到网关时,进入 Gateway Handler Mapping 处理过程,网关会根据当前 Gateway 所配置的谓词(Predicate)来决定是由哪个微服务进行处理。
- 确定微服务后,请求向后进入 Gateway Web Handler 处理过程,该过程中 Gateway 根据过滤器(Filters)配置,将请求按前后顺序依次交给 Filter 过滤链进行前置(Pre)处理,前置处理通常是对请求进行前置检查,例如:判断是否包含某个指定请求头、检查请求的 IP 来源是否合法、请求包含的参数是否正确等。
- 当过滤链前置(Pre)处理完毕后,请求会被 Gateway 转发到真正的微服务实例进行处理,微服务处理后会返回响应数据,这些响应数据会按原路径返回被 Gateway 配置的过滤链进行后置处理(Post),后置处理通常是对响应进行额外处理,例如:将处理过程写入日志、为响应附加额外的响应头或者流量监控等。
自定义全局过滤器
在 Spring Cloud Gateway 中,自定义过滤器分为两种,全局过滤器与局部过滤器。两者唯一的区别是:全局过滤器默认应用在所有路由(Route)上,而局部过滤器可以为指定的路由绑定。
例子:统计请求耗时的过Filter
1 | import java.util.Objects; |