4、Spring Cloud Gateway入门:核心概念、项目搭建、Hello World路由
好,咱们今天正式进入 Spring Cloud Gateway 的世界。
说实话,网关这个东西,我刚开始接触微服务时觉得它可有可无。直到有一次线上出了个事故——某个老服务突然挂了,结果所有调用方都跟着超时,整个系统差点瘫痪。嗯,从那以后我才明白,网关不是锦上添花,而是微服务架构的「守门员」。
4.1 核心概念:先搞懂这几个关键词
在动手写代码之前,咱们先把几个核心概念捋清楚。我个人习惯是,概念没搞懂,代码写得再漂亮也是空中楼阁。
4.1.1 路由(Route)
路由是网关最基础的能力。说白了,就是「请求从哪来,该去哪」。你想想看,一个请求打到网关,网关得知道它要去哪个微服务吧?
一个路由由三部分组成:
- ID:路由的唯一标识,就像人的身份证号
- URI:目标服务的地址,比如
lb://user-service - 断言(Predicate):匹配条件,满足条件才走这个路由
4.1.2 断言(Predicate)
断言就是「判断条件」。比如:
- 请求路径是不是
/api/user/** - 请求头里有没有
Authorization - 请求时间是不是在某个时间段内
我在项目中遇到过最典型的场景:白天和晚上走不同的路由策略。白天流量大,走集群A;晚上流量小,走集群B。用时间断言就能轻松搞定。
4.1.3 过滤器(Filter)
过滤器是网关的「加工车间」。请求进来时,可以加个鉴权;响应出去时,可以加个统一格式。Spring Cloud Gateway 内置了 30+ 个过滤器,比如:
AddRequestHeader:给请求加个头StripPrefix:去掉路径前缀Retry:失败重试
一句话总结:路由决定「去哪」,断言决定「走不走」,过滤器决定「怎么走」。
4.2 项目搭建:从零开始
好,概念讲完了,咱们动手搭个项目。我建议你跟着我一步步来,别跳步,踩过的坑我都帮你填平了。
4.2.1 创建 Spring Boot 项目
首先,创建一个 Spring Boot 项目。版本我推荐用 2.7.x 或 3.x,具体看你项目里其他组件的兼容性。
依赖方面,核心就一个:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意:千万不要引入 spring-boot-starter-web!Gateway 基于 WebFlux,和 Spring MVC 冲突。我曾经有个同事,项目死活起不来,查了半天发现是这两个依赖打架了。
4.2.2 配置文件
接下来,在 application.yml 里配置路由。这是最常用的方式:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
这段配置的意思是:
- 所有
/api/user/**的请求,都转发到user-service StripPrefix=1表示去掉第一级路径,比如/api/user/list变成/user/list
4.3 Hello World 路由:跑起来看看
光说不练假把式。咱们写一个最简单的 Hello World 路由,让你亲眼看到网关是怎么工作的。
4.3.1 代码实现
其实不需要写任何 Java 代码,纯配置就能搞定。但为了演示,我加一个简单的控制器:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello from Gateway!";
}
}
然后在配置里加一条路由:
spring:
cloud:
gateway:
routes:
- id: hello-route
uri: http://localhost:8080
predicates:
- Path=/hello
启动项目,访问 http://localhost:8080/hello,你会看到:
Hello from Gateway!
嗯,就是这么简单。但别小看这一步,你想想看,如果后端有几十个微服务,每个服务都暴露自己的端口,客户端得维护多少地址?有了网关,客户端只需要知道一个地址就够了。
4.3.2 验证路由生效
你可以打开浏览器开发者工具,看看网络请求。你会发现,请求先打到网关(端口 8080),网关再转发到目标服务。这个过程对客户端是完全透明的。
小技巧:调试时可以在配置里加 spring.cloud.gateway.routes[0].metadata.response-timeout=5000,设置超时时间,避免请求卡死。
4.4 避坑指南:我踩过的三个坑
最后,分享几个我实际项目中踩过的坑,希望能帮你省点时间。
- 依赖冲突:前面说了,别引入
spring-boot-starter-web。如果项目里已经有这个依赖,记得排除掉。 - 路由顺序:路由是按配置顺序匹配的。我曾经把
/api/**写在/api/user/**前面,结果所有请求都走了第一个路由,第二个永远匹配不到。 - 跨域问题:Gateway 默认不允许跨域。如果你有前端页面调用,记得配置
CorsGlobalFilter或者在路由上加Cors过滤器。
好了,这一章的内容就到这里。下一章咱们会深入讲断言工厂,看看 Spring Cloud Gateway 到底支持多少种匹配方式。到时候你会发现,网关的玩法比你想的要多得多。