Spring Cloud Gateway简介
Zuul闭源之后,Spring开发了Spring新一代微服务网关Spring Cloud Gateway
来代替Zuul,基于Spring5、Spring boot 2以及project Reactor。Spring Cloud Gateway
旨在提供一种简单的、有效的方式来路由API。
Spring Cloud Gateway
基于Spring WebFlux
以及使用Netty作为底层的网络通信框架,所以之前使用到的同步框架或者使用方式会不适用。
Maven依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
Spring Cloud Gateway术语
- Route: 构建网关的基本模块。路由 ID, 目标 URI, 一系列断言(predicates), 以及一组过滤器( filters)组成了一个路由,当这些断言对请求路径的匹配结果返回true时,网关才会进行处理。
- Predicate: Java 8 的函数式断言接口.。入参是 Spring Framework
ServerWebExchange
。能够匹配请求体里的任何信息,比如:http header,url。 - Filter: 使用具体的工厂类创建的Spring Framework
GatewayFilter
。通过过滤器可以修改请求体在发送请求到下游的服务之前,或是在得到下游服务响应体后修改响应体。
架构图
客户端将请求发送到Spring Cloud Gateway
,Gateway Handler Mapping
进行路由匹配,如果匹配成功则Gateway web handler
会处理请求:请求会通过一组预先设定好的过滤器。大概流程是先执行预过滤逻辑、执行请求、得到结果执行后置过滤。
配置路由
路由可以通过配置文件配置和Java代码配置,配置文件配置又可以分为简化配置和全参配置。
简化配置
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue
这段yaml配置了一个Cookie路由断言,将会匹配cookie名为mycookie
值为mycookievalue
的请求。
全参配置
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
这段配置与上面的路由配置一样,但是使用了args
作为键来配置具体的断言参数
Java 代码配置
通过RouteLocatorBuilder
可以进行链式调用构建路由:
@Configuration
public class RouteConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder
.routes()
.route("after_route", r -> r.cookie("mycookie", "mycookievalue").uri("https://example.org"))
.build();
}
}
总结
Spring Cloud Gateway
作为新一代微服务网关提供了易于配置路由的特性,但是其底层使用到了异步、NIO、响应式编程,所以如果需要进行深入开发,开发者需要改变传统的编程思维。