GateWay的相关使用
# GateWay的相关使用
# 诞生的原因
Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个关键组件,它作为 API 网关,用于路由和管理微服务之间的请求。
它的出现是为了解决了微服务架构中的一些核心问题(以下是个人认为重要的几个):
- 统一入口:
- 微服务架构中,每个服务都有自己的端口和地址。通过 Gateway,可以将所有服务的请求统一到一个入口,简化了客户端的调用逻辑。
- 客户端只需要知道 Gateway 的地址,不需要关心每个服务的具体地址。
- 路由管理:
- Gateway 可以根据预定义的路由规则,将请求转发到不同的后端服务。
- 动态路由配置允许在不重启服务的情况下修改路由规则。
- 请求过滤:
- Gateway 可以在请求到达后端服务之前或之后执行一系列的过滤操作,如认证、鉴权、日志记录、请求转换等。
- 这些过滤操作可以集中管理,减少每个服务的负担。
- 安全性:
- Gateway 可以集中处理安全相关的功能,如 JWT 验证、CSRF 防护等。
- 这样可以减少每个服务的安全风险,通过统一的接口进行请求,如此一来客户端便不知道每个具体服务的ip地址了,提高整体系统的安全性。
# 带来的新问题
新的东西,也会带来新的问题,以下就是GateWay带来的新问题(任何事物都如此):
- 性能开销:
- Gateway 作为一个中间层,会增加请求的延迟。
- 特别是当配置了大量的过滤器时,性能开销会更加明显。
- 复杂性:
- 配置和管理 Gateway 可能会变得复杂,尤其是在大规模微服务架构中。
- 需要对路由规则、过滤器、负载均衡等有深入的理解和配置经验。
- 调试困难:
- 由于 Gateway 处理了请求的中间环节,调试问题时可能需要额外的步骤。
- 特别是当请求在 Gateway 中被修改或过滤时,定位问题可能会更加困难。
- 单点故障:
- 如果 Gateway 发生故障,整个系统的访问可能会受到影响。
- 需要通过高可用性和容错机制来确保 Gateway 的可靠性。
- 学习曲线:
- 对于初学者来说,学习如何配置和使用 Gateway 可能需要一定的时间。
- 需要熟悉 Spring Cloud 和 Reactor 的相关概念和技术。
# 相关资料
springcloud gateway官网 (opens new window)
- https://spring.io/projects/spring-cloud-gateway
GateWay-github对应源码 (opens new window)
- https://github.com/spring-cloud/spring-cloud-gateway
GateWay-讲解文档-官网 (opens new window)
- https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway.html
# 三大核心
官网对应说明:
# Glossary
- Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.
- Predicate: This is a Java 8 Function Predicate (opens new window). The input type is a Spring Framework
ServerWebExchange
(opens new window). This lets you match on anything from the HTTP request, such as headers or parameters.- Filter: These are instances of
GatewayFilter
(opens new window) that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.
Spring Cloud Gateway 有三个核心概念,分别是 路由(Route)、谓词(Predicate)和 过滤器(Filter)。这三个核心概念共同协作,实现了 Gateway 的强大功能。
# 1. 路由(Route)
定义:路由是 Gateway 的基本组成单元,它定义了如何将请求转发到目标服务。每个路由都包含一个 ID、一个目标 URI 和一组谓词和过滤器。
作用:
- 请求匹配:通过谓词来匹配传入的 HTTP 请求。
- 请求转发:将匹配的请求转发到目标 URI 指定的服务。
# 2.谓词(Predicate)
定义:谓词是用于匹配传入 HTTP 请求的条件。Spring Cloud Gateway 使用 Java 8 的 Predicate
接口来实现这些条件。
作用:
- 请求匹配:通过谓词来判断请求是否符合某个路由的条件。
- 灵活配置:支持多种类型的谓词,如路径匹配、方法匹配、请求头匹配等。
# 3. 过滤器(Filter)
定义:过滤器用于在请求转发前后对请求和响应进行处理。Spring Cloud Gateway 提供了多种内置过滤器,并支持自定义过滤器。
# 快速上手
# 实现GateWay服务
引入对应pom坐标:
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 指标监控健康检查的actuator,网关是响应式编程删除掉spring-boot-starter-web dependency-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
因为它只是网关,所以不必引入web-starter,而网关也是一个微服务因此也需要将其注入到服务发现组件中如nacos等(需要引入对应组件),其中关键坐标为:
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2
3
4
5
接着修改Application文件
spring:
application:
name: cloud-gateway #以微服务注册进consul或nacos服务列表内
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:9001 #匹配后提供服务的路由地址
predicates:
- Path=/pay/gateway/get/** # 断言,路径相匹配的进行路由
- id: pay_routh2 #pay_routh2 #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:9001 #匹配后提供服务的路由地址
predicates:
- Path=/pay/gateway/info/**
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: root
password: root
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
如此一来,假如gateway服务的地址是localhost:8989,如果我访问localhost:8989/pay/gateway/info/,按照上面的配置会被转发到http://localhost:9001/pay/gateway/info/
到此通过网关隐藏其他微服务地址(ip地址)的目的就成功达到了。
对了GateWay微服务的启动类,记得加上服务注册注解@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class GateWay9527 {
public static void main(String[] args) {
SpringApplication.run(GateWay9527.class,args);
}
}
2
3
4
5
6
7
8