这个文章沉淀一下对gateway的基本认识
1.gateway使用给的背景是什么,逻辑作用是什么
2.如何开发操作gateway
23.gateway提供了哪些机制供使用
1. Gateway 的背景与逻辑作用
-
出现背景:解决单体应用(如一个 SpringBoot + Tomcat)处理能力有限的问题。当单机承载不下时,会采用分布式架构(如 Nacos 做注册中心),将业务拆分为多个微服务。这时就需要一个统一入口来管理这些分散的服务。
-
逻辑作用 :作为反向代理 和API 网关。
- 统一入口:所有外部请求的第一道关卡,屏蔽后端服务的复杂性。
- 请求路由:根据请求路径、参数等条件,智能地转发给后端的正确微服务。
- 横切关注点:在请求转发前后,集中处理认证、日志、限流、熔断等所有微服务共有的逻辑,避免在每个服务里重复开发。
类别单体springboot的springmvc,gateway的逻辑作用是什么
我们知道tomcat和springmvc
或者springboot(自动集成了springmvc)
我们知道单个tomcat(springboot内嵌了)
就算用了nio,单机承载的请求量也有限
我们使用分布式,来横向拓展单个springboot的线程处理能力
nacos作为注册配置中心
使用gateway来作为接收http请求的这么一个jar包。
2.gateway的实体是什么,如何开发操作gateway:
所谓的geteway本质上,就是一个springboot
可以注册到springboot上。
注册到nacos上
通过引入依赖和配置
从nginx上分发下来的流量。
通过gateway这个关口
分发给不同的springboot微服务实体。
我们开发,也就是在这个springboot上的yaml去进行开发
yaml
spring:
cloud:
gateway:
# 路由数组:指当请求满足什么样的断言时,转发到哪个服务上
routes:
# 路由标识,要求唯一,名称任意
- id: gateway-provider_1
# 请求最终被转发到的目标地址
uri: http://localhost:9024
# 设置断言
predicates:
# Path Route Predicate Factory 断言,满足 /gateway/provider/** 路径的请求都会被路由到 http://localhost:9024 这个uri中
- Path=/gateway/provider/**
# Weight Route Predicate Factory 断言,同一分组按照权重进行分配流量,这里分配了80%
# 第一个group1是分组名,第二个参数是权重
- Weight=group1, 8
# 配置过滤器(局部)
filters:
# StripPrefix:去除原始请求路径中的前1级路径,即/gateway
- StripPrefix=1
- id: gateway-provider_2
uri: http://localhost:9025
# 设置断言
predicates:
- Path=/gateway/provider/**
# Weight Route Predicate Factory,同一分组按照权重进行分配流量,这里分配了20%
- Weight=group1, 2
# 配置过滤器(局部)
filters:
# StripPrefix:去除原始请求路径中的前1级路径,即/gateway
- StripPrefix=1
3.gateway提供了哪些机制供使用
Gateway 的核心机制可以概括为"路由+断言+过滤器",都通过 YAML 或 Java 代码配置。
-
路由:网关最基本的配置单元,由 ID、目标 URI、断言和过滤器组成。
-
断言工厂 :匹配条件。满足什么条件,这个路由才生效。Spring Cloud Gateway 内置了很多好用的断言。
- Path :根据请求路径匹配,例如
- Path=/gateway/provider/**。 - Weight:按权重分配流量,常用于灰度发布,例如在多个版本的服务间按比例分配流量。
- 其他 :
Header、Method、Query、Host等,几乎能匹配所有 HTTP 请求特征。
- Path :根据请求路径匹配,例如
-
过滤器工厂 :处理逻辑。可以在请求转发前、转发后执行一些操作。
- 局部过滤器 :只作用于特定路由。如你的示例中的
StripPrefix=1,作用是去掉路径中的前1个/gateway再转发。 - 全局过滤器 :作用于所有路由。Spring Cloud Gateway 内置了一些,如转发、负载均衡等。也可以自定义,实现
GlobalFilter接口,这是实际开发中做统一认证、日志记录最常用的方式。 - 其他常用过滤器 :
AddRequestHeader、RequestRateLimiter(限流)、Retry(重试)等。
- 局部过滤器 :只作用于特定路由。如你的示例中的
总结一下:
| 你的理解 | 更系统化的认识 |
|---|---|
| Gateway 是一个接收请求的 Jar 包 | Gateway 是一个基于 SpringBoot 和 Netty 的异步非阻塞网关 |
| 在 YAML 里配置路由 | 核心是配置路由 + 断言(匹配条件) + 过滤器(处理逻辑) |
| 从 Nginx 分发流量过来 | Gateway 常替代 Nginx 的部分反向代理职能,并提供更灵活的微服务级路由 |
为了巩固你提到的第3点,可以思考一个常见场景:如何用 Gateway 实现统一的权限校验?
答案是自定义全局过滤器 ,实现 GlobalFilter 接口,在 filter 方法中判断请求头里有没有合法的 Token。这个过滤器会拦截所有进入 Gateway 的请求,如果校验失败,直接返回 401 错误,不再转发。这样,所有后端微服务都无需关心认证逻辑了。