Spring Cloud Gateway网关微服务实践

作者:禅与计算机程序设计艺术

1.简介

Spring Cloud Gateway 是 Spring Cloud 中的一个基于 Spring Framework 构建的 API 网关。它具有强大的功能,比如动态路由、限流、熔断降级等,适用于微服务架构、API 网关场景。 本文从零开始,带领读者使用Spring Cloud Gateway 来实现微服务架构中的 API 网关功能。

2.基本概念和术语

2.1 Spring Cloud Gateway概述

Spring Cloud Gateway是 Spring Cloud 的一个轻量级的网关框架,使用 Java 开发。它具有以下特征:

  • 提供了一种简单而有效的方式来将现有的微服务架构转换成基于路由的 API 网关。

  • 框架独立于具体的 HTTP 服务器(如 Tomcat、Jetty)之外,这意味着你可以在内部微服务架构之上运行任意数量的网关实例。

  • 支持各种负载均衡策略,包括轮询、加权响应时间、一致性哈希等。

  • 支持断路器模式,当后端服务不可用时,通过中断请求并返回错误消息或默认页面来保护应用免受损害。

  • 支持过滤器链式处理,可对请求和响应进行内容修改、参数传递、权限控制、监控、和审计等。

  • 可集成到任何 Spring Boot 或 Spring Cloud 的应用程序中。

    2.2 路由映射规则

    Spring Cloud Gateway 可以通过声明式的 API 来定义路由映射规则,该规则将客户端请求转发至特定的目标微服务。这些规则可以基于路径、HTTP 方法、Header 值、查询字符串参数以及其他条件进行匹配。

    2.3 请求拦截与过滤

    Spring Cloud Gateway 还支持对请求的拦截,并且允许添加多个 Filter 在请求和响应之间进行操作。Filter 有助于对请求和响应进行内容修改、参数传递、权限控制、监控、和审计等。

    2.4 服务发现与负载均衡

    Spring Cloud Gateway 使用 Netflix Eureka 或 Consul 作为服务注册中心来获取服务列表。网关通过负载均衡策略将请求路由至不同的后端服务实例。

    2.5 配置中心

    Spring Cloud Config Server 可以用来存储和管理应用程序配置。Spring Cloud Gateway 通过配置中心来获取其所需的属性和设置。

    2.6 熔断机制与限流

    熔断机制能够防止向已知故障的服务发送过多的请求,从而避免造成过多资源消耗或系统崩溃。Spring Cloud Gateway 通过超时设置和恢复时间来实现熔断功能。 限流是为了限制流量在系统中的传播速度,防止由于流量激增导致性能下降、资源耗尽或网络拥塞。Spring Cloud Gateway 可以对每个路由进行速率限制或者基于令牌桶算法的分布式限流。

    3. Spring Cloud Gateway入门教程

    本章节,我们将简单介绍如何快速搭建一个 Spring Cloud Gateway 的基础项目。假设你的系统架构如下图所示:

    3.1 创建项目

    首先,创建一个普通的 Spring Boot 项目,引入依赖:

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-webflux</artifactId>
          </dependency>
    
          <!-- spring cloud gateway 依赖 -->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-gateway-mvc</artifactId>
              <version>${spring-cloud.version}</version>
          </dependency>
    
          <!-- eureka client 依赖 -->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
          </dependency>

    注意:这里我使用的版本号 ${spring-cloud.version} ,你需要根据实际情况指定相应的版本号。

    3.2 添加配置文件

    添加 application.yml 文件:

    server:
    port: 8080
    

spring: application: name: api-gateway

cloud: config: enabled: false

eureka: instance: hostname: localhost client: service-url: defaultZone: http://${eureka.instance.hostname}:8761/eureka/ register-with-eureka: false fetch-registry: false

## 3.3 创建控制器
创建 UserController 来接收来自客户端的请求:
```java
@RestController
public class UserController {

    @GetMapping("/user/{id}")
    public Mono<String> getUserById(@PathVariable String id){
        return Mono.just("User " + id);
    }

}

3.4 设置路由规则

然后,创建一个 yml 文件来定义路由规则,例如,我们想让 /api/user/** 的请求都转发给名为 user-service 的服务:

spring:
  cloud:
    gateway:
      routes:
        - id: user_route
          uri: http://localhost:8081
          predicates:
            - Path=/api/user/**
          filters:
            - AddRequestHeader=X-Request-User-Id,{user-id} # 为请求添加自定义 Header,值为用户 ID
  • id : 路由 ID
  • uri: URI 是服务注册表里面的服务名称或者 IP 地址。如果要访问已经注册到 eureka 里面的服务,则只需要填写服务名称即可,比如上面就是 http://localhost:8081 。但是,如果你的应用没有注册到 eureka 中,那么就需要填写完整的服务 URL 地址,比如 http://localhost:8081/user
  • predicates:Predicate 用来匹配请求,Spring Cloud Gateway 有很多内置 Predicate 可以直接使用,也可以自己扩展。比如 Path 用来匹配 URL 的路径。
  • filters:Filter 是用来对请求和响应进行一些操作的。比如添加请求头,添加响应头,修改响应体等。

3.5 测试

启动项目后,在浏览器中访问:http://localhost:8080/api/user/123 会看到:"User 123" 。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133504845
今日推荐