电商网站制作方案,百度收录个人网站是什么怎么做,百度地图手机网页版,免费vip电影网站怎么做上一节学习了GatewayFilter。 回忆一下一个关键点#xff1a; GateWayFilterFactory的本质就是#xff1a;针对配置进行解析#xff0c;为指定的路由#xff0c;添加Filter#xff0c;以便对请求报文进行处理。
一、原理分析
GlobalFilter又是啥#xff1f;先看一下接口…上一节学习了GatewayFilter。 回忆一下一个关键点 GateWayFilterFactory的本质就是针对配置进行解析为指定的路由添加Filter以便对请求报文进行处理。
一、原理分析
GlobalFilter又是啥先看一下接口定义
public interface GlobalFilter {MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain);
}再看一下GatewayFilter
public interface GatewayFilter extends ShortcutConfigurable {MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain);
}可以看到GatewayFilter和GlobalFilter方法签名是一模一样的那为啥又要整一个GlobalFilter出来 GatewayFilter的作用主要是基于配置文件或者代码就是routes那个配置解析出配置然后进行报文处理。这个Filter是跟某个route强行绑定的。 GlobalFilter是直接强制加载的不属于某个指定的route。而这个filter需不需要处理是通过在filter方法中来进行判断的。如果不需要自己处理就直接丢给链条中下个filter。 请求的处理逻辑可以看以下代码 FilteringWebHandler.java
Override
public MonoVoid handle(ServerWebExchange exchange) {Route route exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);ListGatewayFilter gatewayFilters route.getFilters();ListGatewayFilter combined new ArrayList(this.globalFilters);combined.addAll(gatewayFilters);// TODO: needed or cached?AnnotationAwareOrderComparator.sort(combined);if (logger.isDebugEnabled()) {logger.debug(Sorted gatewayFilterFactories: combined);}return new DefaultGatewayFilterChain(combined).filter(exchange);
}代码解析
从配置中获取route并取出满足当前route条件的gatewayFilterGlobalFilter和gatewayFilter合并成一个list并排序filter封装成链链式处理当前请求
二、如何自定义一个GlobalFilter
Bean
public GlobalFilter customFilter() {return new CustomGlobalFilter();
}public class CustomGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(custom global filter);return chain.filter(exchange);}Overridepublic int getOrder() {return -1;}
}三、内置的GlobalFilter
3.1 Forward Routing Filter
处理URL格式为forward:///localendpoint这种将会被转发到forward后面的地址 3.2 The LoadBalancerClient Filter 没看到源码本地是 SpringCloud 2021.0.1版本 3.3 The ReactiveLoadBalancerClientFilter 如果URL有⼀个 lb scheme (如 lb://myservice 它将使⽤Spring Cloud ReactorLoadBalancer 将名称在前⼀个示例中为 myservice 解析为实际主机和端⼝并替换URI
spring:cloud:gateway:routes:- id: myRouteuri: lb://servicepredicates:- Path/service/**3.4 The Netty Routing Filter
如果URL具有http 或https 模式则会运⾏Netty Routing Filter。它使⽤Netty HttpClient 发出下游代理请求。 响应放在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange属性中。
3.5 The Netty Write Response Filter
从ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange属性如果有值此filter就执行用于写响应报文到缓存。
3.6 The RouteToRequestUrl Filter
如果 ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR exchange属性中存在 Route 对象RouteToRequestUrlFilter 将运⾏。它基于请求URI创建⼀个新的URI使⽤Route对象的uri属性进⾏更新。新的URI被放置在 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange属性中。如果该URI有⼀个前缀scheme例如lb:ws://serviceid则会从该URI中剥离该 lb scheme并将其放置在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR 中以便稍后在过滤器链中使⽤。
3.7 The Websocket Routing Filter
如果 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange属性中有 ws 、 wss scheme则Websocket Routing Filter将被运⾏。它使⽤Spring Web Socket基础模块将Websocket转发到下游。 URI前缀为 lb 的Websockets可以被负载均衡如 lb:ws://serviceid
spring:cloud:gateway:routes:# SockJS route- id: websocket_sockjs_routeuri: http://localhost:3001predicates:- Path/websocket/info/**# Normal Websocket route- id: websocket_routeuri: ws://localhost:3001predicates:- Path/websocket/**3.8 The Gateway Metrics Filter
要启⽤⽹关指标请将 spring-boot-starter-actuator 添加为项⽬依赖项。然后默认情况下只要属性 spring.cloud.gateway.metrics.enabled 未设置为 false ⽹关指标过滤器就会运⾏。此过滤器添加名为 spring.cloud.gateway.requests 的计时器指标并带有以下标记
routeId: route ID.routeUri: API 将被转发的URIoutcome: 结果分类依据 HttpStatus.Seriesstatus: 返回client的请求的Http StatushttpStatusCode: 返回client的请求的httpStatusCodehttpMethod: ⽤于请求的HTTP⽅法 另外通过 spring.cloud.gateway.metrics.tags.path.enabled 默认为false来激活额外的指标path请求的路径 这些指标可以从 /actuator/metrics/spring.cloud.gateway.requests 获取并且能够很容易的与Prometheus 集成创建Grafana dashboard。 注意要将pometheus启⽤需要添加 micrometer-registry-prometheus 为项⽬依赖。