本文使用的 Spring Cloud 版本为 2.1.2.RELEASE,如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-core</artifactId>
<version>2.1.2.RELEASE<version>
</dependency>
一、如何使用Gateway功能
通过YAML配置文件
spring:
cloud:
gateway:
enabled: true
routes:
- id: path_route
order: 500
predicates:
- Path=/demo/list
filters:
- name: Retry
args:
retries: 1
uri: http://127.0.0.1:8080/demo/list
通过RouteLocatorBuilder注册
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder
.routes()
.route("path_route", r -> r.order(500).path("/demo/list").filters(f -> f.retry(1)).uri("http://127.0.0.1:8080/demo/list"))
.build();
}
使用说明
上述两种方式完全等价,它们建立了相同的“路由规则(RouteDefinition)”,该规则定义如下:
- id为path_route
- 优先级order为500
- 断言器使用PathRoutePredicateFactory匹配/demo/list路径
- 拦截器使用RetryGatewayFilterFactory在失败时进行1次重试
- 匹配成功后请求uri为http://127.0.0.1:8080/demo/list地址。
由此可见,路由规则包含5个部分,分别是id、order、predicates、filters、uri。
- 在定义predicates时,可以通过继承AbstractRoutePredicateFactory实现自定义的断言器,如果自定义的断言器在YAML配置文件中使用,命名需要遵循特殊规范,如示例中的PathRoutePredicateFactory断言器,在文件用Path=/demo/list表示,“Path”为PathRoutePredicateFactory的“RoutePredicateFactory”的前缀名,“/demo/list”为参数。
- 在定义filters时,可以通过继承AbstractGatewayFilterFactory实现自定义拦截器,YAML配置文件中使用时,同样遵循上述命名规范和使用规则。
二、实现自定义的Gateway组件
Spring Cloud Gateway的核心功能由断言器、拦截器实现,下面将详细讲解如何实现自己的断言器和拦截器。
RoutePredicateFactory断言器工厂
1. 自定义的RoutePredicateFactory断言器工厂需要通过继承AbstractRoutePredicateFactory实现
@Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {
public CustomRoutePredicateFactory() {
// 指定apply方法参数的类型,需要与AbstractRoutePredicateFactory的泛型一致
super(CustomRoutePredicateFactory.Config.class);
}