API网关之Spring Cloud Gateway 的实践
Spring Cloud Gateway 介绍
Spring Cloud Gateway 是Spring 官方基于Spring5.0、Spring Boot 2.0 和Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式。目的是为了替换Netfix Zuul ,它不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等。
Spring Cloud Gateway 依赖Spring Boot 和 Spring WebFlux,基于Netty 运行。它不能再传统的servlet 容器中工作,也不能够建成war包。
Spring中核心的概念:
1.Route
Route是网关的基础元素,由ID、目标URI、断言、过滤器组成。当请求到达网关时,由Gateway Handler Mapping 通过断言进行路由匹配(Mapping),当断言为真时,匹配到路由。
2.Predicate
Predicate 是java8中提供的一个函数。输入类型是Spring Framwork ServerWebExchange。它允许开发人员匹配来自Http的请求,例如请求头或者请求参数。简单理解就是匹配条件。
3.Filter
Filter是Gateway中的过滤器,可以再请求发出前后进行一些业务上的处理。
Spring Cloud Gateway 工作原理
Spring Cloud Gateway 的工作原理和Zuul差不多,最大的区别就是Gateway的Filter只有pre 和post两种。下面我们简单了解一下Gateway的工作原理,如下图所示。
客户端向Spring Cloud Gateway 发出请求,如果请求与网关定义的路由匹配,则该请求就会被发送到官关Web处理程序,即运行特定的请求过滤器链。(pre先执行,post后执行)
Spring Cloud Gateway 快速上手
创建Gateway项目
创建一个Spring Boot 的Maven 项目,增加Spring Cloud Gateway 的依赖,启动类是正常的SpringBoot方式,如下代码:
Spring Cloud Gateway Maven 依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.0.6.RELEASE</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-gateway</artifactId>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
Spring Cloud Gateway 启动类
@SpringBootApplication
public class GatewayApplicaption {
public static void main(String[] args) {
SpringApplication.run(GatewayApplicaption.class, args);
}
}
路由转发示例
基于Path的匹配转发。配置文件如下:
server:
port: 10093
spring:
cloud:
gateway:
routes:
- id: path_route
uri:http://gdscloud.com
predicates:
- Path=/spring
当你访问http://localhost:10093/spring 的时候会转发到http//gdscloud.com/spring。如果需要支持多级Path,配置方式和Zuul 一样,在后面加上两个*号即可,比如 *-Path=/spring/***。
整合Eureka路由
添加Eureka Client 的依赖,如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置基于Eureka 的路由:
- id: user-service
uri:lb://user-service
predicates:
- Path=/user-service/**
uri以lb://开头(lb代表从注册中心获取服务),后面是你需要转发到的服务名称,这个服务名称必须跟Eureka中的对应,否则就会找不到服务,报错。
整合Eureka的默认路由
Zuul会对所有服务都进行转发操作,只需要在访问路径指定访问的服务即可,gateway也可以,配置如下:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
开启之后,访问服务格式如下:
http://网关地址/服务名称(大写)/**
http://localhost:10093/USER-SERVICE/user/get?id=1
服务名称大写修改,增加配置 lower-case-service-id: true
服务名称大小写,二者只能选其一
Spring Cloud Gateway 路由断言工厂
Spring Cloud Gateway 路由工厂的使用
Spring Cloud Gateway 内