一、网关概述
1、作用
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
2、使用场景
网关可以想象成是所有服务的入口
3、为什么选用Gateway
目前已经有了Zuul了,为什么还要开发出Gateway呢?
一方面是因为Zuul 1.0已经进入了维护阶段,而且Gateway是Spring Cloud团队研发的,属于亲儿子,值得信赖,并且很多功能Zuul都没有用起来,同时Gateway也非常简单便捷
Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然Netflix早就发布了Zuul 2.X,但是Spring Cloud没有整合计划,因为NetFlix相关组件都进入维护期,随意综合考虑Gateway是很理想的网关选择。
4、Gateway特性
基于Spring Framework 5,Project Reactor 和Spring boot 2.0 进行构建
- 动态路由,能匹配任何请求属性
- 可以对路由指定Predicate(断言) 和 Filter(过滤器)
- 集成Hystrix的断路器功能
- 集成Spring Cloud服务发现功能
- 易于编写Predicate 和 Filter
- 请求限流功能
- 支持路径重写
5、Spring Cloud Gateway 和 Zuul的区别
在Spring Cloud Gateway Finchley正式版发布之前,Spring Cloud推荐网关是NetFlix提供的Zuul
- Zuul 1.X 是一个基于阻塞IO的API Gateway
- Zuul 2.X理念更先进,基于Netty非阻塞和支持长连接,但Spring Cloud目前还没有整合。
- Spring Cloud Gateway建立在Spring 5,Spring Boot 2.X之上,使用非阻塞API,还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验。
6、WebFlux框架
传统的Web框架,比如Struts2,Spring MVC等都是基于Servlet API 与Servlet容器基础之上运行的,但是在Servlet 3.1之后有了异步非阻塞的支持,而WebFlux是一个典型的非阻塞异步的框架,它的核心是基于Reactor的相关API实现的,相对于传统的Web框架来说,它可以运行在如 Netty,Undertow 及支持Servlet3.1的容器上。非阻塞式 + 函数式编程(Spring5必须让你使用Java8)
Spring WebFlux是Spring 5.0引入的新的响应式框架,区别与Spring MVC,他不依赖Servlet API,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。
三大核心概念
Route 路由
路由就是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为True则匹配该路由
Predicate 断言
参考的Java8的 java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容,例如请求头和请求参数,如果请求与断言想匹配则进行路由
Filter 过滤
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
Gateway工作流程
Web请求通过一些匹配条件,定位到真正的服务节点,并在这个转发过程的前后,进行了一些精细化的控制。
Predicate就是我们的匹配条件,而Filter就可以理解为一个无所不能的拦截器,有了这两个元素,在加上目标URL,就可以实现一个具体的路由了。
客户端向Spring Cloud Gateway发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。
Handler在通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求前(pre)或之后(post)执行业务逻辑。
Filter在 Pre 类型的过滤器可以做参数校验,权限校验,流量监控,日志输出,协议转换等。
在 Post类型的过滤器中可以做响应内容,响应头的修改,日志的输出,流量监控等有着非常重要的作用。
Gateway的核心逻辑:路由转发 + 执行过滤链
常用的Predicate
-
After Route Predicate:在什么时间之后执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZ1BfnaW-1616850416647)(images/image-20200409161713254.png)]
-
Before Route Predicate:在什么时间之前执行
-
Between Route Predicate:在什么时间之间执行
-
Cookie Route Predicate:Cookie级别
常用的测试工具:
- jmeter
- postman
- curl
// curl命令进行测试,携带Cookie curl http://localhost:9527/payment/lb --cookie "username=zzyy"
-
Header Route Predicate:携带请求头
-
Host Route Predicate:什么样的URL路径过来
-
Method Route Predicate:什么方法请求的,Post,Get
-
Path Route Predicate:请求什么路径
- Path=/api-web/**
-
Query Route Predicate:带有什么参数的
Filter的使用
概念
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用
Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生的
Spring Cloud Gateway Filter
生命周期:
- pre,Post
种类:
- GatewayFilter
- GlobalFilter
自定义过滤器
主要作用:
- 全局日志记录
- 统一网关鉴权
需要实现接口:implements GlobalFilter, Ordered
全局过滤器代码如下:
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("come in global filter: {}", new Date());
ServerHttpRequest request = exchange.getRequest();
String uname = request.getQueryParams().getFirst("uname");
if (uname == null) {
log.info("用户名为null,非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
// 放行
return chain.filter(exchange);
}
/**
* 过滤器加载的顺序 越小,优先级别越高
*
* @return
*/
@Override
public int getOrder() {
return 0;
}
}