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

目录

前言

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的核心概念、功能特性以及实际应用。

                                                    ⏳  名言警句:说会的,说对的
                                                    ✨ 原创不易,还希望各位大佬支持一下
                                                    👍 点赞,你的认可是我创作的动力!
                                                    ⭐️ 收藏,你的青睐是我努力的方向!
                                                    ✏️ 评论,你的意见是我进步的财富!

Spring CloudSpring Cloud Alibaba都是基于Spring Framework的开源框架,用于构建分布式系统和微服务架构。它们都提供了一系列的组件和工具来简化微服务开发和管理。 Spring Cloud是一个由Pivotal团队维护的项目,它集成了Netflix开源的一些组件,如Eureka作为注册中心、Ribbon作为负载均衡器、Feign作为服务调用工具等。同时,Spring Cloud还提供了其他功能,如Config Server用于动态管理配置、Gateway用于构建API网关等。 而Spring Cloud Alibaba则是阿里巴巴开源的项目,它在Spring Cloud的基础上进行了扩展和定制,增加了一些阿里巴巴自己的组件和工具。比如,它使用Nacos作为注册中心和配置中心,使用Sentinel作为熔断降级工具。 总的来说,Spring CloudSpring Cloud Alibaba都是用于构建微服务架构的框架,它们的区别在于Spring Cloud集成了Netflix组件,而Spring Cloud Alibaba集成了阿里巴巴的一些组件。根据具体的需求和技术栈选择使用哪个框架可以更好地满足开发和管理微服务的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Cloud AlibabaSpring Cloud的区别](https://blog.csdn.net/weixin_43888891/article/details/126653270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值