互动:
为什么学习了网关 Zuul,又要讲 Spring Cloud Gateway 呢?
原因很简单,就是 Spring Cloud 已经放弃 Zuul 了。现在 Spring Cloud 中引用的还是 Zuul 1.x 版本,而 这个版本是基于过滤器的,是阻塞 IO,不支持长连接,spring 官网上也已经没有 zuul 的组件了,所以给大家讲下 SpringCloud 原生的网关产品 Gateway。
Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul,由 spring 官方基于Spring5.0,Spring Boot2.0,Project Reactor 等技术开发的网关,该项目提供了一个构建在 Spring Ecosystem 之上的 API 网关,旨在提供一种简单而有效的途径来发送 API,并向他们提供交叉关注点,例如:安全性,监控/指标和弹性。
SpringCloud Gateway 特征
SpringCloud 官方对 SpringCloud Gateway 特征介绍如下:
(1)集成 Hystrix 断路器
(2)集成 Spring Cloud DiscoveryClient
(3)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(4)具备一些网关的高级功能:动态路由、限流、路径重写
从以上的特征来说,和 Zuul 的特征差别不大。SpringCloud Gateway 和 Zuul 主要的区别,还是在底层的通信框架上。
简单说明一下上文中的三个术语:
1)Filter(过滤器):
和 Zuul 的过滤器在概念上类似,
可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。
过滤器为 org.springframework.cloud.gateway.filter.GatewayFilter 类的实例。
2)Route(路由):
网关配置的基本组成模块,和 Zuul 的路由配置模块类似。
一个 Route 模块由一个 ID,一个目标 URI,组断言和一组过滤器定义。如果断言为真,则路由匹配,目标 URI 会被访问。
3)Predicate(断言):
这是一个 Java8 的 Predicate,
可以使用它来匹配来自 HTTP 请求的任何内容
,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
spring:
cloud:
gateway:
discovery:
locator:
#开启以服务id去注册中心上获取转发地址
enabled: true
##小写serviceId
lower-case-service-id: true
routes:
- id: product-service
uri: lb://product-service
filters:
- StripPrefix=1
predicates:
- Path=/product/**
- id: order-service
uri: lb://order-service
filters:
- StripPrefix=1
predicates:
- Path=/order/**
- id: stock-service
uri: lb://stock-service
filters:
- StripPrefix=1
predicates:
- Path=/stock/**
API网关
微服务架构的应用客户端如何访问各项服务?这会涉及到以下需求:
微服务提供的API粒度通常与客户端需要的有所不同。微服务通常提供的是细粒度API,这意味着客户端需要同多项服务进行交互。
不同客户端需要不同的数据,同时不同客户端的网络性能亦有所区别。
服务实例数量与其位置(主机与端口)会发生动态变化,服务的划分方式会随时间的推移而改变,且不应被客户端所感知。
使用API网关作为全部客户端的单一入口点。该API网关通过以下两种方式之一处理请求。部分请求会被直接代理/路由至对应的服务,另一部分请求则需要接入多项服务。
相比提供满足所有需求的API,API网关可以针对不同客户端提供出不同的API。
[root@master js]# ls
index.js jquery-1.8.2.min.js layui orderList.js productList.js
[root@master js]# grep "http://gateway.ctnrs.com:8000" -r
productList.js: , url: 'http://gateway.ctnrs.com:8000/product/queryAllProduct'
productList.js: url: "http://gateway.ctnrs.com:8000/order/submitOrder",
orderList.js: , url: 'http://gateway.ctnrs.com:8000/order/queryAllOrder'