六、Spring Cloud Gateway-全局过滤器

Global Filter接口与GatewayFilter具有相同的签名。这些是有条件地应用于所有路由的特殊过滤器。(此接口和用法在未来里程碑里有可能改变)

Combined Global Filter and GatewayFilter Ordering

当请求进入(并匹配路由)时,Filtering Web Handler会将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链。此组合过滤器链通过org.springframework.core.Ordered接口进行排序。可以通过实现getOrder()方法或者使用@Order注解。

由于Spring Cloud Gateway区分了过滤器逻辑执行的“请求”和“响应”阶段(请参阅:第三章),具有最高优先级的过滤器将是“请求”阶段的第一个和“响应”阶段的最后一个 。

Forward Routing Filter

ForwardRoutingFilter 查找一个URI在exchange的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR属性中。如果url具有forward方案(即forward:// localendpoint),它将使用Spring DispatcherHandler处理请求。请求URL的路径部分将被转发URL中的路径覆盖。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中的列表中。

说明:  Forward Routing Filter处理forward前缀的url;Netty Routing Filter处理http或https前缀的url。

LoadBalancerClient Filter

LoadBalancerClientFilter在exchange 属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。如果url有lb方案(即lb:// myservice),它将使用Spring Cloud LoadBalancerClient将名称(前一个示例中的myservice)解析为实际的主机和端口,并替换相同属性中的URI。未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性的列表中。过滤器还将查看ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR属性以查看它是否等于lb,然后应用相同的规则。

默认情况下,在LoadBalancer中找不到服务实例时,将返回503。 您可以通过设置spring.cloud.gateway.loadbalancer.use404 = true来配置网关以返回404。

从LoadBalancer返回的ServiceInstance的isSecure值将覆盖在对网关发出的请求中指定的方案。 例如,如果请求通过HTTPS进入网关但ServiceInstance指示它不安全,则下游请求将通过HTTP进行。 相反的情况也适用。 但是,如果为网关配置中的路由指定了GATEWAY_SCHEME_PREFIX_ATTR,则将剥离前缀,并且路由URL中的结果方案将覆盖ServiceInstance配置。

Netty Routing Filter

如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR  exchange 属性中的URL具有http或https方案,则运行Netty路由过滤器。 它使用Netty HttpClient发出下游代理请求。 响应放在exchange中的ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR属性中,以便在以后的过滤器中使用。 (有一个实验性的WebClientHttpRoutingFilter执行相同的功能,但不需要netty)

Netty Write Response Filter

如果exchange中存放ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR 属性存在Netty HttpClientResponse,则运行NettyWriteResponseFilter。 它在所有其他过滤器完成后运行,并将代理响应写回网关客户端响应。 (有一个实验性的WebClientWriteResponseFilter执行相同的功能,但不需要netty)

说明:1.我看到源码中,判断是CLIENT_RESPONSE_CONN_ATTR属性存在,而不是CLIENT_RESPONSE_ATTR 属性。

           2.网关对于客户端其实是服务代理,网关对于服务端是客户代理。

             Netty Routing Filter相当于是客户端代理,访问服务端,获取响应信息;

            Netty Write Response Filter相当于服务端代理,客户访问时,将服务端返回的信息写会给客户端。

RouteToRequestUrl Filter

如果在exchange中ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR 属性存在Route对象,则运行RouteToRequestUrlFilter。 它根据请求URI创建一个新URI,但使用Route对象的URI属性进行更新。 新URI放在exchange的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 属性中。

如果URI具有前缀,例如lb:ws:// serviceid,则lb方案将从URI中剥离并放置在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR中,以便稍后在过滤器链中使用。

说明:将客户端请求对象中获取的URI根据路由表中URI加工为访问服务端的URI。另外,其他路径加工过滤器在此之前已经加工完成,所以新增过滤器时,如果涉及到修改请求URI的,最好在此路由之前进行,此路由order=10000。

Websocket Routing Filter

如果位于ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange属性中的URL具有ws或wss方案,则运行Websocket路由过滤器。 它使用Spring Web Socket基础结构将Websocket请求转发到下游。

可以通过在URI前面添加lb来对Websockets进行负载平衡,例如lb:ws:// serviceid。

如果您使用SockJS作为普通HTTP的fallback,则应配置正常的HTTP路由以及Websocket路由。

Gateway Metrics Filter

要启用Gateway Metrics,请将spring-boot-starter-actuator添加为项目依赖项。 然后,默认情况下,只要属性spring.cloud.gateway.metrics.enabled未设置为false,Gateway Metrics Filter就会运行。 此过滤器添加名为“gateway.requests”的计时器度量标准,其中包含以下标记:

routeId:路由id

routeUri: API被路由的URI

outcome: 由HttpStatus.Series分类的结果

status: 请求返回客户端的状态Http Status

httpStatusCode: 请求返回客户端的状态Http Status

httpMethod:Http 请求方法

然后可以从/actuator/metrics/gateway.requests中删除这些指标,并可以轻松地与Prometheus集成以创建Grafana dashboard

要启用pometheus端点,请将micrometer-registry-prometheus添加为项目依赖项。

Marking An Exchange As Routed

在Gateway路由了ServerWebExchange之后,它会通过将gatewayAlreadyRouted添加到exchange属性来将该exchange标记为“路由”。 一旦请求被标记为路由,其他路由过滤器将不会再次路由请求,实质上是跳过过滤器。 您可以使用便捷方法将exchange标记为路由,或检查exchange 是否已路由。

ServerWebExchangeUtils.isAlreadyRouted接受ServerWebExchange对象并检查它是否已“路由”。

ServerWebExchangeUtils.setAlreadyRouted接受ServerWebExchange对象并将其标记为“路由”。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容