网关(Spring Cloud Gateway)讲解

以下是使用 Spring Cloud Gateway 连接前端与后端微服务的详细步骤,涵盖路由配置、过滤器链、负载均衡和动态路由管理:
主要功能前端通过访问一个固定的端口,可以通过Spring Cloud Gateway来访问到微服务里面的不同的端口里面的,可以通过如下的图片理解一下;
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bbf216aaf8ef4f8a92a2e057e0951d66.png
在这里插入图片描述
在这里插入图片描述


1. 环境准备

版本兼容性
Spring BootSpring CloudSpring Cloud Gateway
2.7.x2021.0.53.1.5
3.0.x2022.0.04.0.0

2. 创建一个新的网关模块

(1) 父级 添加依赖

在父工程 pom.xml 中引入以下依赖:

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud Alibaba 依赖管理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2022.0.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2) 子模块 添加依赖

在网关模块的 pom.xml 中引入以下依赖:

<!-- Spring Cloud Gateway -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- 服务发现(以 Nacos 为例) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- 负载均衡(Spring Cloud 2020.x+ 默认使用 LoadBalancer) -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

3. 配置路由规则

application.yml 中定义路由规则:

server:
  port: 8080  # 网关端口

spring:
  application:
    name: api-gateway  # 服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # Nacos 注册中心地址
    gateway:
      routes:
        # 示例1:将前端请求路由到用户服务
        - id: user-service-route  # id自己来取,最好和对应的服务名称相关
          uri: lb://user-service  # lb:// 表示负载均衡,user-service 是注册的服务名
          predicates:
            - Path=/api/user/**   # 匹配请求路径,和controller的顶级路径一样,可以写多个
          filters:
            - StripPrefix=1       # 去掉路径前缀(如 /api/user/xxx → /xxx)
            - AddRequestHeader=X-Request-Redirected, Gateway

        # 示例2:静态路由(直接转发到指定 URL)
        - id: static-route
          uri: http://example.com
          predicates:
            - Path=/static/**

      # 全局跨域配置(可选)
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"
            allowedHeaders: "*"

4. 启用服务发现与负载均衡

在主启动类添加注解:

@SpringBootApplication
@EnableDiscoveryClient  // 启用服务发现
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

5. 自定义过滤器

(1) 全局鉴权过滤器
@Component
public class AuthFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (token == null) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
}
(2) 请求日志过滤器
@Component
public class LoggingFilter implements GlobalFilter {

    private static final Logger log = LoggerFactory.getLogger(LoggingFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("Request path: {}", exchange.getRequest().getPath());
        return chain.filter(exchange);
    }
}

6. 动态路由配置

通过 RouteDefinitionLocator 实现动态路由(如从数据库读取路由规则):

@Bean
public RouteLocator dynamicRoutes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("dynamic-route", r -> r.path("/dynamic/**")
            .filters(f -> f.stripPrefix(1))
            .uri("lb://dynamic-service")
        .build();
}

7. 验证网关功能

(1) 测试路由转发
  • 访问 http://localhost:8080/api/user/1 → 转发到 user-service/1 接口。
  • 访问 http://localhost:8080/static/resource → 转发到 http://example.com/resource
(2) 查看注册中心
  • 登录 Nacos 控制台(http://localhost:8848/nacos),确认 api-gatewayuser-service 已注册。
(3) 检查过滤器日志
  • 观察控制台输出,确认 LoggingFilter 打印了请求路径。

8. 高级配置

(1) 限流与熔断

集成 Sentinel 实现网关层限流:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

配置限流规则:

spring:
  cloud:
    sentinel:
      filter:
        enabled: false  # 关闭默认的 Servlet 过滤器
      transport:
        dashboard: localhost:8080
      scg:
        fallback:
          mode: response
          response-status: 429
          response-body: '{"code": 429, "msg": "请求过多"}'
(2) 灰度发布

通过 Weight 断言实现按权重路由:

spring:
  cloud:
    gateway:
      routes:
        - id: gray-route
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
            - Weight=group1, 20  # 20%流量路由到新版本

9. 常见问题

问题 1:路由未生效
  • 原因:路由配置路径不匹配或服务名错误。
  • 解决:检查 predicatesPath 规则和 uri 中的服务名。
问题 2:服务发现失败
  • 原因:Nacos 未启动或网关未正确连接。
  • 解决:检查 Nacos 控制台,确认 spring.cloud.nacos.discovery.server-addr 配置正确。
问题 3:跨域问题
  • 解决:确保 globalcors 配置正确,或在前端配置代理。

总结

通过 Spring Cloud Gateway,你可以实现以下功能:

  1. 路由转发:将前端请求分发到不同微服务。
  2. 负载均衡:集成 Ribbon 或 LoadBalancer 自动选择服务实例。
  3. 过滤器链:实现鉴权、日志、限流等统一逻辑。
  4. 动态路由:支持实时更新路由规则。

结合 Nacos 服务发现和 Sentinel 限流,可构建高可用、安全的 API 网关层。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值