欢迎光临
我们一直在努力

body是什么厂spring apigateway header 过大 400错误 springgateway作用

 

用于分布式系统,可进行路由、流量控制、熔断降级、安全验证等操作。功能与nginx相近但比nginx实现的功能更广。gateway用作网关,接入web请求和webmvc处理web请求基本相似,只是实现上不同。

SpringBoot Gateway基于Spring Webflux实现。

Spring Webflux是一种异步非阻塞框架,SpringMVC是一种同步阻塞框架。Spring Webflux相比于SpringMVC无法提升处理速度,但能提升吞吐量与伸缩性,适用于高网络IO情况下,比如网关。

Spring Webflux无法替代SpringMVC,其存在难编码、debug、测试等问题,故只在高网络IO情况或者项目存在大量异步操作情况下使用。

粗略流程图:

  1. 请求访问gateway client
  2. 请求经过handler mapping,根据predicate选择匹配的路由
  3. 请求根据匹配路由执行定义的pre过滤器(对请求数据进行验证)
  4. 请求根据匹配路由执行定义的post过滤器(对响应数据进行操作)

spring apigateway header 过大 400错误 springgateway作用_自定义

详细流程图:

spring apigateway header 过大 400错误 springgateway作用_自定义_02

 图参考博文:springcloud gateway请求处理流程

请求验证路由谓词工厂种类:

SpringCloud gateway内嵌了十一种请求验证谓词工厂可使用(不包括ReadBodyRouteRedicateFactory),每个工厂分别通过对应不同方面predicate的对路由进行匹配。可从yml配置文件配置与java代码配置两个方面进行调用。

spring apigateway header 过大 400错误 springgateway作用_spring cloud_03

 其中的After路由谓词工厂yml配置文件配置使用示例:

名称使用路由谓词工厂前缀,工厂作用使用其中apply方法提供相应细粒度的GatewayFilter过滤器,可自定义路由谓词工厂以及其中apply方法响应的GatewayFilter过滤器。

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

  参考博文:spring cloud gateway-路由谓词RoutePredicate、RoutePredicateFactory

路由过滤器分为局部过滤器GatewayFilter与全局过滤器GlobalFilters,可使用内置过滤器也可使用自定义过滤器,使用起来与Spring过滤器相似。

内置局部过滤器有:30种

spring apigateway header 过大 400错误 springgateway作用_spring cloud_04

 其中AddRequestHeader过滤器yml配置使用示例:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

 内置全局过滤器有:9种

spring apigateway header 过大 400错误 springgateway作用_spring_05

  ReactiveLoadBalancerClientFilter使用示例:

lb代表使用了负载均衡策略。

spring:
  cloud:
    gateway:
      routes:
      - id: myRoute
        uri: lb://service
        predicates:
        - Path=/service/**

内置 Http头部过滤器:3种

HttpHeadersFilters 在向下游发送请求之前应用于请求,例如在NettyRoutingFilter。

在yml配置文件种配置。

spring apigateway header 过大 400错误 springgateway作用_spring cloud_06

自定义过滤器并使用示例:

局部过滤器(细粒度过滤):

@Slf4j
@Component
public class MyGatewayFilter implements GatewayFilter, Ordered {

    //设置readme,即使用ReadBodyRoutePredicateFactory,后通过ServerWebExchange该字段属性可重复读取request body
    private static final String CACHE_REQUEST_BODY_OBJECT_KEY = "cachedRequestBodyObject";

    //过滤器逻辑
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("chain.filter执行前为pre过滤操作");
        return chain.filter(exchange).then(
                Mono.fromRunnable(() -> {
                    log.info("chain.filter执行后为post过滤操作");
                })
        );

    }
    //设定过滤器优先级别
    @Override
    public int getOrder() {
        return 0;
    }
}
@Configuration
public class GateWayConfig {

    @Autowired
    MyGatewayFilter myGatewayFilter

    //局部过滤器需要在设置路由时将过滤器加入对应路由
    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/testFilter/**")
                        .and()
                        .readBody(String.class, requestBody -> true)
                        .filters(f -> f.filter(myGatewayFilter))
                        .uri("lb://mytest"))
                )
                .build();
    }
}

全局过滤器 :

public class YourFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("全局过滤器,直接应用于全局路由过滤");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

在java代码下可通过RouteLocator完成路由配置、readbody封装使用以及过滤器配置。其中的readbody依靠着装饰完成对原始请求body装饰,提取body值入ServerWebExchange的Attribute中,使其可多次读取到。

#以下描述待今后验证,复浏览时的不确定点

注意:在yaml配置下,无法配置ReadBodyRouteRedicateFactory,无法完成对请求body的读取。因此其中配置的自定义过滤器无法完成对请求body读取操作。

赞(0)
未经允许不得转载:上海聚慕医疗器械有限公司 » body是什么厂spring apigateway header 过大 400错误 springgateway作用

登录

找回密码

注册