Spring Cloud Gateway简介
1. Gateway背景:
Spring Cloud 2的推荐网关,是SpringCloud的亲儿子。众所周知SpringCloud1的网关采用的是Netflix的Zuul,而Zuul采用的是阻塞式交易,被诟病性能问题良久,后续Zuul2采用了非阻塞,但基于Netflix对组件的逐步停止开源,SpringCloud推出了Gateway。
2. Gateway介绍
Spring Cloud Gateway 是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。除了提供Zuul原有的路由和过滤器能力外,springcloud gateway还提供了限流、安全、监控指标等;
Spring Cloud Gateway实现非阻塞式Api是弃用了SpringMVC,采用了spring新的web方案——WebFlux。Webflux采用的响应式变成,很好的实现了非阻塞交互,但也因此不兼容mvc相关的spring-cloud-starter-web等引用。
SpringCloud Gateway原理
1. 网关总体流程
2. 网关核心组件
gateway是由路由、过滤器和断言三部分组成,路由包括全局路由和局部路由。
每个route下面通过配置断言进行准入判断,可以通过配置filter进行请求过滤和处理。
- Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
- Predicate(谓语、断言):路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。
- Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。
配置信息样例如下:
spring:
application:
name: spring-cloud-gateway-sample
cloud:
gateway:
routes: #路由配置
- id: blog #路由id,需要唯一,可以配置多个路由
uri: http://blog.yuqiyu.com
predicates: # 断言,判断路由匹配规则
# 匹配路径转发
- Path=/api-boot-datasource-switch.html
filters:
-StripPrefix=1
- name: xxxx
args:
xxxx: xxxxx
xxxx: xxxxx
server:
port: 9090
注意“=”和“:”的区别
开始使用SpringCloud Gateway
1. 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2. 创建Springboot应用
@SpringBootApplication
@EnableDiscoveryClient
public cliass GatewayApplication {
public static void main(String[] args){
SpingApplication.run(GatewayApplication.class, args);
}
}
3. 配置网关路由信息
网关路由配置分为两种方式,配置文件配置和API配置,无论采用哪种方式都是配置Route信息完成路由的规则配置。
route主要包括如下要素:
-id:路由的ID
-uri:匹配路由的转发地址
-predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。
-
Route的API配置方式
-
配置文件配置方式
4.内置断言
断言可以自定义自己的断言类,gateway内部也自带了通用的Predicate,主要类别如下:
具体使用可以参见 Spring Cloud GateWay 路由转发规则介绍 这篇文章
5. 内置filter