网关
2026/1/17大约 3 分钟
网关
认识网关
网关简单来说就是微服务的大门,请求必须经由网关才能进入具体微服务,因此网关作为关口起到了身份校验、路由转发、负载均衡等作用。

在SpringCloud当中,提供了两种网关实现方案:
- Netflix Zuul:早期实现,目前已经淘汰
- SpringCloudGateway:基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强。课堂中以SpringCloudGateway为例来讲解,官方网站:https://spring.io/projects/spring-cloud-gateway/#learn
快速入门
接下来,我们先看下如何利用网关实现请求路由。(前端请求怎么映射到微服务)
由于网关本身也是一个独立的微服务,因此也需要创建一个模块开发功能。大概步骤如下:
创建网关微服务
创建一个新的module,命名为hm-gateway,作为网关微服务:pom.xml文件中引入依赖:
<!--common-->
<dependency>
<groupId>top.justq</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</dependency>
<!--网关-->
<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>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>- 新建一个启动类:
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}- 配置路由(重点)
resources目录新建一个application.yaml文件,内容如下:
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.150.101:8848
gateway:
routes:
- id: item # 路由规则id,自定义,唯一
uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
- Path=/items/**,/search/** # 这里是以请求路径作为判断规则
- id: cart
uri: lb://cart-service
predicates:
- Path=/carts/**
- id: user
uri: lb://user-service
predicates:
- Path=/users/**,/addresses/**
- id: trade
uri: lb://trade-service
predicates:
- Path=/orders/**
- id: pay
uri: lb://pay-service
predicates:
- Path=/pay-orders/**详细的路由断言规则请看下节。
路由断言
路由规则的定义语法如下:
spring:
cloud:
gateway:
routes:
- id: item
uri: lb://item-service
predicates:
- Path=/items/**,/search/**网关路由对应的java类型是RouteDefinition常见的四个属性含义如下:
- id:路由的唯一标示
- predicates:路由断言,其实就是匹配条件
- filters:路由过滤条件,后面讲
- uri:路由目标地址,lb://代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问。
predicates路由断言常见的类型如下:
| 名称 | 说明 | 示例 |
|---|---|---|
| After | 是某个时间点后的请求 | After=2037-01-20T17:42:47.789-07:00[America/Denver] |
| Before | 是某个时间点之前的请求 | Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
| Between | 是某两个时间点之间的请求 | Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
| Cookie | 请求必须包含某些cookie | Cookie=chocolate, ch.p |
| Header | 请求必须包含某些header | Header=X-Request-Id, \d+ |
| Host | 请求必须是访问某个host(域名) | Host=**.somehost.org,**.anotherhost.org |
| Method | 请求方式必须是指定方式 | Method=GET,POST |
| Path | 请求路径必须符合指定规则 | Path=/red/{segment},/blue/** |
| Query | 请求参数必须包含指定参数 | Query=name, Jack 或 Query=name |
| RemoteAddr | 请求者的IP必须是指定范围 | RemoteAddr=192.168.1.1/24 |
| Weight | 权重处理(负载均衡) | Weight=group1, 8 |
filters路由过滤器对应常见的如下:
| 名称 | 说明 | 示例 |
|---|---|---|
| AddRequestHeader | 给当前请求添加一个请求头 | AddrequestHeader=headerName,headerValue |
| RemoveRequestHeader | 移除请求中的一个请求头 | RemoveRequestHeader=headerName |
| AddResponseHeader | 给响应结果中添加一个响应头 | AddResponseHeader=headerName,headerValue |
| RemoveResponseHeader | 从响应结果中移除有一个响应头 | RemoveResponseHeader=headerName |
| RewritePath | 请求路径重写 | RewritePath=/red/?(?<segment>.*), /$\{segment} |
| StripPrefix | 去除请求路径中的N段前缀 | StripPrefix=1,则路径/a/b转发时只保留/b |
