Gateway使用简介

Gateway

网关路由的作用

网关(Gateway)是微服务架构中重要的一环,用于实现请求的统一入口。Spring Cloud Gateway 是基于 Spring WebFlux 构建的高效网关,支持动态路由、限流、过滤、熔断等功能。

网关路由的核心功能

  1. 路由转发:根据请求路径、参数、Header 等规则将请求转发到对应的微服务。
  2. 负载均衡:与注册中心(如 Nacos、Eureka)集成,实现服务发现与负载均衡。
  3. 统一入口:对外暴露一个公共的 API 网关 URL,隐藏微服务内部细节。
  4. 增强功能:支持请求过滤、鉴权、限流、熔断等功能。

使用 Spring Cloud Gateway 实现简单路由

以下是一个网关路由的完整使用示例。

场景描述

  • 系统中有两个服务:
    1. user-service:提供用户服务。
    2. order-service:提供订单服务。
  • 使用 Gateway 实现以下功能:
    • 访问 /user/** 路径时转发到 user-service
    • 访问 /order/** 路径时转发到 order-service

1. 准备工作

1.1 引入依赖

在 Gateway 网关服务的 pom.xml 中引入以下依赖:

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2. 配置路由规则

在 Gateway 服务的 application.yml 中配置路由规则。

2.1 基于静态路由的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
cloud:
gateway:
routes:
- id: user-service-route
uri: lb://user-service # 将请求转发到 user-service
predicates:
- Path=/user/** # 匹配 /user/** 的路径

- id: order-service-route
uri: lb://order-service # 将请求转发到 order-service
predicates:
- Path=/order/** # 匹配 /order/** 的路径
discovery:
locator:
enabled: true # 启用服务发现功能,自动创建路由

配置说明:

  • id:路由规则的唯一标识。

  • uri:路由目标服务地址,lb:// 表示使用负载均衡,后面是微服务的名称(需要和注册中心保持一致)。

  • predicates:路由条件,Path 表示匹配路径规则。

discovery.locator.enabled 的作用

在 Spring Cloud Gateway 中,discovery.locator.enabled 是一个非常重要的配置项。它的作用是 启用服务发现自动路由功能。通过这个配置,Spring Cloud Gateway 可以自动从服务注册中心(如 Nacos、Eureka)中发现已经注册的微服务,并为这些微服务动态创建路由,而无需手动为每个微服务单独配置路由规则。

工作原理

  1. spring.cloud.gateway.discovery.locator.enabled 设置为 true 时,网关会自动从服务注册中心获取所有已注册的微服务信息。

  2. 对于每个已注册的微服务,Spring Cloud Gateway 会自动生成一条默认的路由规则:

   - 默认路由的 URIlb://服务名称,表示通过负载均衡访问该服务。

   - 默认路由的 路径/服务名称/**,表示所有以 /服务名称/ 开头的请求都会被转发到该服务。

3. 注册中心与服务注册

确保 user-service 和 order-service 服务已经注册到 Nacos 注册中心,并正确启动。

在 user-service 和 order-service 的 application.yml 文件中配置如下(示例):

1
2
3
4
5
6
7
spring:
application:
name: user-service # 服务名称(order-service 类似)
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos 地址

当服务启动后,会自动注册到 Nacos。

4. 启动 Gateway 网关服务

在 Gateway 服务的启动类中,添加注解 @EnableDiscoveryClient,启用服务注册功能。

1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}

5. 验证路由功能

  1. 启动 Nacos 注册中心。

  2. 启动 user-service 和 order-service 服务。

  3. 启动 Gateway 网关服务。

访问以下地址:

  • 访问用户服务

    • http://localhost:8080/user/1

Gateway 会将请求转发到 user-service,返回用户信息。

  • 访问订单服务

    • http://localhost:8080/order/123

Gateway 会将请求转发到 order-service,返回订单信息。

6. 增强网关功能

6.1 添加过滤器

Spring Cloud Gateway 支持全局过滤器和路由级别的过滤器,用于实现请求增强功能(如鉴权、日志记录等)。

示例:在 /user/** 路由上添加一个请求头。

1
2
3
4
5
6
7
8
9
10
spring:
cloud:
gateway:
routes:
- id: user-service-route
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- AddRequestHeader=X-User-Header, MyHeaderValue # 添加自定义请求头

6.2 全局过滤器

全局过滤器适用于所有路由,可以通过编写自定义过滤器来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("Global Filter: Logging Request Path = " + exchange.getRequest().getPath());
return chain.filter(exchange);
}

@Override
public int getOrder() {
return 0; // 设置过滤器优先级
}
}

6.3 限流功能

Spring Cloud Gateway 内置了限流功能,可以通过 RedisRateLimiter 实现简单的令牌桶限流。

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
cloud:
gateway:
routes:
- id: user-service-route
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒生成 10 个令牌
redis-rate-limiter.burstCapacity: 20 # 最大令牌数

7. 总结

Spring Cloud Gateway 提供了强大的网关功能:

  1. 路由转发:通过简单的配置即可实现微服务间的路由规则。

  2. 服务发现:结合注册中心(如 Nacos)实现动态路由。

  3. 增强功能:支持过滤器、限流、鉴权等功能。

  4. 易于扩展:可以编写自定义过滤器,满足复杂业务需求。

通过 Gateway,可以实现微服务的统一入口管理,让整个系统架构更加灵活、高效。