简单起见,直接使用Spring Cloud Gateway(以下简称SCG)框架自带的spring-cloud-gateway-sample模块进行源码分析。
目标
分析如何添加filter,filter如何排序,filter如何执行
事先准备
参见源码分析之spring_cloud_gateway中请求被路由的过程解析 中的“准备工作”部分。
分析过程
SCG如何添加一个filter
我们回到最开始,本文示例代码中添加filter的代码如下:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
String httpUri = "http://httpbin.org:80";
return builder.routes()
.route(p -> p
.path("/get")
//看看这里的源码
.filters(f -> f.addRequestHeader("Hello", "World!!!"))
.uri(httpUri)
)
.build();
}
点下filters()
方法,好像跟添加filter、filter排序关系都不大,暂时跳过:
public UriSpec filters(Function<GatewayFilterSpec, UriSpec> fn) {
return fn.apply(new GatewayFilterSpec(routeBuilder, builder));
}
那再看下addRequestHeader
, 明显这里就是添加filter、并涉及排序的代码了:
public class UriSpec {
.......
/*
getBean方法来自UriSpec
*/
<T> T getBean(Class<T> type) {
return this.builder.getContext().getBean(type);