Gateway介绍
Spring Cloud Gateway是Spring Cloud的一个全新项目,基于Spring 5,Spring Boot 2和 Project Reactor等技术开发的网关,它旨在为微服务框架提供一种简单有效的统一的API路由管理方式,以及基于Filter方式提供一些强大的过滤功能,例如:熔断、限流、重试等
Spring Cloud Gateway作为spring Cloud 生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本Zuul 2.0以上最新高性能版本进行集成,仍然还是Zuul 1.x非Reactor模式的老版本,而为了提升网关的性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway功能:
1、基于Spring Framework 5,Project Reactor和Spring Boot 2.0构建
2、能够匹配任何请求属性上的路由。
3、断言和过滤器特定于路由。
4、Hystrix断路器集成。
5、Spring Cloud DiscoveryClient集成
6、易于编写的断言和过滤器
7、请求速率限制
8、路径改写
Spring Cloud 架构图
由此可以知道网关在整个SpringCloud 中的位置
Gateway工作流程
工作流程图
客户端向Spring Cloud Gateway发出请求。如果网关处理程序(Gateway Handler Mapping)映射确定请求与路由匹配,则将其发送到网关Web处理程序(Gateway Web Handler.)。该处理程序通过特定于请求的过滤器链来运行请求。过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。所有“pre”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“post”过滤器逻辑。
Filter,在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出、流量监控等,有非常重要的作用
Gateway使用
springcloud gateway案例演示,需要搭建一个springcloud项目,参考:【SpringCloud】快速入门(一)
springcloud项目,包含一个Eureka注册中心,一个服务提供者,一个服务消费者
1、在以上springcloud的项目基础上,新建模块Spring Cloud Gateway(springcloud-gateway-gateway9527)
2、在Gateway模块中引入Gateway依赖和Eureka依赖
1 2 <dependency> 3 <groupId>org.springframework.cloudgroupId> 4 <artifactId>spring-cloud-starter-gatewayartifactId> 5 dependency> 6 7 8 <dependency> 9 <groupId>org.springframework.cloudgroupId> 10 <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId> 11 dependency>
完整依赖如下:

1 xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>test-springcloudartifactId> 7 <groupId>com.testgroupId> 8 <version>1.0-SNAPSHOTversion> 9 parent> 10 <modelVersion>4.0.0modelVersion> 11 12 <artifactId>springcloud-gateway-gateway9527artifactId> 13 <build> 14 <plugins> 15 <plugin> 16 <groupId>org.apache.maven.pluginsgroupId> 17 <artifactId>maven-compiler-pluginartifactId> 18 <configuration> 19 <source>8source> 20 <target>8target> 21 configuration> 22 plugin> 23 plugins> 24 build> 25 26 <dependencies> 27 28 29 <dependency> 30 <groupId>org.springframework.cloudgroupId> 31 <artifactId>spring-cloud-starter-gatewayartifactId> 32 dependency> 33 34 35 <dependency> 36 <groupId>org.springframework.cloudgroupId> 37 <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId> 38 dependency> 39 40 41 42 43 44 45 46 <dependency> 47 <groupId>org.springframework.bootgroupId> 48 <artifactId>spring-boot-starter-actuatorartifactId> 49 dependency> 50 <dependency> 51 <groupId>org.springframework.bootgroupId> 52 <artifactId>spring-boot-devtoolsartifactId> 53 <scope>runtimescope> 54 <optional>trueoptional> 55 dependency> 56 57 <dependency> 58 <groupId>org.projectlombokgroupId> 59 <artifactId>lombokartifactId> 60 <optional>trueoptional> 61 dependency> 62 <dependency> 63 <groupId>org.springframework.bootgroupId> 64 <artifactId>spring-boot-starter-testartifactId> 65 <scope>testscope> 66 dependency> 67 68 dependencies> 69 70 project>
⚠️注意:不能引入模块SpringBoot的Web模块(spring-boot-starter-web),否则启动报错,如下:
3、编辑appliction.yml文件
1 # 端口 2 server: 3 port: 9527 4 5 spring: 6 application: 7 name: cloud-gateway-gateway 8 cloud: 9 gateway: 10 routes: 11 # 路由的ID,没有固定规则,但要求唯一,建议配合服务名 12 - id: payment_routh 13 # 匹配后提供服务的路由地址 14 uri: http://localhost:8001 15 # 断言,路径相匹配的进行路由 16 predicates: 17 - Path=/payment/get/** 18 19 eureka: 20 client: 21 register-with-eureka: true 22 fetch-registry: true 23 service-url: 24 defaultZone: http://localhost:8761/eureka
4、测试
1)启动项(springcloud-gateway-gateway9527),注册到Eureka注册中心
2)访问地址:http://localhost:8001/payment/get/1,证明支付模块服务正常
3)访问地址:http://localhost:9527/payment/get/1,验证网关已生效