1.作用功能:
统一路由
安全
监控
限流
2.相关概念:
Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
3.特征
基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
动态路由
Predicates 和 Filters 作用于特定路由
集成 Hystrix 断路器
集成 Spring Cloud DiscoveryClient
易于编写的 Predicates 和 Filters
限流
路径重写
4.Spring Cloud Gateway 网关路由有两种配置方式:
在配置文件 yml 中配置
通过@Bean自定义 RouteLocator,在启动主类 Application 中配置
5.Spring Boot的版本兼容问题
Spring Cloud Gateway 的G版本(Spring Cloud的2.1.x版本)与Spring Boot的2.2.0版本不兼容(编译启动没问题,路由有问题No Such Method异常)
6.Spring Cloud Gateway 项目不能打成war包运行在传统的基于Servlet的web容器中
基于Netty及webflux的web编程模型,异步非阻塞
7.pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tsnt</groupId>
<artifactId>gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<name>gateway</name>
<description>api gateway</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/>
</parent>
<properties>
<spring.version>5.1.10.RELEASE</spring.version>
<springboot.version>2.1.9.RELEASE</springboot.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
8.application.yml 分析
#开发环境配置
server:
port: 9001
spring:
application:
name: api-gateway #注册到Eureka上的serviceId(会默认变成大写)
cloud:
gateway:
discovery:
locator:
enabled: true #开启通过服务中心的自动根据 serviceId 创建路由的功能。
lowerCaseServiceId: true #将请求路径上的服务名配置为小写
routes:
-id: service #自定义的路由ID,保持唯一
uri: lb://SERVICE-CLIENT #目标服务地址
predicates: #路由条件
- Path=/service/**
filters: #过滤器
- StripPrefix=1 #转发请求时去除Path中的第一个过滤名称(这里是service)
# Eureka服务中心配置
eureka:
instance:
prefer-ip-address: true # 为false时,那么注册到Eureka中的Ip地址就是本机的Ip地址
#ip-address:ip #prefer-ip-address为true,将此ip地址注册到Eureka中。调用的时候,发送的请求目的地就是此Ip地址
client:
service-url:
# 注册Eureka Server
defaultZone: http://localhost:9100/eureka/
logging:
level:
org.springframework.cloud.gateway: debug