使用springcloud gateway搭建网关(分流,限流,熔断)

Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

相关概念:

  • Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
  • Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
  • Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

工作流程:

客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

Spring Cloud Gateway 的特征:

  • 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
  • 动态路由
  • Predicates 和 Filters 作用于特定路由
  • 集成 Hystrix 断路器
  • 集成 Spring Cloud DiscoveryClient
  • 易于编写的 Predicates 和 Filters
  • 限流
  • 路径重写

 快速上手

引入spring-boot  2.1.1.RELEASE ,springcloud的版本为 Greenwich.M3

 

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.M3</spring-cloud.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 

 添加的依赖包如下

 

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

 

 注意springcloud gateway使用的web框架为webflux,和springMVC不兼容。引入的限流组件是hystrix。redis底层不再使用jedis,而是lettuce。

路由断言

 接下来就是配置了,可以使用java代码硬编码配置路由过滤器,也可以使用yml配置文件配置。下面我们首先介绍配置文件配置方式

application.yml

 

server.port: 8082

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://localhost:8000
          order: 0
          predicates:
            - Path=/foo/**
          filters:
            - StripPrefix=1

 

 上面给出了一个根据请求路径来匹配目标uri的例子,如果请求的路径为/foo/bar,则目标uri为 http://localhost:8000/bar。如果上面例子中没有加一个StripPrefix=1过滤器,则目标uri 为http://localhost:8000/foo/bar,StripPrefix过滤器是去掉一个路径。

 其他的路由断言和过滤器使用方法请查看官网

 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RC2/single/spring-cloud-gateway.html#gateway-how-it-works

 接下来我们来看一下设计一个网关应该需要的一些功能

修改接口返回报文

因为网关路由的接口返回报文格式各异,并且网关也有有一些限流、认证、熔断降级的返回报文,为了统一这些报文的返回格式,网关必须要对接口的返回报文进行修改,过滤器代码如下:

 

package org.gateway.filter.global;

import java.nio.charset.Charset;

import org.gateway.response.Response;
import org.reactivestreams.Publisher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import com.alibaba.fastjson.JSON;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Component
public class WrapperResponseFilter implements GlobalFilter, Ordered {
    @Override
    public int getOrder() {
        // -1 is response write filter, must be called before that
        return -2;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpResponse originalResponse = exchange.getResponse();
        DataBufferFactory bufferFactory = originalResponse.bufferFactory();
        ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
            @Override
 
### Spring Cloud Gateway 使用指南、问题解决与最佳实践 Spring Cloud Gateway 是 Spring 官方推出的 API 网关解决方案,基于 Project Reactor 和 Netty 构建,具备高性能和可扩展性。它旨在为微服务架构提供统一的入口点,并支持路由、过滤、限流等功能。 #### 核心组件与功能 Spring Cloud Gateway 的核心组件包括 **Route(路由)**、**Predicate(断言)** 和 **Filter(过滤器)**: - **Route**:由 ID、目标 URI、一系列断言和过滤器组成,是网关的基本路由单元。 - **Predicate**:用于匹配 HTTP 请求,决定请求是否转发到对应的服务实例。 - **Filter**:对匹配的请求进行修改或增强操作,例如添加头信息、重定向等[^1]。 在实际应用中,可以通过 `application.yml` 配置文件定义路由规则。例如,以下配置将所有请求路径添加 `/mypath` 前缀后再转发到目标地址: ```yaml spring: cloud: gateway: routes: - id: prefixpath_route uri: https://example.org filters: - PrefixPath=/mypath ``` #### 常见问题与解决方法 1. **限流问题** Spring Cloud Gateway 支持使用 Redis 实现限流功能,通过 `RequestRateLimiter` 过滤器实现。该机制依赖于 Lua 脚本在 Redis 中执行原子操作,确保高并发下的限流准确性。Redis 中会存储两个 key,分别用于记录时间窗口内的请求数量和时间戳。若需自定义限流策略,可以修改 Lua 脚本逻辑以满足业务需求[^2]。 2. **路由不生效** 如果定义的路由未按预期工作,首先应检查日志输出,确认是否有匹配失败的信息。常见的原因包括 Predicate 配置错误、URI 地址格式不正确等。此外,确保 `GatewayAutoConfiguration` 已被正确加载,必要时可手动注册相关 Bean。 3. **跨域问题** 在前后端分离架构中,跨域问题是常见挑战。可通过配置全局过滤器 `WebFilter` 或在路由中使用 `AddResponseHeader` 添加 CORS 相关头信息来解决。 4. **性能瓶颈** 尽管 Spring Cloud Gateway 基于 Netty 实现异步非阻塞 I/O,但在高并发场景下仍可能遇到性能瓶颈。建议优化线程池配置、减少不必要的过滤器链调用,并合理利用缓存机制。 #### 最佳实践 1. **合理设计路由规则** 将相似业务的路由归类管理,避免单一路由配置过于复杂。推荐使用服务发现机制自动获取后端服务地址,提高灵活性和可维护性。 2. **使用断路器与熔断机制** 结合 Resilience4j 或 Hystrix 实现服务降级与熔断,提升系统的稳定性和容错能力。在网关层面对异常情况进行统一处理,避免故障扩散。 3. **监控与日志追踪** 利用 Spring Boot Actuator 提供的健康检查接口以及集成 Sleuth + Zipkin 实现分布式链路追踪,帮助快速定位问题并分析系统行为。 4. **安全性保障** 在网关层面实施身份认证与权限控制,如 OAuth2、JWT 等机制,保护内部服务免受非法访问。同时,启用 HTTPS 加密通信,防止数据泄露。 5. **灰度发布与 A/B 测试** 利用 Gateway 的谓词组合能力,实现基于请求头、用户特征等条件的流量分流,从而支持灰度发布和 A/B 测试策略。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值