关于网关
单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务
Gateway 本身是一个 Spring Boot 应用,它处理请求是逻辑是根据配置的路由对请求进行预处理和转发。Gateway 有几个比较核心的概念:
Route: 一个 Route 由路由 ID,转发 URI,多个 Predicates 以及多个 Filters 构成。Gateway 上可以配置多个 Routes。处理请求时会按优先级排序,找到第一个满足所有 Predicates 的 Route。
Predicate: 表示路由的匹配条件,可以用来匹配请求的各种属性,如请求路径、方法、header 等。一个 Route 可以包含多个子 Predicates,多个子 Predicates 最终会合并成一个。
Filter: 过滤器包括了处理请求和响应的逻辑,可以分为 pre 和 post 两个阶段。多个 Filter 在 pre 阶段会按优先级高到低顺序执行,post 阶段则是反向执行。Gateway 包括两类 Filter
全局 Filter: 每种全局 Filter 全局只会有一个实例,会对所有的 Route 都生效。
路由 Filter: 路由 Filter 是针对 Route 进行配置的,不同的 Route 可以使用不同的参数,因此会创建不同的实例。
执行过程
1.客户端向 Spring Cloud Gateway 发出请求。
2.然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
3.Handler 再通过指 定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
##路由配置
路由是 Gateway 的核心构件,不同的路由根据匹配条件可以处理不同类型的请求,并转发到对应的目标服务。一个路由由以下几个属性组成
Id: 路由 ID。
Uri: 转发请求的目标地址。
Order: 顺序(优先级)。
Predicate: 匹配条件。多个 Predicates 会合并成一个聚合的条件。
Filters: 路由过滤器。这些过滤器最终会和全局过滤器一起排序处理匹配成功的请求。
Metadata: 额外的元数据。
springboot整合gateway
1.导入依赖
<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>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.开启服务的注册发现
在启动类上添加注解 @EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.配置网关的路由规则
spring:
application:
name: gateway-server
cloud:
gateway:
#路由规则
routes:
- id : product-server #路由ID 唯一
uri: http://localhost:7070/ #目标URI,路由到微服务的地址
predicates: #断言
-Method