【转载】Spring Cloud Gateway-全局过滤器(Global Filters)
http://www.imooc.com/article/290821
TIPS
本文基于Spring Cloud Gateway SR2,理论适配Spring Cloud Gateway SR1以及更高版本。
本文详细探讨Spring Cloud Gateway内置的全局过滤器。包括:
1 Combined Global Filter and GatewayFilter Ordering
2 Forward Routing Filter
3 LoadBalancerClient Filter
4 Netty Routing Filter
5 Netty Write Response Filter
6 RouteToRequestUrl Filter
7 Websocket Routing Filter
8 Gateway Metrics Filter
9 Marking An Exchange As Routed
GlobalFilter
接口和 GatewayFilter
有一样的接口定义,只不过, GlobalFilter
会作用于所有路由。
TIPS
官方声明:GlobalFilter的接口定义以及用法在未来的版本可能会发生变化。
个人判断:GlobalFilter可用于生产;如果有自定义GlobalFilter的需求,理论上也可放心使用——未来即使接口定义以及使用方式发生变化,应该也是平滑过渡的(比如Zuul的Fallback,原先叫ZuulFallbackProvider,后来改叫FallbackProvider,中间就有段时间新旧使用方式都支持,后面才逐步废弃老的使用方式)。
1 Combined Global Filter and GatewayFilter Ordering
当请求到来时,Filtering Web Handler
处理器会添加所有 GlobalFilter
实例和匹配的 GatewayFilter
实例到过滤器链中。
过滤器链会使用 org.springframework.core.Ordered
注解所指定的顺序,进行排序。Spring Cloud Gateway区分了过滤器逻辑执行的”pre”和”post”阶段,所以优先级高的过滤器将会在pre阶段最先执行,优先级最低的过滤器则在post阶段最后执行。
TIPS
数值越小越靠前执行,记得这一点就OK了。
示例代码:
@Bean
@Order(-1)
public GlobalFilter a() {
return (exchange, chain) -> {
log.info("first pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("third post filter");
}));
};
}
@Bean
@Order(0)
public GlobalFilter b() {
return (exchange, chain) -> {
log.info("second pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("second post filter");
}));
};
}
@Bean
@Order(1)
public GlobalFilter c() {
return (exchange, chain) -> {
log.info("third pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("first post filter");
}));
};
}
执行结果:
first pre filter
second pre filter
third pre filter
first post filter
second post filter
third post filter
2 Forward Routing Filter
ForwardRoutingFilter
会查看exchange的属性 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
的值(一个URI),如果该值l的scheme是 forward
,比如:forward://localendpoint
,则它会使用Spirng的DispatcherHandler
处理该请求。请求URL的路径部分,会被forward URL中的路径覆盖。未修改的原始URL,会被追加到 ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR
属性中。
TIPS
这段文档太学术了,讲解了
ForwardRoutingFilter
的实现原理,对使用者来说,意义不大;对使用者来说,只要知道这个Filter是用来做本地forward就OK了。建议:如对原理感兴趣的,建议直接研究源码,源码比官方文档好理解。
3 LoadBalancerClient Filter
LoadBalancerClientFilter
会查看exchange的属性 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
的值(一个URI),如果该值的scheme是 lb
,比如:lb://myservice
,它将会使用Spring Cloud的LoadBalancerClient
来将 myservice
解析成实际的host和port,并替换掉 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
的内容。原始地址会追加到 ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR
中。该过滤器还会查看 ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR
属性,如果发现该属性的值是 lb
,也会执行相同逻辑。
示例:
spring:
cloud:
gateway:
routes:
- id: myRoute
uri: lb://service
predicates:
- Path=/service/**
默认情况下,如果无法在
LoadBalancer
找到指定服务的实例,那么会返回503(对应如上的例子,找不到service实例,就返回503);可使用spring.cloud.gateway.loadbalancer.use404=true
让其返回404。
LoadBalancer
返回的ServiceInstance
的isSecure
的值,会覆盖请求的scheme。举个例子,如果请求打到Gateway上使用的是HTTPS
,但ServiceInstance
的isSecure
是false,那么下游收到的则是HTTP请求,反之亦然。然而,如果该路由指定了GATEWAY_SCHEME_PREFIX_ATTR
属性,那么前缀将会被剥离,并且路由URL中的scheme会覆盖ServiceInstance
的配置
TIPS
这段文档太学术了,讲解了
LoadBalancerClientFilter
的实现原理,对使用者来说,意义不大;对使用者来说,其实只要知道这个Filter是用来整合Ribbon的就OK了。建议:如对原理感兴趣的,建议直接研究源码,源码比官方文档好理解。
4 Netty Routing Filter
如果 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
的值的scheme是 http
或 https
,则运行Netty Routing Filter 。它使用Netty HttpClient
向下游发送代理请求。获得的响应将放在exchange的 ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR
属性中,以便在后面的filter中使用。(有一个实验性的过滤器: WebClientHttpRoutingFilter
可实现相同功能,但无需Netty)
5 Netty Write Response Filter
如果exchange中的 ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR
属性中有 HttpClientResponse
,则运行 NettyWriteResponseFilter
。该过滤器在所有其他过滤器执行完成后执行,并将代理响应协会网关的客户端侧。(有一个实验性的过滤器: WebClientWriteResponseFilter
可实现相同功能,但无需Netty)
6 RouteToRequestUrl Filter
如果exchange中的 ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR
属性中有一个 Route
对象,则运行 RouteToRequestUrlFilter
。它根据请求URI创建一个新URI,但会使用该 Route
对象的URI属性进行更新。新URI放到exchange的 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
属性中。
如果URI具有scheme前缀,例如 lb:ws://serviceid
,该 lb
scheme将从URI中剥离,并放到 ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR
中,方便后面的过滤器使用。
7 Websocket Routing Filter
如果exchange中的 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
属性的值的scheme是 ws
或者 wss
,则运行Websocket Routing Filter。它底层使用Spring Web Socket将Websocket请求转发到下游。
可为URI添加 lb
前缀实现负载均衡,例如 lb:ws://serviceid
。
如果你使用 SockJS 所谓普通http的后备,则应配置正常的HTTP路由以及Websocket路由。
spring:
cloud:
gateway:
routes:
# SockJS route
- id: websocket_sockjs_route
uri: http://localhost:3001
predicates:
- Path=/websocket/info/**
# Normwal Websocket route
- id: websocket_route
uri: ws://localhost:3001
predicates:
- Path=/websocket/**
8 Gateway Metrics Filter
要启用Gateway Metrics,需添加 spring-boot-starter-actuator
依赖。然后,只要spring.cloud.gateway.metrics.enabled
的值不是false,就会运行Gateway Metrics Filter。此过滤器添加名为 gateway.requests
的时序度量(timer metric),其中包含以下标记:
routeId
:路由IDrouteUri
:API将路由到的URIoutcome
:由 HttpStatus.Series 分类status
:返回给客户端的Http StatushttpStatusCode
:返回给客户端的请求的Http StatushttpMethod
:请求所使用的Http方法
TIPS
Prometheus是一款监控工具,Grafana是一款监控可视化工具;Spring Boot Actuator可与这两款工具进行整合。关于整合,笔者写过手把手的博客,有兴趣可以看一下:
9 Marking An Exchange As Routed
在网关路由 ServerWebExchange
后,它将通过在exchange添加一个 gatewayAlreadyRouted
属性,从而将exchange标记为 routed
。一旦请求被标记为 routed
,其他路由过滤器将不会再次路由请求,而是直接跳过。您可以使用便捷方法将exchange标记为 routed
,或检查exchange是否是 routed
。
ServerWebExchangeUtils.isAlreadyRouted
检查是否已被路由ServerWebExchangeUtils.setAlreadyRouted
设置routed状态
TIPS
简单来说,就是网关通过
gatewayAlreadyRouted
属性表示这个请求已经转发过了,而无需其他过滤器重复路由。从而防止重复的路由操作。
参考文档
本文首发
【转载】Spring Cloud Gateway-全局过滤器(Global Filters)的更多相关文章
- spring cloud gateway 全局过滤器
全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等. 接口定义类:org.springframework.cloud.gateway ...
- spring cloud gateway自定义过滤器
在API网关spring cloud gateway和负载均衡框架ribbon实战文章中,主要实现网关与负载均衡等基本功能,详见代码.本节内容将继续围绕此代码展开,主要讲解spring cloud g ...
- Spring Cloud Gateway自定义过滤器实战(观测断路器状态变化)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Spring Cloud Alibaba学习笔记(19) - Spring Cloud Gateway 自定义过滤器工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的内置过滤器工厂,若Spring Cloud Gateway内置的过滤器工厂无法满足我们的业务需求,那么此时就需要自定义自己的过 ...
- Spring Cloud Gateway 全局通用异常处理
为什么需要全局异常处理 在传统 Spring Boot 应用中, 我们 @ControllerAdvice 来处理全局的异常,进行统一包装返回 // 摘至 spring cloud alibaba c ...
- 微服务网关实战——Spring Cloud Gateway
导读 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用.本文对Spring Clou ...
- 微服务网关 Spring Cloud Gateway
1. 为什么是Spring Cloud Gateway 一句话,Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用的还是Zuul 1.x版本,而这个版本是 ...
- spring cloud gateway获取response body
网关发起请求后,微服务返回的response的值要经过网关才发给客户端.本文主要讲解在spring cloud gateway 的过滤器中获取微服务的返回值,因为很多情况我们需要对这个返回进行处理.网 ...
- Spring Cloud Gateway 实现Token校验
在我看来,在某些场景下,网关就像是一个公共方法,把项目中的都要用到的一些功能提出来,抽象成一个服务.比如,我们可以在业务网关上做日志收集.Token校验等等,当然这么理解很狭隘,因为网关的能力远不止如 ...
- 快速突击 Spring Cloud Gateway
认识 Spring Cloud Gateway Spring Cloud Gateway 是一款基于 Spring 5,Project Reactor 以及 Spring Boot 2 构建的 API ...
随机推荐
- Python入门:A+B问题
1. A + B 问题I 前言 本篇作为课程第一篇,主要是对Python基础语法进行扫盲,本节课会学习到下面知识: 输入 本道题目的工作任务很简单,只是计算两个数的和,但是在计算之前,我们首先要明确的 ...
- 来看看一台Linux可支持多少个链接 | 漫画
困惑很多人的并发问题 在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白.那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题. 很多同学看到这个 ...
- Windows安装Mysql后一段时间后Mysql服务无法启动的问题
本人在windows重装电脑后遇到一个比较麻烦的问题一直没有解决,今日有幸看到某大佬的博客得以解决.真实万分感激,特来分享一下. 第一次安装Mysql8.0之后,此次安装是将整个mysql包进行安装, ...
- cmu15545-数据访问方式:B+树(B+Tree)
目录 基本概念 基于磁盘的B+树 查询与索引 设计选择 结点大小(Node Size) 合并阈值(Merge Thredshold) 变长键(Variable-length Keys) 结点内部搜索( ...
- 4G模组AT指令 | MQTT应用指南!
今天,老师傅讲的是关于4G模组AT指令之MQTT应用,以4G模组Air780E为例: 一.MQTT 协议简介 1.1 MQTT 概述 MQTT 是一种轻量级的消息传输协议,旨在在物联网(IoT)应用中 ...
- Nuxt.js 应用中的 vite:configResolved 事件钩子
title: Nuxt.js 应用中的 vite:configResolved 事件钩子 date: 2024/11/17 updated: 2024/11/17 author: cmdragon e ...
- delphi BDE Reader 不需要驱动
用过Delphi开发的几乎都知道BDE,是读取paradox DB (*.db)数据库(表)读取的驱动. 要存取数据,必需安装 BDE驱动程序,才能正常读取,还需要配置,发布程序就更不方便,所以吐槽的 ...
- delphi 图形图像处理 Image32
delpher 越来越少了,但不能掩盖它的优秀,很外前看到了 Image32,但发现用它的人很少,这段时间整理了它的资料,重新组合了一个DEMO,也可以说是个小工具,分享出来. Image32 关于I ...
- [python] Python异步编程库asyncio使用指北
Python的asyncio模块提供了基于协程(coroutines)的异步编程(asynchronous programming)模型.作为一种高效的编程范式,异步编程允许多个轻量级任务并发执行,且 ...
- OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率
前言 对于一些较大的图形,会出现显示卡顿和渲染缓慢的问题,这时候就要使用到osgUtil::Simplifier简化器,来对其进行简化. Demo osgUtil o ...