目录
1.什么是Spring Cloud Gateway
Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的反应式API网关,用于构建微服务架构中的边缘服务。它提供了一种简单而强大的方式来路由请求,并对请求进行过滤和转换,以满足不同微服务之间的通信需求。
Spring Cloud Gateway的主要功能包括:
- 路由:根据请求的URI和其他条件将请求路由到相应的微服务实例。
- 过滤器:在请求被路由之前或之后对请求进行过滤和修改,例如添加请求头、验证身份等。
- 负载均衡:自动将请求分发到多个微服务实例,以提高系统的可伸缩性和容错性。
- 断路器:在微服务不可用或出现故障时,阻止请求继续发送,并提供降级功能。
- 动态路由:根据运行时的配置动态地添加、修改和删除路由规则。
- 集成服务发现:与服务注册中心(如Eureka、Consul)集成,自动发现可用的微服务实例。
Spring Cloud Gateway的优点:
高性能、低延迟、易于扩展和集成、简化的配置和灵活的路由规则等。它提供了一种强大而灵活的方式来管理和控制微服务之间的通信,使开发人员能够更好地构建和维护分布式系统。
2、Gateway三大核心概念
Gateway的核心逻辑也就是路由转发+执行过滤器链。
2.1 Route(路由)
讲网关路由前,先了解一下网关路由使用的场景,以及与Nginx路由的使用场景区别:
Nginx和API Gateway在路由方面应用的不同场景和级别。
- Nginx 路由:
- Nginx通常被用作反向代理服务器和负载均衡器,它的路由功能更倾向于处理基础的HTTP请求和转发流量。
- 在云服务器厂商级别,Nginx可以用于将流量分发到不同的服务器、缓存静态资源,以及提供一些基本的安全性配置。
- API Gateway 路由:
- API Gateway更专注于处理API请求,它提供了更高级别的路由和管理功能,包括请求转发、认证、授权、限流、监控等。
- 在项目开发级别,API Gateway可以用于管理和发布API,提供更灵活的API路由和控制。
在实际应用中,我们通常会将Nginx和API Gateway结合使用,以发挥它们各自的优势。Nginx负责处理基础的HTTP请求和流量分发,而API Gateway则负责处理API相关的高级功能,确保API的安全性、可用性和可扩展性。这样的架构能够更好地满足项目的需求。
如果我们在了解过Nginx的情况下,理解起上面的描述就比较易懂了,Spring Cloud中的网关路由是开发项目级别使用的,Nginx中的路由是阿里云、腾讯云等云服务器级别使用的,两者搭配,very good!
2.1.1 静态路由
在使用gatweway网关的时候一般都会用到spring-cloud-starter-gateway、spring-cloud-starter-alibaba-nacos-discovery、spring-cloud-starter-alibaba-nacos-config这三个依赖,我们需要先进行导入一下。
<dependencies>
<!-- SpringCloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
(1). 根据代码实现的路由(根据RouteLocatar类进行路由),我们在代码中注入RouteLocator的Bean 实现路由,通过代码实现路由转发。
图中我们实现了两种方式的路由,一种是配置文件配置路由,另一种是根据RouteLocatar类进行路由。
网关的配置文件详解:
在Spring Cloud Gateway中,cloud.gateway.routes 下的配置项用于定义网关的路由信息。其中,-id、uri、predicates 是其中重要的配置项。
id
:
- 作用:用于为每个路由定义一个唯一的标识符。这个标识符在整个网关配置中应该是唯一的。
- 在以下配置文件中,
ruoyi-gateway
就是路由的唯一标识符。uri
:
- 作用:指定路由的目标URI。请求将被转发到这个URI。可以是一个具体的URL,也可以是一个服务的名称,由服务注册中心提供服务的实例将会接收请求。
- 在以下配置文件中,请求会被转发到
http://localhost:8080
predicates
:
- 作用:定义路由的匹配条件,当请求满足这些条件时,路由将被触发。可以根据请求的路径、方法、头部等进行条件匹配。
- 在以下配置文件中,
Path=/hello/**
是一个路径匹配条件,表示只有路径匹配/hello/**
的请求才会触发这个路由。
通过组合使用这些配置项,我们还可以定义多个路由规则,每个规则可以根据请求的不同属性匹配,并将请求转发到相应的目标URI。这使得Spring Cloud Gateway能够实现灵活的路由管理和请求转发。
(2). 在配置完上面的路由信息后,就可以启动微服务项目进行路由访问,我们访问其中一个模块的9868端口号下的/hello/doLogin路径,从这里开始就通过网关的路由,走向了8080端口中的路径下的doLogin方法
下图可以看出我访问9869端口已经路由到了8080端口号中。
2.1.2 动态路由
在Spring Cloud Gateway中,动态路由可以基于配置文件实现,使用特定的配置项来描述动态路由规则。这通常涉及使用服务注册中心(如Eureka、Consul、Nacos等)以及路由规则的配置。
以下是一个基于Nacos和动态路由的简单示例:
1.添加依赖:
首先,确保您的项目中添加了与Nacos和Spring Cloud Gateway相关的依赖。例如,在Maven项目中,可以添加如下依赖:
<dependencies>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Spring Cloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 集成Nacos Config,实现分布式配置中心的功能 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
2.配置文件:
在application.yml或application.properties中配置Nacos和动态路由的相关信息,如下图:
在yml配置中,discovery.locator.enabled 启用了服务发现,lower-case-service-id 将服务ID转换为小写以便匹配规则。routes 中的配置定义了一个动态路由规则,将请求路径为 /dynamic/** 的请求转发到服务名为 service-name 的服务。
3.Nacos配置:
在Nacos配置中心中创建相应的配置,以便动态调整路由规则。例如,可以创建一个配置项名为 gateway-routes,内容如下:
[ { "id": "dynamic-route", "uri": "lb://service-name", "predicates": [{"Path": "/dynamic/**"}] } ]
4动态刷新:
使用Spring Cloud Gateway的动态刷新机制,可以在Nacos配置中心中更新 gateway-routes 配置项的内容,Gateway将自动刷新并应用新的路由规则。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Value("${gateway.routes}")
private String dynamicRoutes; // 从配置文件中读取的动态路由配置
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
// 静态路由规则
.route("static-route", r -> r.path("/static/**").uri("lb://service-name"))
// 动态路由规则,从配置文件中读取
.route("dynamic-route", r -> r.path("/dynamic/**").uri(dynamicRoutes))
.build();
}
}
在 application.properties 或 application.yml 文件中,我们可以像这样定义动态路由: gateway.routes=lb://dynamic-service
然后,当我们在配置文件中修改 gateway.routes 的值时,Spring Cloud Gateway 将自动检测到变化并重新加载路由规则。
总体来说,通过结合Nacos配置中心和Spring Cloud Gateway的服务发现功能,可以实现基于配置文件的动态路由。通过在Nacos中配置路由规则,实现动态调整路由而无需重新启动应用。