SpringCloud-Gateway网关的使用实例教程
作者:Damon小智
本文介绍如何在 SpringCloud 项目中引入 Gateway 网关并完成网关服务的调用。Gateway 网关是一个在微服务架构中起到入口和路由控制的关键组件。它负责处理客户端请求,进行路由决策,并将请求转发到相应的微服务。Gateway 网关还可以实现负载均衡、安全认证、日志记录等功能,集中管理服务间的通信,提升整体系统的可维护性和安全性。通过 Gateway 网关,可以实现统一的访问点,简化客户端与后端微服务之间的交互,同时也能够更灵活地进行流量控制和监控。
一、Gateway网关介绍
Gateway 网关是一个基于 Spring Cloud 的 API 网关服务,它提供了路由、过滤、监控、日志等功能,用于统一管理和转发微服务的请求流量。作为微服务架构中的入口点,Gateway 网关可以实现负载均衡、安全认证、请求转发等功能,提高了系统的安全性、可用性和可维护性。
网关的作用:
- 对用户请求做身份认证、权限校验
- 将用户请求路由到微服务,并实现负载均衡
- 对用户请求做限流
含 Gateway 网关项目结构示意图:
二、搭建Gateway网关
搭建Gateway网关需要以下步骤:
1、创建Gateway模块
我们需要的开发环境中创建一个新的Spring Boot项目。
不会创建的可以参考我之前的文章:SpringCloud-创建多模块项目
在SpringCloud项目上我们创建Gateway模块,我命名为 springcloud-gateway。
2、引入SpringCloud-Gateway依赖
在 springcloud-gateway 项目的 pom.xml 文件中引入 Spring Cloud Gateway 的依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
3、配置路由规则
编辑 applicatin.yml,配置 Gateway 网关的路由规则,包括定义路由路径、目标服务等信息。
server: port: 8090 spring: application: name: springcloud-gateway cloud: nacos: server-addr: localhost:8848 gateway: discovery: locator: enabled: true # 开启自动路由 routes: # 网关路由配置 - id: gateway-service # 路由id,自定义,唯一 uri: lb://target # 路由的目标地址,lb表示负载均衡 predicates: # 路由断言,判断请求是否符合路由规则 - Path=/gateway/** # 要求请求路径以/user/开头,否则404 filters: - StripPrefix=1 # 转发请求时uri过滤掉/gateway
我们添加了动态路由,这里的动态路由属性可以自动让网关的转发请求负载均衡。
这里我们用到了一个 Path 断言,要求请求路径以 /user/ 开头,否则请求会返回404 (未找到服务) 。这里我们还用到了一个过滤器,让网关转发请求时,去掉前缀 /gateway。断言工厂和过滤器的概念我们在下文进行详细讲解。
4、添加断言
在Spring Cloud Gateway中,断言(Predicate)用于定义请求匹配的条件,从而决定是否应用某个过滤器链。以下是一些常见的Gateway断言种类和相应的示例:
断言种类 | 匹配规则 | 示例 |
Path | 根据请求的路径进行匹配。 | - Path=/api/** 匹配路径为 "/api/**" 的请求。 |
Method | 根据请求的HTTP方法进行匹配。 | - Method=GET 匹配GET请求。 |
Header | 根据请求的头部信息进行匹配。 | - Header=Authorization, \d+ 匹配包含 "Authorization" 头部的请求。 |
Host | 根据请求的主机名进行匹配。 | - Host=example.com 匹配主机名为 "example.com" 的请求。 |
Query | 根据请求的查询参数进行匹配。 | - Query=category, \w+ 匹配包含 "category" 参数的请求。 |
Cookie | 根据请求的Cookie进行匹配。 | - Cookie=sessionId, \d+ 匹配包含名为 "sessionId" 的Cookie的请求。 |
Combining | 将多个断言组合成一个逻辑条件, 实现更复杂的匹配。 | - Path=/api/** AND Method=GET 同时匹配路径为 "/api/**" 且是GET请求的请求。 |
下面来举个例子:
server: port: 8090 spring: application: name: springcloud-gateway cloud: nacos: server-addr: localhost:8848 gateway: discovery: locator: enabled: true # 开启自动路由 routes: - id: gateway-service uri: lb://target predicates: - Header=Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE
这里用到的最常用的 Header 断言中的鉴权断言,要求访问网关的请求必须在请求头里带有 <Authorization, Bearer 831B175-D251501-31A3F301-711636-9CAE> 的鉴权码,如果没有鉴权码或者鉴权码不匹配,则返回 404。
5、添加过滤器
Spring Cloud Gateway提供了丰富的过滤器种类,这些过滤器用于在请求进入网关或响应离开网关时执行各种操作。以下是一些常见的Gateway过滤器种类:
过滤器种类 | 过滤器作用 |
Pre Filters (前置过滤器) | AddRequestHeader: 添加请求头。 |
AddRequestParameter: 添加请求参数。 | |
ModifyRequestBody: 修改请求体。 | |
Route Filters (路由过滤器) | AddResponseHeader: 添加响应头。 |
AddResponseParameter: 添加响应参数。 | |
Hystrix: 集成Hystrix断路器,提供服务容错能力。 | |
Post Filters (后置过滤器) | SetStatus: 设置响应状态码。 |
ModifyResponseBody: 修改响应体。 | |
Error Filters (错误过滤器) | SendError: 处理请求发生错误时的操作。 |
ExceptionHandler: 自定义异常处理。 | |
Global Filters (全局过滤器) | GlobalFilter: 全局过滤器,适用于所有路由。 |
Ordered: 为过滤器设置顺序。 | |
Custom Filters (自定义过滤器) | 自定义实现GatewayFilter接口: 开发者可以通过实现该接口创建自定义的过滤器。 |
这些过滤器可以按照需求进行组合和配置,使得开发者可以在Gateway中实现各种复杂的请求和响应处理逻辑。通过合理配置过滤器,可以实现日志记录、认证授权、请求重试、熔断器等功能,提高网关的灵活性和可扩展性。
下面我们来举个例子:
server: port: 8090 spring: application: name: springcloud-gateway cloud: nacos: server-addr: localhost:8848 gateway: discovery: locator: enabled: true # 开启自动路由 routes: - id: gateway-service uri: lb://target predicates: - Path=/gateway/** filters: - StripPrefix=1 - AddRequestHeader=test_header, damon0806
这里可以看到,我们在 routes(网关路由)下配置了 filters(过滤器)。
- StripPrefix=1:表示从请求的URI中去除前缀的数量。在这里,1 表示去除两级路径的前缀。例如,如果原始请求是 /path1/rest-of-the-uri,使用此配置后,转发到后端的请求 URI 将是 /rest-of-the-uri。
- AddRequestHeader=test_header, damon0806:表示在请求头中添加一个自定义的头部。具体来说,它添加了一个名为 test_header 的头部,其值为 damon0806。这可以用于在请求发送到后端服务时传递额外的信息或标识。
6、启动网关服务
编写 springcloud-gateway 的启动类,启动 Gateway 网关服务,使其开始监听和转发请求。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringcloudGatewayApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudGatewayApplication.class, args); } }
7、测试路由
可以使用 Postman 等接口测试工具发送请求,测试 Gateway 网关是否能够正确转发请求到相应的微服务,以及断言工厂或者过滤器是否实现。
三、Gatway网关的作用
Gateway 网关作为微服务架构中的入口点,扮演着关键的角色。
其作用主要体现在以下几个方面:
作用点 | 详细描述 |
路由 (Routing) | Gateway能够根据请求的路径,将请求路由到相应的微服务实例上。简化了服务调用的过程,使得客户端无需直接关注每个微服务的位置和细节。 |
负载均衡 (Load Balancing) | Gateway支持负载均衡,可将请求均匀地分发到多个微服务实例,提高系统的可用性和性能。有效避免了单一服务实例的过载,提高了整体系统的稳定性。 |
过滤 (Filtering) | Gateway可以通过过滤器实现对请求和响应进行处理,如添加、修改请求头、记录日志、认证、鉴权等操作。统一处理与安全、日志、性能等相关的逻辑,使得系统更加易于维护和管理。 |
熔断器 (Circuit Breaker) | Gateway支持熔断器机制,当某个微服务出现故障或超时时,能够自动切换到备用服务,防止故障向下游传递。提高了系统的容错性,减少了因单一服务故障而导致整个系统不稳定的风险。 |
统一异常处理 (Exception Handling) | Gateway可以统一处理微服务中的异常,提供友好的错误提示,防止细节泄露给客户端。提高了系统的安全性和用户体验,降低了对异常的不良影响。 |
协议转换 (Protocol Transformation) | Gateway支持协议的转换,可以将外部请求转换成内部微服务所需的协议。降低了微服务之间的耦合度,允许使用不同的协议进行通信。 |
Gateway网关在微服务架构中承担了集中处理、管理和保护服务的责任,通过提供统一的入口和处理机制,使得微服务系统更加稳定、灵活和易于维护。
四、Gateway网关服务的调用
下面是前端 Ajax 调用网关服务的实例:
前端 JavaScript 代码:
$.ajax({ type: "POST", url: "http://localhost:8090/gateway/getUserList", data: {}, dataType: 'json' });
网关配置如下:
server: port: 8090 spring: application: name: springcloud-gateway cloud: nacos: server-addr: localhost:8848 gateway: discovery: locator: enabled: true # 开启自动路由 routes: - id: gateway-service uri: lb://target predicates: - Path=/gateway/** filters: - StripPrefix=1 - AddRequestHeader=test_header, damon0806
当我们执行上述 Ajax 请求时,请求会被网关转发到 lb://target/getUserList 上。
五、Gateway网关总结
Gateway网关作为微服务架构中的关键组件,承担着诸多重要任务,为整个系统提供了一种高效、可靠的服务入口。以下是对Gateway网关的总结:
要点 | 要点详细内容 |
统一入口 | Gateway网关为微服务提供了一个统一的入口,客户端通过与网关交互,无需直接访问每个微服务,简化了服务调用的复杂性。 |
路由与负载均衡 | Gateway能够根据路由规则将请求动态转发到不同的微服务实例,同时支持负载均衡,提高了系统的可用性和性能。 |
过滤器与拦截 | 通过过滤器,Gateway网关能够在请求进入网关或响应离开网关时执行一系列操作,如鉴权、认证、日志记录等,增强了系统的安全性和可维护性。 |
熔断与异常处理 | Gateway网关支持熔断器机制,能够处理微服务的异常情况,避免故障的扩散。统一的异常处理机制提高了系统的稳定性和用户体验。 |
协议转换与透明性 | Gateway网关允许协议的转换,为微服务提供了透明的通信机制。这使得微服务之间可以使用不同的通信协议,提高了系统的灵活性。 |
集中式管理 | Gateway网关提供了集中管理微服务的能力,可以在一个地方配置和管理所有微服务的路由规则和过滤器,降低了系统的维护成本。 |
性能监控与日志记录 | Gateway网关可以通过集成性能监控工具和记录详细日志,帮助开发人员更好地了解系统的运行状况,方便进行性能优化和故障排查。 |
综上所述,Gateway网关在微服务架构中扮演了不可或缺的角色,通过集中化管理、智能路由和强大的过滤器机制,为构建高效、可扩展的微服务系统提供了有力支持。其优势在于简化了开发、提高了系统的可维护性,并在面对复杂的微服务架构时提供了一种优雅的解决方案。
到此这篇关于SpringCloud-Gateway网关的使用的文章就介绍到这了,更多相关SpringCloud Gateway网关内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!