Spring Cloud Gateway

Gateway简介

Gateway为SpringBoot应用提供了API网关支持,具有强大的智能路由与过滤器功能,是Spring Cloud的第二代网关组件。

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5.0、Spring Boot 2和Project Reactor等技术。

Gateway旨在提供一种简单有效的方式来对API进行路由以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。

Gateway基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲。

Gateway特性

Spring Cloud Gateway具有如下特性:

  • 基于基于Spring 5、Spring Boot 2和Project Reactor进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 集成Spring Cloud服务发现组件自动转发请求,默认集成Ribbon做负载均衡,默认集成Hystrix的断路器功能网关进行保护;
  • 易于编写Predicate(断言)和Filter(过滤器)并对路由指定
  • 请求限流,支持路径重写
  • 性能强劲,功能强大,设计优雅,易于扩展。

Gateway核心概念

Route(路由)

路由是构建网关的基本模块,它由ID、目标URL、一系列的断言和过滤器组成。如果断言为true,则匹配该路由。

Predicate(断言)

Java 8的Function Predicate。输入类型是Spring框架中ServerWebExchange。开发人员可以匹配HTTP请求中的所有内容,例如请求头或请求参数。如果请求与断言相匹配,则进行路由。

Filter(过滤器)

指的是Spring框架中GatewayFilter的实例。使用过滤器,可以在请求被路由前后对请求以及响应数据进行修改,同时可以利用Filter实现授权、访问日志记录、接口耗时记录等功能。

Spring Cloud架构图

img

Gateway Client发送请求给Spring Cloud Gateway,Gateway Handler Mapping会判断请求路径是否匹配路由的配置,如果匹配则会进入Gateway Web Handler,Gateway Web Handler会读取路由上所有配置的过滤器,然后将该请求交给过滤器处理,最后转发到路由配置的微服务上。

整合Gateway网关服务

创建api-gateway模块

image-20220605220825979

添加依赖

image-20220605220610948

1
2
3
4
5
6
7
8
9
10
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>

添加配置文件

1
2
3
4
5
6
7
8
9
10
server:
port: 8501
spring:
application:
name: api-gateway
eureka:
client:
service-url:
defaultZone: http://root:123456@replica1:8005/eureka,
http://root:123456@replica2:8006/eureka

添加启动类

1
2
3
4
5
6
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}

配置路由(两种不同的方式)

Gateway提供了两种不同方式用于路由的配置,一种是通过yml文件来配置,另一种是通过Java Bean来配置。

使用yml文件配置

修改配置文件:

image-20220605224452034

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8501
spring:
application:
name: api-gateway
cloud:
gateway: # 配置路由
routes:
- id: borrow-service # 路由ID
uri: lb://borrow-service # 匹配后路由地址 lb表示负载均衡
predicates: # 断言,路径相匹配进行路由
- Path=/borrow/**
eureka:
client:
service-url:
defaultZone: http://root:123456@replica1:8005/eureka,
http://root:123456@replica2:8006/eureka

image-20220605232411324

使用Java Bean配置

image-20220605232458457

1
2
3
4
5
6
7
8
9
10
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/user/**")
.uri("http://localhost:8101/user/**"))
.build();
}
}

image-20220605232523491

路由过滤器

给请求添加请求头的过滤器

image-20220606094937543

在BookController获取请求头并输出

image-20220606095201696

测试

image-20220606095224169

控制打印

image-20220606095302361

全局路由配置器