暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

初识 Spring Cloud Gateway

源话编程 2024-08-01
127

👋 热爱编程的小伙伴们,欢迎来到我的编程技术分享公众号!在这里,我会分享编程技巧、实战经验、技术干货,还有各种有趣的编程话题!

Spring Cloud Gateway 是一个基于 Spring Boot 2.x 的 API 网关,用于构建微服务架构中的网关服务。它提供了路由、过滤、限流、熔断等功能,帮助开发者快速构建高可用、高性能的微服务系统。本文将从以下几个方面详细讲解 Spring Cloud Gateway 的使用方法和相关概念。

1. Spring Cloud Gateway 简介

1.1 什么是 API 网关

API 网关是微服务架构中的一个重要组件,它处于服务提供者和消费者之间,负责处理各种客户端请求。API 网关可以提供统一的入口,实现请求路由、协议转换、负载均衡、身份认证、限流熔断等功能。

简单来说,API 网关就像一个餐厅的服务员。你点菜(发送请求),服务员会将你的订单传递给厨房(后端服务),然后将准备好的食物送到你的桌子上(返回响应)。服务员还会处理你的特殊要求,比如不加盐(请求限流、数据转换等)。

1.2 Spring Cloud Gateway 的特点

  • 基于 Spring Boot,简化开发和部署
  • 灵活的路由配置,支持多种路由策略
  • 强大的过滤功能,支持自定义过滤器
  • 集成限流、熔断等安全措施
  • 支持动态配置,无需重启服务

2. 快速入门

2.1 添加依赖

pom.xml
文件中添加 Spring Cloud Gateway 依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.2 配置文件

application.yml
application.properties
文件中配置 Spring Cloud Gateway 路由规则:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**
        filters:
        - StripPrefix=1

解析:

  • id
    : 路由的唯一标识。
  • uri
    : 目标微服务的地址,lb://user-service
    表示使用负载均衡(LoadBalancer)将请求路由到名为 user-service
    的服务实例。
  • predicates
    : 路由条件,Path=/user-service/**
    表示匹配以 /user-service/
    开头的所有路径。
  • filters
    : 过滤器,StripPrefix=1
    表示去掉请求路径中的前缀 /user-service
    ,使得请求到达目标服务时路径不包含 /user-service

2.3 启动类

在 Spring Boot 应用的启动类上添加 @SpringBootApplication
@EnableDiscoveryClient
注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.classargs);
    }
}

3. 路由配置

3.1 路由定位器

Spring Cloud Gateway 使用 RouteLocator
来获取所有的路由规则。可以通过注入 RouteLocator
来获取路由信息:

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RouteController {

    private final RouteLocator routeLocator;

    public RouteController(RouteLocator routeLocator) {
        this.routeLocator = routeLocator;
    }

    @GetMapping("/routes")
    public String routes() {
        return routeLocator.getRoutes().toString();
    }
}

3.2 动态路由

Spring Cloud Gateway 支持动态路由配置,可以通过实现 RouteLocator
接口来自定义路由定位逻辑。

4. 过滤器

4.1 过滤器的作用

过滤器可以在请求到达目标微服务之前或响应返回客户端之前对请求或响应进行处理。

4.2 内置过滤器

Spring Cloud Gateway 提供了许多内置过滤器,例如:

  • AddRequestHeader
    : 添加请求头
  • AddResponseHeader
    : 添加响应头
  • Hystrix
    : 熔断处理
  • RequestRateLimiter
    : 限流处理

4.3 自定义过滤器

可以通过实现 GatewayFilter
接口来创建自定义过滤器:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomFilterFactory extends AbstractGatewayFilterFactory<CustomFilterFactory.Config{

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

    @Override
    public GatewayFilter apply(Config config) {
        // 在请求处理之前执行的逻辑
        return (exchange, chain) -> {
            // ...
            return chain.filter(exchange);
        };
    }

    public static class Config {
        // 可以定义配置类,如果需要的话
    }
}

5. 限流和熔断

5.1 限流

使用 RequestRateLimiter
过滤器可以实现限流功能。首先需要在配置文件中配置限流规则:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**
        filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10   # 每秒添加 10 个令牌
            redis-rate-limiter.burstCapacity: 20  # 桶容量

5.2 熔断

使用 Hystrix
过滤器可以实现熔断功能。配置熔断规则:

spring:
  cloud:
    gateway:
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**
        filters:
        - Hystrix=myCommandKey

其中 myCommandKey
是自定义的命令键,用于标识具体的熔断策略。

结语

Spring Cloud Gateway 是一个功能强大且易于使用的 API 网关,它通过灵活的路由配置、丰富的过滤器和强大的安全措施,帮助开发者构建高可用、高性能的微服务系统。通过阅读本文,读者应该能够了解 Spring Cloud Gateway 的基本使用方法和相关概念。


个人观点,仅供参考,非常感谢各位朋友们的支持与关注

如果你觉得这个作品对你有帮助,请不吝点赞在看,分享给身边更多的朋友。如果你有任何疑问或建议,欢迎在评论区留言交流。


文章转载自源话编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论