定制软件开发Spring Cloud Gateway--全局过滤器(GlobalFilter)--作用/使用

原文网址:

简介

        SpringCloud Gateway定制软件开发支持自定义过滤器,定制软件开发可以很灵活的进行请求定制软件开发或者响应的控制。

        定制软件开发自定义过滤器的方法是实现GlobalFilter接口、实现Ordered接口。定制软件开发这两个接口的全路径为:

  • org.springframework.cloud.gateway.filter.GlobalFilter
  • org.springframework.core.Ordered

定制软件开发技术资料与交流 ==> 分享靠谱资料:Java真实定制软件开发面试题汇总、简历模板、PDF书籍、PPT模板等;分享Java实用技术;帮助优化简历。详见:

默认的过滤器

本文对应的spring cloud gateway版本为:spring-cloud-starter-gateway:3.0.1

可以通过两种方式查看所有过滤器

法1:访问actuar接口

可以通过gateway内嵌的endpoint来查看GlobalFilter列表(网关ip:端口号/actuator/gateway/globalfilters):

法2:自定义GlobalFilter然后打断点

过滤器大全

  1. org.springframework.cloud.gateway.filter.RemoveCachedBodyFilter, order = -2147483648
    1. 移除缓存中的请求体
  2. org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter, order = -2147482648
    1. 从exchange的attributes中获得cachedRequestBody属性值作为request的body
    2. 必须预设cachedRequestBody属性至attributes中,要手动设置,无法通过配置来设置。可以在优先级更高的filter中来设置cachedRequestBody。当然也可以自己写一个FilterFactory类来做成配置化。
  3. org.springframework.cloud.gateway.filter.NettyWriteResponseFilter, order = -1
    1. 将Netty代理调用的response数据流写入ServerHttpResponse的body中。当NettyRouting拿到远程调用的结果数据流之后会将其写入当前请求exchange的attributes中。
  4. org.springframework.cloud.gateway.filter.ForwardPathFilter, order = 0
    1. 条件过滤器,只有当请求的header scheme为forward的时候才会发生,否则会忽略没有任何作用,当有转发需求的时候会将request的请求path修改,从而修改了请求的目的地址。
  5. [[RewritePath /order/(?<remaining>.*) = '/${remaining}'], order = 1
  6. org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter, order = 10000
    1. 将网关上的请求转为对应业务应用的真实ip的请求。
    2. 请求进来时path的前缀是gateway的地址(ip+port或域名),需要将其uri映射至服务id上;比如:将path的192.168.20.134:10080映射至服务lb://{serviceId};对于绝对路径配置的服务,exchange的GATEWAY_ROUTE_ATTR属性将会是null,直接过滤到下一个过滤器,不会发生path的真实映射。
  7. org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter, order = 10150
    1. 负责服务真实ip的映射,对服务进行负载均衡,默认采用的netflix-ribbon作为负载均衡器。
    2. 如果scheme不是服务节点映射的话直接过滤,获取服务节点。里边的choose函数是核心负载均衡函数,获取一个实例(如果是单节点则不计算),然后将服务的真实ip+port替换掉path中的lb://{serviceId}前缀。
  8. org.springframework.cloud.gateway.filter.WebsocketRoutingFilter, order = 2147483646
    1. 实现了gateway对于websocket的支持,内部通过websocketClient实现将一个http请求协议换转成websocket,实现调用方无感知的请求websocket的服务,只需要将schme设置成ws或者wss这么简单。
  9. org.springframework.cloud.gateway.filter.NettyRoutingFilter, order = 2147483647
  10. org.springframework.cloud.gateway.filter.ForwardRoutingFilter, order = 2147483647
    1. 是一个结束操作,经过filter chain的链式调用,最终将exchange交还给web handler做http请求处理。

自定义过滤器实例

  1. package com.knife.gateway.dynamic;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  4. import org.springframework.cloud.gateway.filter.GlobalFilter;
  5. import org.springframework.cloud.gateway.route.Route;
  6. import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
  7. import org.springframework.core.Ordered;
  8. import org.springframework.core.annotation.Order;
  9. import org.springframework.http.server.reactive.ServerHttpRequest;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.web.server.ServerWebExchange;
  12. import org.springframework.web.util.UriComponents;
  13. import org.springframework.web.util.UriComponentsBuilder;
  14. import reactor.core.publisher.Mono;
  15. import java.net.URI;
  16. import java.util.Map;
  17. import java.util.Objects;
  18. /**
  19. * 动态路由
  20. */
  21. @Slf4j
  22. @Component
  23. public class Router4jFilter implements GlobalFilter, Ordered {
  24. @Override
  25. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  26. ServerHttpRequest originalRequest = exchange.getRequest();
  27. // 可获得所有请求参数
  28. // Map<String, String> cachedRequestBody = exchange
  29. // .getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);
  30. //获取域名+端口后的path
  31. String rawPath = originalRequest.getURI().getRawPath();
  32. // todo 从redis中取出所有url,然后用rawPath去匹配
  33. String host = "localhost";
  34. int port = 9012;
  35. URI originUri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
  36. URI newUri = UriComponentsBuilder.fromUri(originUri)
  37. .host(host)
  38. .port(port)
  39. .build()
  40. .toUri();
  41. //重新封装request对象
  42. ServerHttpRequest newRequest = originalRequest.mutate().uri(newUri).build();
  43. // NettyRoutingFilter 最终从GATEWAY_REQUEST_URL_ATTR 取出uri对象进行http请求
  44. // 所以这里要将新的对象覆盖进去
  45. exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, newUri);
  46. return chain.filter(exchange.mutate().request(newRequest).build());
  47. // 也可以加回调方法
  48. // return chain.filter(exchange.mutate().request(newRequest).build())
  49. // .then(Mono.fromRunnable(() -> {
  50. // //请求完成回调方法 可以在此完成计算请求耗时等操作
  51. // }));
  52. }
  53. /**
  54. * 这里不能用@Order,必须实现Ordered接口
  55. * 值必须大于10150。原因:Gateway有自己的过滤器,两个比较重要的如下:
  56. * RouteToRequestUrlFilter:将根据Route将网关请求转为真实的请求。order = 10000
  57. * ReactiveLoadBalancerClientFilter:负载均衡。order = 10150
  58. */
  59. @Override
  60. public int getOrder() {
  61. return 15000;
  62. }
  63. }

其他网址

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发