微服务SpringCloud之GateWay路由
在前面博客学习了网关zuul,今天学下spring官方自带的网关spring cloud gateway。Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接,如 WebSockets,Spring Cloud Gateway 使用非阻塞 API,支持 WebSockets,支持限流等新特性。
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
相关概念:
Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
工作流程:

客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Spring Cloud Gateway 的特征:
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
- 动态路由
- Predicates 和 Filters 作用于特定路由
- 集成 Hystrix 断路器
- 集成 Spring Cloud DiscoveryClient
- 易于编写的 Predicates 和 Filters
- 限流
- 路径重写
Spring Cloud Gateway 网关路由有两种配置方式,这里建议使用yml进行配置。
- 在配置文件 yml 中配置
- 通过@Bean自定义 RouteLocator,在启动主类 Application 中配置
我们先实现一个简单的路由转发的demo:
1.引入依赖
这里需要引入spring-cloud-starter-gateway。
View Code2.创建application.yml增加配置
server: port: 8081 spring: cloud: gateway: routes: - id: neo_route uri: http://www.cnblogs.com predicates: - Path=/5ishare各字段含义如下:
id:我们自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
filters:过滤规则,本示例暂时没用。
上面这段配置的意思是,配置了一个 id 为 neo_route 的路由规则,当访问地址 upload/201911041645030711.png" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 900px; height: auto;" />
通过时间匹配
Predicate 支持设置一个时间,在请求进行转发的时候,可以通过判断在这个时间之前或者之后进行转发。这里使用After来设置该时间之后转发,Before来设置该时间之前转发,Between来设置该时间区间端转发。在测试的过程中开始设置After转发之后再修改另外两个Before和Between时不起作用了,需要清下浏览器缓存。
server: port: 8081 spring: cloud: gateway: routes: - id: time_route uri: http://www.cnblogs.com predicates: -After=2019-11-03T10:20:06+08:00[Asia/Shanghai] # - Before=2019-11-03T10:55:06+08:00[Asia/Shanghai] # - Between=2019-11-03T11:01:06+08:00[Asia/Shanghai], 2019-11-03T11:05:06+08:00[Asia/Shanghai]通过 Cookie 匹配
Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。如下图所示,当在请求的Cookie中添加name=cuiyw时跳转到http://www.cnblogs.com,当不添加时报404错误。

通过 Header 属性匹配
Header Route Predicate 和 Cookie Route Predicate 一样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。如下图所示当设置X-Request-Id=6666时页面跳转正常,当设置为cuiyw时报404错。
server: port: 8081 spring: cloud: gateway: routes: - id: cookie_route uri: http://www.cnblogs.com predicates: - Cookie=name,cuiyw - Header=X-Request-Id, \d+

通过 Host 匹配
Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。这里没测试出来,暂时略过。
通过请求方式匹配
可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由,如下配置文件配置的是使用Get请求来进行路由,如果使用post则报404错误
server: port: 8081 spring: cloud: gateway: routes: - id: method_route uri: http://www.cnblogs.com predicates: - Method=GET
