文章目录
概述
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");
}
}
标签:Spring,springframework,cloud,org,过滤器,import,Gateway,路由
From: https://blog.csdn.net/ling_zhi_xin/article/details/144955399