赞
踩
这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
spring-cloud-starter-gateway
版本
继上一次SpringCloud Gateway网关入门
现在我们来深入理解下spring cloud gateway
(SCG)的一些核心概念。
后面我们都以
SCG
简称spring cloud gateway
理解了这些核心概念也就基本掌握了SCG
上次我们配置了简单的路由转发功能
类似这样
spring:
application:
name: gate-way
cloud:
gateway:
routes:
- id: zou_route
uri: http://localhost:10080
predicates:
- Path=/zou/**
然后网关就有了转发能力。我们今天就聊聊这几个配置具体配置了啥
不难发现我们配置了前缀为spring.cloud.gateway
的配置,如果我们去源码里面搜索相关的key,就会找到GatewayProperties
这个配置类
可以看到配置类中有两个非常核心的属性
List<RouteDefinition> routes
List<FilterDefinition> defaultFilters
RouteDefinition
即路由定义,也就是我们在配置文件中配置的routes
RouteDefinition
主要由4个属性组成
配置文件中我们都配置过
比较核心的就是下面这两个属性
List<PredicateDefinition> predicates
/** * 谓语定义,在 Route 里,PredicateDefinition 将转换成 Predicate */ @Validated public class PredicateDefinition { /** * 谓语定义名字 * 通过 name 对应到 org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory 的实现类。 * 例如: name=Query 对应到 QueryRoutePredicateFactory */ @NotNull private String name; /** * 参数数组 * 例如,name=Host / args={"_genkey_0" : "iocoder.cn"} ,匹配请求的 hostname 为 iocoder.cn */ private Map<String, String> args = new LinkedHashMap(); ... }
List<FilterDefinition> filters
/** * 过滤器定义,在 Route 里,FilterDefinition将转换成 GatewayFilter */ @Validated public class FilterDefinition { /** * 过滤器定义名字 * 通过 name 对应到 org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory 的实现类。 * 例如,name=AddRequestParameter 对应到 AddRequestParameterGatewayFilterFactory */ @NotNull private String name; /** * 参数数组 * 例如 name=AddRequestParameter / args={"_genkey_0": "foo", "_genkey_1": "bar"} ,添加请求参数 foo 为 bar */ private Map<String, String> args = new LinkedHashMap(); ... }
SCG
目前内置了很多断言
我们这里暂时不去分析
PredicateDefinition
是如何加载的,后面再去分析
SCG
也内置了许多过滤器(filter)
总的来说核心定义就是如下图所示
这里通过这张图就可以很清晰的理解为什么说SCG
有两种过滤器,一种全局的、一种针对单个Route的
上面都是一些定义,类似与Spring中的BeanDefinition
,只是定义了Bean的一些属性,类似与元数据管理,并不是真正启作用的Bean,同样SCG
里面也是如此,SCG
里面核心其作用的其实是Route
可以理解为路由,路由的定义就是由上面那些定义出来的
比如我们通过配置文件yaml定义出一个RouteDefinition
spring:
cloud:
gateway:
routes:
- id: zou_route
uri: http://localhost:10080
predicates:
- Path=/zou/**
也可以通过java Bean的方式去定义
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/zou/**")
.filters(f -> f.stripPrefix(2))
.uri("http://localhost:10080"))
.build();
}
我们查看RouteLocator
接口会发现他只有一个方法就是获取路由
这里我们主要介绍了SCG
中的一些核心**Definition
,后面我们将介绍这些**Definition
是如何转换成真正起作用的Bean,即Route
中的predicate
、gatewayFilters
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。