Spring cloud 微服务 Gateway 项目中使用


在这里插入图片描述

概述

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个关键组件,用于实现 API 网关功能。它基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.x 构建,旨在提供一种简单且有效的方式来路由到 API 微服务,并为它们提供横切关注点(如:安全性、监控/指标、限流等)。以下是对 Spring Cloud Gateway 的详细解析。

项目引入

pom 文件
<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-gateway</artifactId>
	</dependency>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-loadbalancer</artifactId>
	</dependency>
</dependencies>
  • spring-cloud-starter-gateway
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
    • 描述: 这个 Starter 提供了 Spring Cloud Gateway 的核心功能,包括路由管理、断言(Predicates)、过滤器(Filters)等。
    • 用途: 用于定义和管理 API 网关,处理请求路由到不同的后端微服务,并提供诸如限流、安全性和日志记录等功能。
  • spring-cloud-starter-alibaba-nacos-discovery
    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    • 描述: 这是阿里巴巴开源的 Nacos 客户端,它集成了 Spring Cloud 生态系统,提供了服务发现和配置管理的功能。
    • 用途:
      服务注册与发现: 微服务可以自动向 Nacos 注册自己,并从 Nacos 获取其他服务的位置信息。
      动态配置管理: 支持从 Nacos 动态加载和更新应用程序配置,而无需重启服务。
  • spring-cloud-starter-loadbalancer
    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
    • 描述: 这是一个轻量级的负载均衡器实现,它取代了早期版本中的 Ribbon,默认使用 Reactor Netty 实现非阻塞 HTTP 请求。
    • 用途:
      客户端负载均衡: 在调用远程服务时,LoadBalancerClient 可以根据一定的策略选择最合适的服务实例。
      与 Nacos 集成: 结合 Nacos Discovery 使用时,可以自动获取服务实例列表,并进行智能路由。

当这三个依赖一起使用时,你可以构建一个具备以下特性的微服务网关:
自动服务发现: 微服务通过 Nacos 自动注册和服务发现,使得网关能够动态地了解所有可用的服务实例。
智能路由: 基于路径、主机名或其他条件将流量路由到适当的服务实例。
负载均衡: 利用 spring-cloud-starter-loadbalancer 提供的负载均衡能力,确保请求均匀分布到各个服务实例上。

yaml 文件
spring:
  application:
    name: hm-gateway
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: item-service
          uri: lb://item-service
          predicates:
            - Path=/items/**,/search/**
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**,/addresses/**
        - id: cart-service
          uri: lb://cart-service
          predicates:
            - Path=/carts/**
      default-filters:
        - AddRequestHeader=truth, anyone long-press like button will be rich
        - PrintAny=1,2,3
  • 服务配置

    spring:
      application:
    	 name: hm-gateway
    

    定义 该网关微服务名称信息

  • nacos配置

    cloud:
       nacos:
       	server-addr: 127.0.0.1:8848
    

    指定了 Nacos 服务器的地址,用于服务注册与发现。确保你的 Nacos 服务器正在运行,并且可以从网关服务访问。

  • 网关配置

    gateway:
      routes:
    	- id: item-service
    	  uri: lb://item-service
    	  predicates:
    		- Path=/items/**,/search/**
    	- id: user-service
    	  uri: lb://user-service
    	  predicates:
    		- Path=/users/**,/addresses/**
    	- id: cart-service
    	  uri: lb://cart-service
    	  predicates:
    		- Path=/carts/**
    

    在这里插入图片描述

    • id: 路由的唯一标识符。
    • uri: 目标服务的 URI,使用 lb:// 表示通过负载均衡器访问的服务名。
    • predicates: 匹配条件,这里使用的是路径匹配(Path),指定了哪些 URL 模式应该被路由到相应服务。
  • 全局过滤器配置

    default-filters:
    	- AddRequestHeader=truth, anyone long-press like button will be rich
    	- PrintAny=1,2,3
    

    AddRequestHeader: 在所有匹配的请求中添加一个名为 truth 的请求头,其值为 anyone long-press like button will be rich。
    PrintAny: 这个过滤器看起来不是标准的 Spring Cloud Gateway 过滤器,可能是一个自定义实现或笔误。如果你想要打印某些信息,可以考虑使用 AddResponseHeader 或者创建一个自定义的全局过滤器。

配置全局过滤器跟局部自定义过滤器

全局过滤器

全局过滤器(Global Filters)在 Spring Cloud Gateway 中是一个非常重要的概念,它们允许你对所有路由请求应用通用的行为。与特定于某个路由的过滤器不同,全局过滤器会在每个请求通过网关时自动执行,无论请求匹配哪个路由规则。
全局过滤器的特点

  • 自动应用: 无需为每个路由单独配置,自动应用于所有路由。
  • 灵活控制: 可以根据需要添加、移除或调整全局过滤器的行为。
  • 集中管理: 提供了一个集中的地方来处理横切关注点,如日志记录、安全检查、性能监控等。

实现自定义全局过滤器
要创建一个自定义的全局过滤器,你需要实现 GlobalFilter 接口,并将其注册为 Spring Bean。下面是一个简单的例子,展示了如何创建和配置一个全局过滤器。

package com.hmall.gateway.filters;

import com.hmall.common.exception.UnauthorizedException;
import com.hmall.gateway.config.AuthProperties;
import com.hmall.gateway.utils.JwtTool;
import lombok.RequiredArgsConstructor;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 放行
         return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
局部自定义过滤器

局部自定义过滤器(Local Custom Filters),也称为 GatewayFilter,是 Spring Cloud Gateway 中用于针对特定路由规则应用过滤逻辑的组件。与全局过滤器不同,局部过滤器只会影响配置了它的那些路由,并且可以在每个路由的基础上进行定制化配置。这使得局部过滤器非常适合处理特定服务或 API 端点的需求,比如添加请求头、修改路径、记录响应时间等。
局部过滤器的特点

  • 针对性:仅应用于指定的路由,允许开发者为不同的服务或端点设置独特的过滤行为。
  • 灵活性:可以根据业务需求自由定制过滤器的行为,支持复杂的业务逻辑实现。
  • 组合使用:多个局部过滤器可以按需组合在一起,形成更复杂的处理链。

创建自定义局部过滤器
要创建一个自定义的局部过滤器,你需要实现 GatewayFilter 接口,并重写其 filter 方法。为了简化开发过程,通常会继承 AbstractGatewayFilterFactory 或者 AbstractNameValueGatewayFilterFactory 抽象类之一。下面是一个具体的例子,展示了如何创建局部过滤器:

@Component
public class PrintAnyGatewayFilterFactory  extends AbstractGatewayFilterFactory<PrintAnyGatewayFilterFactory.Config> {
    @Override
    public GatewayFilter apply(Config config) {
        // 使用内部装饰类,定义启动顺序
        return new OrderedGatewayFilter(new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                String a = config.getA();
                String b = config.getB();
                String c = config.getC();
                System.out.println(a + b + c);
                System.out.println("PrintAnyGateway 执行了");
                return chain.filter(exchange);
            }
        }, 1);
    }

    @Data
    public static class Config{
        private String a;
        private String b;
        private String c;
    }

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

    @Override
    public List<String> shortcutFieldOrder() {
        return List.of("a", "b", "c");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值