SpringCloudGateway:统一网关
什么是网关?
网关功能
- 身份认证和权限校验
- 服务路由、负载均衡
- 请求限流
网关的技术实现
-
在 SpringCloud 中网关的实现包括两种:
- gateway
- zuul
-
Zuul 是基于 Servlet 的实现,属于阻塞式编程;而 SpringCloudGateway 则是基于 Spring5 中提供的 WebFlux,属于响应式编程的实现,具备更好的性能。
快速搭建网关服务
网关搭建步骤:
- 创建项目,引入 nacos 服务发现和 gateway 依赖。
- 配置 application.yml,包括服务基本信息、nacos 地址、路由。
路由配置包括:
- 路由 id:路由的唯一标识。
- 路由目标(uri):路由的目标地址。其中 http 代表固定地址,lb 代表根据服务名负载均衡。
- 路由断言(predicates):判断路由的规则。
- 路由过滤器(filters):对请求或响应做处理。
1)创建新的模块(项目),引入 SpringCloudGateway 的依赖和 nacos 的服务发现依赖:
<!-- 网关依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- nacos服务发现依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)编写路由配置及 nacos 地址
server:
port: 10010 # 网关端口
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址。http 表示固定地址
uri: lb://userservice # 路由的目标地址。"lb"表示负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/user/** # 这个是按照路径匹配,只要以 /user/ 开头就符合要求
3)请求效果:
Route Predicate Factory(路由断言工厂)
网关路由可以配置的内容包括:
- 路由 id:路由唯一标识。
- uri:路由目的地,支持 lb 和 http 两种。
- predicates:路由断言规则,用于判断请求是否符合要求,符合则转发到路由目的地。
- filters:路由过滤器,用于处理请求或响应。
Route Predicate Factory:
- 我们在配置文件中写的断言规则只是字符串,这些字符串会被 Predicate Factory 读取并处理,转变为路由判断的条件。
- 例如
Path=/user/**
表示按照路径匹配(以 /user 开头则表示断言成功)
,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory 类来处理的。 - 像这样的断言工厂在 SpringCloudGateway 还有十几个。
Spring 提供了 11 种基本的 Predicate 工厂:
GatewayFilter(路由过滤器)
GatewayFilter 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
Spring 提供了 31 种不同的路由过滤器工厂(GatewayFilterFactory)。例如: