springcloud-GateWay

Spring Cloud Gateway 是 Spring Cloud 微服务架构中的一个重要组件,用于提供 API 网关功能。作为 API 网关,Spring Cloud Gateway 充当客户端和后端服务之间的代理,负责请求路由、过滤、安全认证、负载均衡等功能。在分布式系统中,网关是非常关键的,它可以统一管理所有服务的入口,简化客户端调用,增强系统的安全性和稳定性。

1. Spring Cloud Gateway 的作用

Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Spring WebFlux 构建的,它提供了一种简单而高效的方式来实现 API 网关功能。Spring Cloud Gateway 的主要功能包括:

  • 路由:根据请求的 URL、请求头或其他条件将请求路由到后端服务。
  • 过滤:提供请求和响应的前置和后置过滤器,能够进行认证、限流、日志记录等操作。
  • 负载均衡:可以与 Spring Cloud LoadBalancer 结合使用,支持负载均衡功能。
  • 安全性:支持与 OAuth 2.0、JWT 以及其他安全框架的集成,确保请求的安全。

2. Spring Cloud Gateway 项目搭建

2.1 引入依赖

首先,在 Spring Boot 项目中引入 Spring Cloud Gateway 的依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

如果项目中已经使用了 Spring Cloud 组件,需要添加 Spring Cloud 的版本依赖管理:

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR12</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
2.2 基本配置

application.yml 中,我们可以配置 Spring Cloud Gateway 的路由规则。以下是一个简单的路由配置示例:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: service-route
          uri: http://localhost:8081
          predicates:
            - Path=/api/service/**
          filters:
            - StripPrefix=2

在这个配置中:

  • id 是路由的唯一标识。
  • uri 是请求被路由到的目标服务地址。
  • predicates 是路由匹配条件,在这里使用的是 Path 谓词,将 /api/service/** 路径的请求路由到指定服务。
  • filters 是过滤器配置,在这里 StripPrefix=2 表示去除请求路径中的前两部分路径,如 /api/service/xxx 变为 /xxx

3. 路由与谓词

Spring Cloud Gateway 的路由由 谓词过滤器 构成。谓词决定请求是否符合路由条件,过滤器则用于处理请求或响应。

3.1 常用谓词

Spring Cloud Gateway 提供了多种谓词(Predicates),用于定义路由规则。例如:

  • Path:根据请求的路径匹配。
  • Host:根据请求的 Host 匹配。
  • Method:根据 HTTP 请求方法匹配,如 GET、POST。
  • Header:根据请求头匹配。
  • Query:根据请求参数匹配。

以下是一个路由配置示例,展示了常用的谓词:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/user/**
            - Method=GET
          filters:
            - AddRequestHeader=X-Request-User, User

在这个示例中,所有以 /user/** 开头的 GET 请求会被路由到 USER-SERVICE,并添加一个请求头 X-Request-User

3.2 自定义谓词

除了内置的谓词,Spring Cloud Gateway 还允许自定义谓词。可以通过实现 RoutePredicateFactory 来实现自定义谓词。例如,下面实现了一个自定义谓词,匹配客户端 IP 地址:

java 复制代码
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.web.server.ServerWebExchange;

import java.util.function.Predicate;

public class IpCheckRoutePredicateFactory extends AbstractRoutePredicateFactory<IpCheckRoutePredicateFactory.Config> {

    public IpCheckRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            String clientIp = exchange.getRequest().getRemoteAddress().getHostString();
            return config.allowedIps.contains(clientIp);
        };
    }

    public static class Config {
        private List<String> allowedIps;

        // Getters and Setters
    }
}

在配置文件中使用自定义谓词:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: ip-filter-route
          uri: http://localhost:8081
          predicates:
            - Path=/admin/**
            - IpCheck=192.168.1.1, 192.168.1.2

4. 过滤器

过滤器(Filters)用于在请求和响应的过程中对数据进行处理。Spring Cloud Gateway 提供了两种类型的过滤器:

  • 全局过滤器:应用于所有路由。
  • 路由过滤器:只应用于特定路由。
4.1 常用过滤器

一些常用的路由过滤器包括:

  • AddRequestHeader:为请求添加请求头。
  • StripPrefix:移除请求路径中的前缀。
  • AddResponseHeader:为响应添加响应头。
  • RequestRateLimiter:限流。

例如,以下配置为请求添加一个自定义请求头:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: add-header-route
          uri: http://localhost:8081
          predicates:
            - Path=/api/addheader/**
          filters:
            - AddRequestHeader=X-Custom-Header, Value
4.2 限流过滤器

Spring Cloud Gateway 提供了基于 Redis 的限流过滤器 RequestRateLimiter,用于限制某个路由的请求速率。

首先,需要在项目中引入 spring-boot-starter-data-redis 依赖,以支持 Redis:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后,在配置文件中添加限流规则:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: rate-limiter-route
          uri: http://localhost:8081
          predicates:
            - Path=/api/ratelimit/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10  # 每秒补充令牌数
                redis-rate-limiter.burstCapacity: 20  # 最大令牌桶容量
                key-resolver: '#{@ipKeyResolver}'

这里使用了 RequestRateLimiter 过滤器,并定义了每秒允许 10 个请求,最大令牌桶容量为 20。

还需要定义一个 IP 地址作为限流依据的 KeyResolver

java 复制代码
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

@Configuration
public class RateLimiterConfig {

    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostString());
    }
}

5. 集成 Spring Cloud Eureka 和负载均衡

Spring Cloud Gateway 可以无缝集成 Spring Cloud Eureka 来实现服务发现和负载均衡。要启用服务发现和负载均衡,首先需要引入相关依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

application.yml 中,配置 Eureka 客户端并启用负载均衡:

yaml 复制代码
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    preferIpAddress: true

spring:
  cloud:
    gateway:
      routes:
        - id: lb-route
          uri: lb://USER-SERVICE
          predicates:
            - Path=/user/**

在这个示例中,我们将请求路由到 Eureka 注册的 USER-SERVICE,并通过 Spring Cloud LoadBalancer 实现负载均衡。

6. 总

Spring Cloud Gateway 是一个功能强大、扩展性强的 API 网关解决方案,特别适合在 Spring Cloud 微服务架构中使用。通过 Spring Cloud Gateway,可以轻松实现路由、过滤、负载均衡、限流等功能,为分布式系统提供可靠的服务网关。本文详细介绍了 Spring Cloud Gateway 的路由、谓词、过滤器及限流等功能,并展示了如何集成 Spring Cloud Eureka 和 Redis,构建一个完整的网关服务。

相关推荐
胡耀超10 分钟前
MyBatis-Plus插入优化:降低IO操作的策略与实践
sql·spring·mybatis
GoppViper29 分钟前
golang学习笔记24——golang微服务中配置管理问题的深度剖析
笔记·后端·学习·微服务·golang·配置管理
景天科技苑29 分钟前
【Go】Go语言中延迟函数、函数数据的类型、匿名函数、闭包等高阶函数用法与应用实战
后端·golang·回调函数·defer·匿名函数·闭包·go函数数据类型
ZachOn1y1 小时前
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器
java·jvm·后端·java-ee·团队开发·个人开发
齐 飞1 小时前
使用jackson将xml和对象、List相互转换
xml·java·spring boot·后端·list
苹果酱05673 小时前
使用 React Testing Library 测试自定义 React Hooks
java·开发语言·spring boot·后端·中间件
api773 小时前
1688商品详情API返回值中的售后保障与服务信息
java·服务器·前端·javascript·python·spring·pygame
自身就是太阳3 小时前
深入理解 Spring 事务管理及其配置
java·开发语言·数据库·spring
Aries2635 小时前
Spring事务传播行为详解
java·数据库·spring
陌上少年,且听这风吟5 小时前
【已解决】SpringBoot3项目整合Druid依赖:Druid监控页面404报错
java·spring boot·spring