likes
comments
collection
share

初级程序员必须懂的微服务SpringCloud GateWay

作者站长头像
站长
· 阅读数 15

背景

Spring Cloud Gateway 的背景可以追溯到微服务架构的兴起和云计算的普及。微服务架构将应用程序拆分为小型、独立部署的服务,每个服务都专注于执行特定功能。这种架构提供了众多优势,如灵活性、可伸缩性和独立部署。然而,它也引入了一些挑战,包括服务发现、负载均衡、安全性、监控等问题。

在这个背景下,API 网关成为解决这些挑战的重要组件之一。API 网关充当了前端客户端和后端微服务之间的入口点,为微服务提供了一种集中式的、可管理的方式来处理请求。Spring Cloud Gateway 就是在这个背景下应运而生的。

一些背景信息包括:

  1. 微服务架构兴起: 微服务架构的流行导致了应用程序的拆分为多个微服务。每个微服务负责执行一个独立的功能,这样可以提高开发速度和应用程序的可伸缩性。

  2. 需求增加: 随着微服务数量的增加,需要一种机制来处理服务之间的通信、路由、安全性、监控和管理。

  3. 云计算和容器化: 云计算和容器化技术的兴起进一步增加了微服务架构的重要性。容器编排工具如 Kubernetes 提供了微服务的自动化部署和管理,需要强大的 API 网关来与这些环境集成。

  4. Spring Cloud 生态系统: Spring Cloud 是构建微服务应用程序的一套工具和框架的生态系统,它构建在 Spring 框架之上。Spring Cloud Gateway 是 Spring Cloud 生态系统的一部分,旨在解决微服务架构中的网关需求。

因此,Spring Cloud Gateway 的背景可以总结为对微服务架构中的通信和管理需求的响应,以及对更强大、灵活的 API 网关的需求,以便更好地管理和保护微服务。它在这个背景下成为了构建微服务架构的关键组件之一。

网关对比

在构建微服务架构或分布式系统时,选择合适的网关非常重要,因为它将直接影响到系统的性能、安全性和可维护性。以下是一些常见的网关,它们之间的比较:

  1. Spring Cloud Gateway

    • 背景:Spring Cloud 生态系统的一部分,构建在 Spring 框架之上。
    • 优点:与 Spring Cloud 生态系统集成紧密,易于使用,可扩展性好,支持动态路由和自定义过滤器。
    • 适用场景:适合与 Spring Boot 和 Spring Cloud 应用程序一起使用的场景,特别是对于那些已经使用 Spring 技术栈的团队。
  2. Netflix Zuul

    • 背景:Netflix 创建的网关,用于处理其大规模的微服务架构。
    • 优点:已经被广泛使用和测试,对微服务的负载均衡和路由有良好的支持。
    • 适用场景:适合大规模的微服务架构,但Netflix已宣布停止对Zuul的维护,建议迁移到Spring Cloud Gateway。
  3. NGINX

    • 背景:高性能的开源反向代理服务器,也可以用作 API 网关。
    • 优点:非常高性能,支持负载均衡、缓存、SSL终止和灵活的路由配置。
    • 适用场景:适用于需要高性能和高可用性的环境,也可以用于作为传统Web服务器。
  4. Kong

    • 背景:基于NGINX的API和微服务管理层。
    • 优点:强大的插件系统,支持认证、安全性、监控和限流等功能。
    • 适用场景:适用于需要强大插件支持的场景,例如在大规模和复杂的微服务体系结构中。
  5. Envoy

    • 背景:由Lyft开发的高性能边缘和服务代理。
    • 优点:非常高性能,支持灵活的路由和负载均衡,可用于多种用途,包括网关、服务代理和边缘代理。
    • 适用场景:适用于需要高性能和灵活性的微服务和边缘代理场景。

选择合适的网关取决于您的具体需求和技术栈。考虑因素包括性能、可用性、安全性、扩展性、社区支持、易用性和已有技术栈。无论您选择哪个网关,都需要仔细考虑其配置和管理,以确保系统的可维护性和性能。

GateWay

官方文档:docs.spring.io/spring-clou…

Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1,它基于Spring5.0 + SpringBoot2.0 + WebFlux(基于性能的Reactor模式响应式通信框架Netty,异步阻塞模型)等技术开发,性能于Zuul,官测试,Spring Cloud GateWay是Zuul的1.6倍 ,旨在为微服务架构提供种简单有效的统的API路由管理式。

  1. 可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重写、志监控等
  2. Gateway还内置了限流过滤器,实现了限流的功能。
  3. 设计优雅,容易拓展

基本概念

路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:

  1. id:路由唯一标识,区别于其他的route
  2. url: 路由指向的目的地URL,客户端请求最终被转发到的微服务
  3. order: 用于多个Route之间的排序,数值越小越靠前,匹配优先级越高
  4. predicate:断言的作用是进行条件判断,只有断言为true,才执行路由
  5. filter: 过滤器用于修改请求和响应信息

核心流程

Spring Cloud Gateway 的核心流程涉及到请求的路由、过滤和代理,以下是其主要流程:

  1. 请求到达网关

    • 客户端发起请求,将请求发送到 Spring Cloud Gateway。
  2. 匹配路由规则

    • 网关根据请求的 URL、HTTP 方法、头部等信息,匹配到适合的路由规则。路由规则定义了请求的匹配条件以及目标微服务的地址。
  3. 应用过滤器

    • 一旦匹配到路由规则,网关会依次应用与该规则相关的过滤器。过滤器可以用于执行各种操作,如身份验证、授权、请求修改、日志记录等。过滤器的执行顺序可以在配置中指定。
  4. 负载均衡

    • 如果路由规则定义了多个后端微服务的实例,网关可以选择一个实例来将请求代理到。这通常涉及到负载均衡策略,以确保请求平均分配到不同的实例上。
  5. 路由请求到目标微服务

    • 网关将请求路由到目标微服务的实例。这可能涉及到将请求的路径、查询参数等信息修改为适合目标微服务的形式。
  6. 目标微服务处理请求

    • 目标微服务接收到请求后,执行相应的业务逻辑并生成响应。
  7. 返回响应

    • 目标微服务生成响应后,将其返回给 Spring Cloud Gateway。
  8. 应用响应过滤器

    • 网关可以再次应用一组过滤器,这次是在响应返回之前。这些过滤器可以用于修改响应、添加响应头、记录日志等。
  9. 将响应返回给客户端

    • 网关将最终的响应返回给发起请求的客户端。

在这个过程中,网关负责路由请求、执行过滤器操作、代理请求到目标微服务、处理响应,以及最终将响应返回给客户端。这个过程允许网关执行各种功能,包括安全性、负载均衡、日志记录、路由、熔断等,使其成为构建微服务架构中的重要组件。

引入父类依赖

Spring Cloud Gateway的父类POM(Project Object Model)通常引用了一些常用的Spring Boot和Spring Cloud依赖,以提供基本的功能和配置。请注意,这些依赖的版本可能会随着时间的推移而更新,所以建议根据您的项目需要查看最新的POM文件。

以下是一个示例Spring Cloud Gateway的父类POM中可能包含的一些常见依赖:

<dependencies>
    <!-- Spring Boot依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
    <!-- Spring Cloud依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>版本号</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>

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

请注意,上述示例中的版本号应该被替换为您项目所需的Spring Cloud版本号。此外,您还可以根据项目的具体需求添加其他依赖,例如数据库连接池、日志记录、安全性等。总之,Spring Cloud Gateway的父类POM主要用于引入Spring Boot和Spring Cloud的基本依赖,以便您可以开始构建Gateway应用程序。

引入子类依赖

Spring Cloud Gateway的子类POM通常会根据您的项目需求引用特定的依赖。子类POM用于定义您的项目的依赖关系和配置,以满足您的特定用例。以下是一些可能包含在Spring Cloud Gateway子类POM中的常见依赖,具体的依赖会根据项目的要求而变化:

<dependencies>
    <!-- Spring Boot Starter依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <!-- 例如:添加Eureka服务注册与发现依赖(如果您的项目使用Eureka) -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

    <!-- 例如:添加Spring Security依赖(如果需要安全性) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <!-- 例如:添加数据库连接池依赖(如果您的项目需要与数据库交互) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
    
    <!-- 例如:添加日志依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>

上述示例中的依赖是一些常见的示例,具体的依赖会根据您的项目需要而变化。您可以根据以下因素自定义子类POM中的依赖:

  1. 项目的功能需求:您需要根据您的项目的功能需求添加特定的依赖,例如Spring Security、数据库连接池、消息队列等。

  2. 微服务架构:如果您的项目是基于微服务架构的,可能需要引入其他Spring Cloud组件,如服务注册与发现(Eureka、Consul等)、负载均衡(Ribbon)、断路器(Hystrix)等。

  3. 日志和监控:根据您的监控和日志记录需求,您可能需要引入监控和日志记录工具,如Spring Cloud Sleuth、Zipkin、ELK堆栈等。

  4. 安全性需求:如果您的应用程序需要身份验证和授权,您可能需要引入Spring Security以确保安全性。

总之,子类POM的依赖会根据项目的具体需求而变化,您需要根据您的项目的特定要求来配置它。

SpringCloud GateWay的yml配置

Spring Cloud Gateway的配置通常可以在YAML文件中进行。以下是一个简单的Spring Cloud Gateway的YAML配置示例:

spring:
  cloud:
    gateway:
      routes:
        - id: example_route
          uri: https://example.com  # 要代理的目标URI
          predicates:
            - Path=/example/**  # 匹配的路径规则
          filters:
            - StripPrefix=1  # 过滤器,用于去掉请求前缀

server:
  port: 8080  # Gateway服务器的端口

在这个示例中:

  • spring.cloud.gateway.routes 定义了一条路由规则,包括路由的ID、目标URI、谓词(predicates)和过滤器(filters)。
  • predicates 根据请求的路径来匹配路由规则,这里使用 Path 谓词匹配以 /example/ 开头的路径。
  • filters 可以用于修改请求或响应,例如 StripPrefix 过滤器将会去掉请求的前缀。

您可以根据您的具体需求定义多个路由规则,并在YAML文件中列出它们。除了路由配置,您还可以在YAML文件中配置其他Spring Cloud Gateway属性,例如全局过滤器、超时设置、路由重试等。

请注意,以上只是一个简单的示例,实际的配置取决于您的项目需求和网关的复杂性。根据您的实际情况,您可能需要更多的配置选项以满足您的需求。配置文档和示例可以帮助您更深入地理解如何配置Spring Cloud Gateway。