SpringCloudAlibaba微服务架构搭建(四)Gateway网关(包含源码)

2023-10-26

目录

前言

1.什么是Spring Cloud Gateway?

2.核心概念与架构解析

1. Route(路由)

2. 谓语(断言)

3. Filter(过滤器)

4.负载均衡与动态路由

​编辑

3. 请求路由与负载均衡

请求路由

负载均衡

动态路由

4. 网关过滤器链与请求处理 

过滤器链

全局过滤器(Global Filters)

路由过滤器(Route Filters)

处理请求

5. 高级特性:熔断、限流和安全

1.熔断(Circuit Breaking)

实现熔断的步骤:

步骤1:添加依赖

步骤2:配置熔断策略

步骤3:创建熔断回调

2.限流(Rate Limiting)

实现限流的步骤:

步骤1:添加依赖

步骤2:配置限流策略

步骤3:实现限流键解析器

3.安全与鉴权

实现安全与鉴权的步骤:

步骤1:配置安全规则

步骤2:设置安全属性

6. 实际应用案例与最佳实践


前言

        当涉及到 Spring Cloud 微服务架构的构建和管理时,Spring Cloud Gateway 无疑是一个关键组件。作为现代化的 API 网关,它在微服务系统中发挥着至关重要的作用。本博客中有几个重点入手,深入剖析Spring Cloud Gateway的核心概念、主要特性以及如何实际应用,旨在为读者提供一个全面、深入的了解。

1.什么是Spring Cloud Gateway?

        首先,我们需要了解Spring Cloud Gateway是什么。在本节中,我们将介绍Spring Cloud Gateway的基本概念、作用以及为什么它在微服务架构中如此重要。

2.核心概念与架构解析

        在深入探讨Spring Cloud Gateway之前,我们需要了解它的核心概念和架构。这一节将详细介绍Route(路由)、Filter(过滤器)、Predicate(断言)等关键概念,以及它们在整个网关中的作用。

1. Route(路由)

在Spring Cloud Gateway中,路由是一个基本的概念。它定义了一个请求的目标URI和一组过滤器,以及请求应该如何被处理。每个路由规则由ID、目标URI、谓词(Predicates)和过滤器(Filters)组成。

  • ID:路由规则的唯一标识符,用于识别不同的路由。

  • 目标URI:定义了请求应该路由到目标微服务的地址。

  • 谓词:谓词是用于匹配请求的条件,比如请求路径、请求参数等。

  • 过滤器:过滤器是一系列的处理步骤,用于在请求被路由之前或之后进行处理,如鉴权、请求转换、日志等记录。

2. 谓语(断言)

断言是为了匹配请求的条件,它决定了请求是否应该路由到对应的路由。Spring Cloud Gateway内置了许多常用的断言,如Path、Method、Header等。您还可以创建自定义的断言来实现更灵活的路由匹配

spring:
  cloud:
    gateway:
      routes:
        - id: example_route
          uri: http://example.com
          predicates:
            - Path=/api/**

3. Filter(过滤器)

过滤器是Spring Cloud Gateway的强大功能之一。它允许您在请求被路由记录之前或之后执行自定义逻辑。过滤器可以用于鉴权、请求转换、日志、性能监控等。

Spring Cloud Gateway中的过滤器分为两大类:

  • 全局过滤器(Global Filters):全局过滤器在整个网关中全局生效,可以用于添加通用的行为,如全局鉴权、日志记录等。

  • 路由过滤器(Route Filters):路由过滤器只对指定的路由生效,可以为不同的路由定义不同的过滤行为。

4.负载均衡与动态路由

Spring Cloud Gateway 集成了 Spring Cloud LoadBalancer,使得负载均衡变得简单而高效。您可以在路由配置中直接使用服务名,而不是具体的服务实例地址,网关会自动进行负载均衡。

spring:
  cloud:
    gateway:
      routes:
        - id: product_route

3. 请求路由与负载均衡

请求路由

请求路由是API网关的核心功能之一。它决定了将请求定向到哪个微服务实例以及如何对请求进行处理。Spring Cloud Gateway使用路由来定义请求路由规则,每个路由包含一个唯一的ID、目标URI和匹配条件。

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: http://product-service
          predicates:
            - Path=/products/**

在上面的示例中,我们定义了一个名为product_route的路由规则,将路径以/products发起端的请求路由到名为product-service的微服务。

负载均衡

确保负载均衡是微服务架构中的关键概念,它可以将请求均匀分配到不同的微服务实例上,提高系统的可靠性和性能。Spring Cloud Gateway集成了Spring Cloud LoadBalancer,使得负载均衡变得简单而高效。

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: lb://product-service
          predicates:
            - Path=/products/**

在上面的示例中,我们使用了lb://product-service作为目标 URI,其中product-service是一个服务的名称。Spring Cloud Gateway 会根据负载均衡算法将请求分发到多个product-service实例中。

动态路由

Spring Cloud Gateway 仍然支持动态路由,这意味着您可以随时通过配置中心修改路由运行规则,然后重新启动网关。这为您的微服务架构带来更大的灵活性和可维护性。

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: dynamic_route
          uri: lb://dynamic-service
          predicates:
            - Path=/dynamic/**

 在上面的示例中,我们实现了通过服务发现动态获取路由规则的功能。dynamic-service是一个服务的名称,Spring Cloud Gateway 会自动从服务注册中心获取该服务的实例列表,并进行负载均衡和路由

通过请求路由和负载均衡,Spring Cloud Gateway能够实现灵活且智能的请求转发,为您的微服务架构提供更高的可用性和性能。在下一节中,我们将深入了解过滤器链,以实现更多定制化的处理逻辑。

4. 网关过滤器链与请求处理 

过滤器链

Spring Cloud Gateway 的过滤器链由一系列的过滤器组成,它们按照一定的顺序依次处理请求。过滤器可以在请求被路由之前(pre)或之后(post)执行逻辑,从而允许开发者对请求和响应进行修改和处理。

全局过滤器(Global Filters)

全局过滤器会在整个网关中生效,它们可以用于添加通用的行为,例如鉴权、日志、记录请求转换等。您可以通过实现接口来创建全局过滤器GlobalFilter

示例:添加全局鉴权过滤器

@Component
public class AuthGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在请求被路由之前执行鉴权逻辑
        if (hasValidToken(exchange.getRequest())) {
            return chain.filter(exchange);
        } else {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }
}

路由过滤器(Route Filters)

路由过滤器只对指定的路由生效,它们可以为不同的路由定义不同的过滤行为。通过在路由配置中添加过滤器工厂,您可以将路由过滤器识别特定的路由。

示例:为特定路由添加过滤器

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: http://product-service
          predicates:
            - Path=/products/**
          filters:
            - AddRequestHeader=headerName,headerValue

处理请求

除了过滤器之外,Spring Cloud Gateway还允许您使用WebHandler来实现自定义的请求处理逻辑。WebHandler可以在过滤器链中进行淬火层次的操作,例如修改响应状态码、设置响应头等。

示例:自定义请求处理逻辑

@Component
public class CustomWebHandler implements WebHandler {

    @Override
    public Mono<Void> handle(ServerWebExchange exchange) {
        // 在处理请求之前或之后执行逻辑
        if (exchange.getRequest().getPath().toString().startsWith("/admin")) {
            exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
            return exchange.getResponse().setComplete();
        } else {
            return exchange.getResponse().writeWith(Mono.just(/* 响应内容 */));
        }
    }
}

通过过滤器链和自定义的请求处理逻辑,Spring Cloud Gateway为您提供了灵活的、可扩展的请求处理能力。您可以根据实际需求添加不同的过滤器和处理器,实现鉴权、请求转换、日志记录等各种功能。在下一篇,我们将介绍如何实现熔断和限流等高级功能,以确保您的微服务架构的稳定性和可靠性。

5. 高级特性:熔断、限流和安全

1.熔断(Circuit Breaking)

熔断是一种保护,用于防止故障的爆发,当某个微服务出现故障时,可以快速切断该服务的请求,避免机制对其他组件的影响。

实现熔断的步骤:

步骤1:添加依赖

pom.xml中添加以下依赖:

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

步骤2:配置熔断策略

在配置文件中添加熔断策略:

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: http://product-service
          predicates:
            - Path=/products/**
          filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackuri: forward:/fallback

步骤3:创建熔断回调

创建一个回调方法,在熔断时调用该方法:

@RestController
public class FallbackController {

    @RequestMapping("/fallback")
    public String fallback() {
        return "Fallback response";
    }
}

2.限流(Rate Limiting)

限流是一种控制流量的机制,防止过多的请求同时进入微服务,避免系统过载。

实现限流的步骤:

步骤1:添加依赖

pom.xml中添加以下依赖:

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

步骤2:配置限流策略

在配置文件中添加限制流策略:

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: http://product-service
          predicates:
            - Path=/products/**
          filters:
            - name: RequestRateLimiter
              args:
                key-resolver: '#{@userKeyResolver}'
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

步骤3:实现限流键解析器

创建一个限流键解析器的Bean

@Bean
public KeyResolver userKeyResolver() {
    return exchange -> Mono.just(/* 根据请求获取限流键 */);
}

3.安全与鉴权

Spring Cloud Gateway还支持安全和鉴权,保护系统控制台未授权访问。

实现安全与鉴权的步骤:

步骤1:配置安全规则

在配置文件中添加安全规则:

spring:
  cloud:
    gateway:
      routes:
        - id: secure_route
          uri: http://secure-service
          predicates:
            - Path=/secure/**
          filters:
            - name: RewritePath
              args:
                regexp: /secure/(?<segment>.*)  
                replacement: /${segment}
            - name: Security
              args:
                oauth2ResourceServerId: myResource

步骤2:设置安全属性

application.properties中设置安全属性:

spring.security.oauth2.resourceserver.jwt.issuer-uri=http://auth-server
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=${spring.security.oauth2.resourceserver.jwt.issuer-uri}/.well-known/jwks.json

通过实现熔断、限流和安全等高级功能,您可以提高系统的稳定性和可靠性,为微服务架构增加更多的保护措施。上述代码示例展示了如何在 Spring Cloud Gateway 中实现这些功能,您可以根据实际需求进行进一步定制和扩展。

6. 实际应用案例与最佳实践

        当涉及到实际应用Spring Cloud Gateway时,一个典型的电子商务案例是构建一个平台的微服务架构。在这个案例中,我们将演示如何使用Spring Cloud Gateway来实现统一的入口、请求路由、鉴权以及限流等功能。以下是详细的代码案例,展示了如何在电子商务平台中应用Spring Cloud Gateway。

在这里插入图片描述

步骤1:创建Spring Cloud Gateway项目

首先,您需要创建一个Spring Cloud Gateway项目。您可以使用Spring Initializr或者其他方式来初始化项目。确保在中pom.xml添加了必要的依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>

步骤2:配置路由规则

application.yaml中配置路由规则,将不同的请求路由到对应的微服务实例。

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: lb://product-service
          predicates:
            - Path=/products/**
        - id: order_route
          uri: lb://order-service
          predicates:
            - Path=/orders/**

在此之中,我们定义了两个路由规则,依次是到微服务/products的请求路由,接下来是示例的到微服务的请求路由。product-service/ordersorder-service

步骤3:添加全局过滤器

在项目中添加一个全局过滤器,用于鉴权操作。

@Component
public class AuthGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在请求被路由之前执行鉴权逻辑
        if (hasValidToken(exchange.getRequest())) {
            return chain.filter(exchange);
        } else {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }

    private boolean hasValidToken(ServerHttpRequest request) {
        // 鉴权逻辑,验证请求中的令牌是否有效
        return true;
    }
}

步骤4:添加限流策略

order-service微服务添加限流策略,巴勒斯坦的请求同时访问过多。

spring:
  cloud:
    gateway:
      routes:
        - id: order_route
          uri: lb://order-service
          predicates:
            - Path=/orders/**
          filters:
            - name: RequestRateLimiter
              args:
                key-resolver: '#{@userKeyResolver}'
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

步骤5:实现限流键解析器

创建一个限流键解析器的Bean,用于为限流策略提供唯一标识。

@Bean
public KeyResolver userKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}

通过以上步骤,您已经成功实现了一个基本的电子商务平台所需的微服务架构,并且利用Spring Cloud Gateway实现了统一的入口、请求路由、鉴权和限流等功能。当然,实际应用还可能更多的功能和定制化配置,您可以根据业务需求进行进一步扩展和优化。本案例展示了如何在实际项目中使用Spring Cloud Gateway,帮助您更好地理解如何应用这个强大的工具。

7. 小结与展望

在本篇博客中,我们深入探讨了Spring Cloud Gateway作为现代微服务架构中的重要组件。通过以上几个关键点,我们详细讲解了Spring Cloud Gateway的核心概念、功能特性以及实际应用。

                                                    ⏳  名言警句:说会的,说对的
                                                    ✨ 原创不易,还希望各位大佬支持一下
                                                   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloudAlibaba微服务架构搭建(四)Gateway网关(包含源码) 的相关文章

随机推荐