SpringCloud Gateway---SpringCloud网关

本文深入探讨SpringCloudGateway在分布式系统中的作用,作为一款功能丰富的微服务网关,它提供了路由、流量控制、熔断降级和安全验证等功能。相较于nginx,Gateway在实现上更广泛。基于SpringWebflux的实现,Gateway在高网络IO场景下表现出更好的吞吐量和伸缩性。文章还详细介绍了路由谓词工厂和过滤器的使用,包括自定义过滤器的实现,并指出在yaml配置中无法直接配置读取请求body。最后,讨论了如何在代码中处理和修改转发请求的Body。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud Gateway:

 

作用:

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

实现方式:

SpringBoot Gateway基于Spring Webflux实现。

Spring Webflux与SpringMVC:

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

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

请求处理流程图如下:

粗略流程图:

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

详细流程图:

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

路由谓词Predicate:

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

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

 其中的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

路由过滤器Filter:

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

内置局部过滤器有:30种

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

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

 内置全局过滤器有:9种

  ReactiveLoadBalancerClientFilter使用示例:

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

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

内置 Http头部过滤器:3种

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

在yml配置文件种配置。

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

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

@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;
    }
}

使用请求body总结:

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

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

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

转发请求Body修改操作参考博文:

参考博文:Spring Cloud Gateway(读取、修改 Request Body) shiy

<think>嗯,用户现在想了解SpringCloud Gateway作为API网关的作用和功能。之前我们讨论过OpenFeign的服务间调用,现在转向API网关,可能需要先理清两者的关系。用户可能是在构建微服务架构,需要了解不同组件的分工。SpringCloud Gateway和OpenFeign都属于SpringCloud生态,但职责不同,前者负责入口流量管理,后者处理服务间调用。首先,我需要根据提供的引用内容整理Gateway的作用。引用[1]提到它处理请求路由、认证授权、限流降级,高性能且与Spring生态集成。引用[2]补充了负载均衡、服务发现等功能。引用[4]提到Filter分为GatewayFilter和GlobalFilter,用于处理请求。用户的问题可能希望得到详细的功能分类,比如路由、过滤、负载均衡等。需要确保每个功能点都有对应的引用支持。同时,用户之前的讨论涉及OpenFeign的声明式调用和负载均衡,这里可以对比Gateway的负载均衡是服务端还是客户端?根据引用[2],Gateway自己处理负载均衡,可能集成Ribbon或者SpringCloud LoadBalancer。 需要注意回答的结构,按照核心作用分点,每个点下展开子功能。比如路由转发作为第一点,包括动态路由、路径匹配等。然后安全相关,如认证授权,接着是流量控制,如限流降级。还有过滤器机制,集成监控等。此外,要区分与Zuul的差异,比如性能更高,基于异步非阻塞模型。可能用户没有明确问比较,但提到其他网关如Zuul,可以简要说明优势。同时,确保每个功能点都有引用标注,比如动态路由引用[1][2],过滤器引用[4],限流引用[1][2]等。需要避免技术术语过于复杂,用易懂的语言解释。比如动态代理和路由的区别,可能需要关联用户之前了解的OpenFeign动态代理,但这里是网关级别的路由。另外,问题部分需要生成相关问题,可能涉及配置步骤、过滤器使用、性能优化、与Zuul对比、限流实现等,确保问题有逻辑关联,帮助用户深入理解。</think>### Spring Cloud Gateway作为API网关的作用与功能 --- #### 1. **统一入口与路由转发** - **动态路由配置**:通过简单的YAML或Java配置,将外部请求路由到不同的微服务实例[^1][^2]。例如,将`/user/**`的请求转发到用户服务,`/order/**`的请求转发到订单服务。 - **路径匹配与重写**:支持通配符、正则表达式匹配请求路径,并可对请求路径进行重写[^3]。 - **负载均衡**:集成服务发现(如Eureka、Consul),自动从注册中心获取服务实例列表,并通过负载均衡策略(如轮询、权重)分配请求[^2]。 #### 2. **安全控制与权限管理** - **认证与鉴权**:通过集成OAuth2、JWT等机制,实现请求的身份验证(如校验Token)和权限控制(如角色校验)[^1][^2]。 - **请求头处理**:可添加、修改或删除请求头,例如透传认证信息或添加自定义标头。 #### 3. **流量控制与容错保护** - **限流(Rate Limiting)**:基于令牌桶、漏桶算法限制接口的请求频率,防止突发流量压垮服务[^1][^2]。例如配置每秒最多100次请求。 - **熔断降级**:与Hystrix或Resilience4j集成,在服务响应超时或异常时触发熔断,返回预设的降级响应(如默认错误页)[^1]。 - **重试机制**:针对服务调用失败的情况,配置重试次数和条件(如仅对GET请求重试)。 #### 4. **请求与响应处理** - **过滤器链(Filters)**:通过内置或自定义的`GatewayFilter`和`GlobalFilter`,实现请求的预处理和响应的后处理[^4]。例如: - **日志记录**:记录请求参数和响应状态。 - **请求耗时统计**:添加计时过滤器统计接口性能。 - **请求体修改**:压缩请求内容或加密敏感数据。 - **跨域处理(CORS)**:统一配置跨域请求的允许来源、方法和头部信息。 #### 5. **监控与可观测性** - **集成监控工具**:支持对接Prometheus、Spring Boot Actuator,暴露网关的流量指标(如请求量、延迟、错误率)[^1]。 - **链路追踪**:通过集成Sleuth和Zipkin,为请求添加唯一Trace ID,实现全链路追踪。 #### 6. **性能优化** - **异步非阻塞模型**:基于Netty和Reactor实现高并发处理能力,对比传统同步网关(如Zuul 1.x)性能提升显著[^3]。 - **响应缓存**:缓存高频请求的响应结果,减少后端服务压力。 --- ### 示例:路由配置 ```yaml spring: cloud: gateway: routes: - id: user_service uri: lb://user-service # 负载均衡到user-service服务 predicates: - Path=/api/user/** filters: - StripPrefix=2 # 移除路径前缀/api/user - AddRequestHeader=X-Request-From, gateway ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅尝即止何来突破

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值