1.SpringCloud Gateway简介
1.1.概述
1、SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
2、SpringCloud Gateway基于WebFlux框架实现,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
3、Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
4、SpringCloud Gateway有以下特征:
(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)集成 Hystrix 断路器
(3)集成 Spring Cloud DiscoveryClient
(4)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(5)具备一些网关的高级功能:动态路由、限流、路径重写
Route(路由):网关配置的基本组成模块,一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
Predicate(断言):这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容。
Filter(过滤器):可以使用它拦截和修改请求,并且对上游的响应,进行二次处理
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
1.4.网关在微服务架构中的位置
2.1.新建SpringCloud项目
1、Idea新建一个简单的SpringCloud项目,名为cloudDemo1
2、规定打包类型、确定版本、加入必要的依赖
代码略
新建两个子服务。
2.2.1.新建Gateway模块
1、新建Gateway模块,加入gateway依赖(注意:gateway依赖会和web依赖发生冲突)yml配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
server:
servlet:
context-path: /
port: 82
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
- id : product-service
uri : http://localhost:8084/
predicates:
- Path=/product/**
- id: order-service
uri : http://localhost:8083/
predicates:
- Path=/order/**
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
简单路由规则(各字段含义):
cloud:配置Spring cloud相关属性
gateway:配置Spring cloud Gateway相关属性
routes:配置网关中的一个完整路由,,包括命名,地址,谓词集合(规则),过滤器集合
- id :路由定义的命名,唯一即可。命名规则和变量规则一致
uri :当前路由定义对应的微服务转发地址
predicates:配置谓词集合
例 - Path=/product/** 定义一个谓词。格式:谓词名字=参数 或者 name:名字 args:参数 (其他谓词后面有详细介绍)
filters:配置过滤器集合
例 -StripPrefix=1 定义一个过滤器,过滤转发地址前缀1节。
3.Predicate(断言)
Predicate 来源于 Java 8,是 Java 8 中引入的一个函数,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。
如图,是Spring Cloud内置的几种Predicate的实现:
1、时间相关配置
After:在指定时间之后进行路由
Before:在指定时间之前进行路由
Between:在指定时间之间进行路由
predicates:
- Path=/demo/**
#- After=2020-04-25T16:30:58.215+08:00[Asia/Shanghai]
#- Before=2020-04-25T16:40:58.215+08:00[Asia/Shanghai] -Between=2020-04-25T16:35:58.215+08:00[Asia/Shanghai],2020-04-25T16:40:58.215+08:00[Asia/Shanghai]
Cookie: Cookie=cookie名, cookie值的正则表达式规则。不带cookies访问则会报404错误,带上cookies访问,且id为正则表达式规定的内容才能正常访问。
predicates:
- Path=/demo/**
- Cookie=id, [0-9]
3.3.自定义断言工厂
略
4.Gateway的路由规则:Filter
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定的路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。
1、PrefixPath:对所有的请求路径添加前缀
filters:
- PrefixPath=/mypath
2、RewritePath:对指定的路径用参数内容替换
filters:
- RewritePath=/test, /product/test
3、RedirectTo:重定向,配置包含重定向的返回码和地址
filters:
- RedirectTo=302, https://www.baidu.com
4、StripPrefix:跳过指定路径
filters:
- StripPrefix=1
4.3.实现熔断降级
在分布式系统中,网关作为流量的入口,因此会有大量的请求进入网关,向其他服务发起调用,其他服务不可避免的会出现调用失败(超时、异常),失败时不能让请求堆积在网关上,需要快速失败并返回给客户端,想要实现这个要求,就必须在网关上做熔断、降级操作。
当一个客户端请求发生故障的时候,这个请求会一直堆积在网关上,当然只有这一种请求,网关不会有问题,但是网关上堆积多了就会给网关乃至整个服务都造成巨大的压力,甚至整个服务宕掉。因此要对一些服务和页面进行有策略的降级,以此缓解服务器资源的的压力,以保证核心业务的正常运行,同时也保持了客户和大部分客户的得到正确的相应,所以需要网关上请求失败需要快速返回给客户端。
routes:
- id: rateLimit_route
uri: http://localhost:8000
order: 0
predicates:
- Path=/test/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackCmdA
fallbackUri: forward:/fallbackA
hystrix.command.fallbackCmdA.execution.isolation.thread.timeoutInMilliseconds: 5000
(1)过滤器StripPrefix,作用是去掉请求路径的最前面n个部分截取掉。
StripPrefix=1就代表截取路径的个数为1,比如前端过来请求/test/good/1/view,匹配成功后,路由到后端的请求路径就会变成http://localhost:8084/good/1/view。
(2)过滤器Hystrix,作用是通过Hystrix进行熔断降级
当上游的请求,进入了Hystrix熔断降级机制时,就会调用fallbackUri配置的降级地址。需要注意的是,还需要单独设置Hystrix的commandKey的超时时间。