文章目录
- 前言
- springCloud-2021.0.9 之 GateWay 示例
- 1. GateWay 官网
- 2. GateWay 三个关键名称
- 3. GateWay 工作原理的高级概述
- 4. 示例
- 4.1. POM
- 4.2. 启动类
- 4.3. 过滤器
- 4.4. 配置
- 5. 启动/测试
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
springCloud-2021.0.9 之 GateWay 示例
这里我介绍一下,我用到的springCloud 是2021.0.9版本。
Maven 依赖管理配置引入 Spring Cloud 的 BOM(Bill of Materials)文件,主要作用如下:
-
版本统一:通过引入 BOM 文件,您可以统一管理项目中所有 Spring Cloud 相关依赖的版本,避免版本冲突和不一致。
-
简化依赖声明:在子模块中,您无需显式指定 Spring Cloud 相关依赖的版本号,Maven 会自动从 BOM 中获取版本信息。
与以前的引入方式相比,这种方法提供了更好的版本控制和依赖管理,特别是在处理多个子模块和复杂的依赖关系时,能够有效减少手动管理版本的复杂性。
1. GateWay 官网
下面是我用的版本官网api:
https://docs.spring.io/spring-cloud-gateway/docs/3.1.9/reference/html/
2. GateWay 三个关键名称
Route:网关的基本构建块。它由 ID、目标 URI、谓词集合和过滤器集合定义。如果聚合谓词为真,则路由匹配。
Predicate:这是一个Java 8 函数谓词。输入类型是Spring 框架ServerWebExchange。这允许您匹配 HTTP 请求中的任何内容,例如标头或参数。
Filter:这些是GatewayFilter使用特定工厂构建的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
3. GateWay 工作原理的高级概述
下图提供了 Spring Cloud Gateway 工作原理的高级概述:
客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 确定请求与路由匹配,
则将其发送到 Gateway Web Handler。此处理程序通过特定于请求的过滤器链运行请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。所有“前”过滤器逻辑都会执行。然后发出代理请求。发出代理请求后,运行“后”过滤器逻辑。
4. 示例
4.1. POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.15</version>
</parent>
<groupId>org.example</groupId>
<artifactId>springCloud-Gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springCloud-Gateway</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.9</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--
作用: Spring Cloud Gateway 是一个基于 Spring WebFlux 和 Project Reactor 实现的 API 网关服务,
它可以作为微服务架构的入口,处理路由请求、负载均衡、身份认证等功能。
用途: 主要用于处理微服务的路由请求,你可以定义路由规则,决定哪些请求转发到哪些微服务。
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--
作用: 为你的应用程序提供 Eureka 客户端的支持,能够与 Eureka 服务发现注册中心交互。
客户端可以向 Eureka 服务器注册自身,并从中获取其他服务实例的注册信息,实现服务发现和负载均衡。
用途: 当应用启动时,它会自动注册到 Eureka Server,
并能够根据其他服务的注册信息进行服务发现。
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--a
作用: 提供了一组用于监控和管理应用程序的端点,
比如健康检查、性能指标、日志级别调整等。它能够暴露很多应用的内部状态,并支持通过 HTTP、JMX 或其他方式访问这些信息。
用途: 通过 Actuator,你可以轻松地监控和管理 Spring Boot 应用,
结合 Spring Boot Admin 还能进行图形化管理。
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--
作用: Sleuth 提供了分布式追踪的功能,可以在微服务架构中追踪请求的流转路径,
帮助诊断和调试系统性能问题。Sleuth 会为每个请求生成追踪 ID 和 span ID,
记录请求在不同微服务中的处理过程。
用途: 在微服务架构中,用于监控和分析请求的处理流程,帮助你追踪请求跨多个服务的链路。
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.15</version>
</plugin>
</plugins>
</build>
</project>
4.2. 启动类
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class, args);
}
}
4.3. 过滤器
package org.example.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.sleuth.CurrentTraceContext;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class ResponseFilter implements GlobalFilter , Ordered {
private static final String CORRELATION_ID = "yzy-correlation-id";
@Autowired
private CurrentTraceContext currentTraceContext;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().add(CORRELATION_ID, currentTraceContext.context().traceId());
}));
}
@Override
public int getOrder() {
return -1;
}
}
4.4. 配置
server:
port: 8809
netty:
idle-timeout: 10m # Netty 服务器的空闲超时时间为 10 分钟,这决定了在没有网络活动时,连接会被关闭。
eureka:
instance:
prefer-ip-address: true # 优先ip注册
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka # 注册中心地址
spring:
application:
name: springCloud-Gateway
cloud:
gateway:
httpclient:
connect-timeout: 1000 # 配置全局 http 超时
response-timeout: 5s # 配置全局 http 超时
defaultFilters:
- StripPrefix=1 # 默认移除前1个路径段
routes:
- id: springCloudServiceA
uri: lb://SPRINGCLOUDSERVICEA
predicates:
- Path=/springCloudServiceA/**
- id: springCloudServiceB
uri: lb://SPRINGCLOUDSERVICEB
predicates:
- Path=/springCloudServiceB/**
5. 启动/测试
如下图,启动成功!!
测试:
http://127.0.0.1:8809/springCloudServiceA/api/test/scan
请求链路:
postmain -> SPRINGCLOUD-GATEWAY->SPRINGCLOUDSERVICEA