当前位置: 首页 > article >正文

Spring Cloud Gateway:构建高效微服务网关的利器

引言:为什么需要API网关?

在微服务架构中,一个系统往往由数十甚至上百个服务组成。客户端直接与各个服务通信会面临诸多挑战:

  • 复杂的路由管理:不同请求需动态路由到对应服务实例。

  • 安全与认证:每个服务单独处理身份验证会增加重复代码和安全风险。

  • 流量控制与熔断:缺乏统一的限流和容错机制可能导致系统雪崩。

  • 监控与日志:分散的日志难以追踪问题。

API网关作为系统的统一入口,能够高效解决上述问题。而Spring Cloud Gateway凭借其高性能和灵活性,成为Spring生态中网关的首选方案。

与Zuul的对比:为什么选择Spring Cloud Gateway?
特性Spring Cloud GatewayZuul 1.x
架构模型异步非阻塞(WebFlux)同步阻塞(Servlet)
性能高吞吐,低延迟受限于线程池
扩展性灵活的过滤器链过滤器粒度较粗
维护状态官方持续更新已停止维护
注意事项与最佳实践
  1. 避免阻塞操作:Gateway基于Netty,若使用阻塞式代码(如JDBC),需在单独线程池执行。

  2. 合理设计路由规则:按业务模块划分路径,避免过于复杂的断言逻辑。

  3. 监控与健康检查:集成Actuator暴露端点,结合Prometheus监控流量。

一、Spring Cloud Gateway核心特性

  1. 异步非阻塞模型
    基于Project Reactor和WebFlux构建,支持高并发场景,性能远超传统同步网关(如Zuul 1.x)。

  2. 动态路由
    支持通过配置或代码动态调整路由规则,实时生效无需重启。

  3. 强大的断言(Predicate)和过滤器(Filter)

    • 断言:匹配HTTP请求的任意属性(如路径、Header、请求方法)。

    • 过滤器:在请求前后修改内容,支持全局过滤和路由级过滤。

  4. 集成Spring Cloud生态
    无缝对接Eureka、Nacos等服务发现组件,支持Hystrix、Sentinel等熔断限流工具。

二、快速入门:搭建一个网关服务 

1. 添加依赖
<!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--nacos配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
2. 配置路由规则(yaml)
spring:
  cloud:
    gateway:
      routes:
        - id: user-service          # 路由ID
          uri: lb://user-service    # 目标服务地址(lb表示负载均衡)
          predicates:
            - Path=/api/user/**    # 匹配路径,就是controller上的
          filters:
            - StripPrefix=1         # 去除前缀“/api/user”
          
3. 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}
三、其它
1. 自定义全局过滤器(实现JWT认证)
@Component
public class AuthFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (StringUtils.isEmpty(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        // 验证Token合法性(伪代码)
        if (!JwtUtil.validateToken(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
}
2. 集成Sentinel实现限流
spring:
  cloud:
    gateway:
      routes:
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10   # 每秒10个令牌
                redis-rate-limiter.burstCapacity: 20   # 令牌桶容量
                key-resolver: "#{@userKeyResolver}"    # 按用户限流
@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}

http://www.kler.cn/a/544383.html

相关文章:

  • 爬虫抓取过程的详细步骤
  • 二、交换机的vlan子设备接入
  • 称呼计算器:智能科技,简化您的计算生活
  • elementuiPlus日期范围选择el-date-picker动态禁用时间选择
  • 【JavaEE进阶】依赖注入 DI详解
  • 【vs2022配置cursor】
  • 3.Excel:销售主管大华-前两季度-销售情况❗(16)
  • 排序函数集合:冒泡排序、选择排序、插入排序、快速排序、归并排序、桶排序
  • 如何使用 CSS 隐藏元素
  • 【MySQL例题】我在广州学Mysql 系列——有关数据备份与还原的示例
  • excel 日期转换
  • 比亚迪“璇玑架构”全面接入DeepSeek
  • 《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?要怎么解决?
  • git客户端版本下载
  • 01docker run
  • 【ROS2综合案例】乌龟跟随
  • This dependency was not found: * @logicflow/core/dist/LogicFlow.css
  • 解决 idea 无法创建java8 模版
  • 详解 JavaScript 中 fetch 方法
  • 【CXX-Qt】0 Rust与Qt集成实践指南(CXX-Qt)
  • 关闭浏览器安全dns解决访问速度慢的问题
  • 基于JAVA的牙科诊所管理系统的设计与实现(LW+源码+讲解)
  • RocketMQ的缺点是什么?Kafka的缺点是什么?使用场景有什么区别?
  • 技术革新让生活更便捷
  • 八、OSG学习笔记-
  • 称呼计算器:智能科技,简化您的计算生活