SpringCloud(H版&alibaba)之Gateway篇
服务网关
Gateway和Zuul说明:
Zuul由于内部出现重大分歧,已经没落,新一代的服务网关是Gateway,只学这个
Gateway 并非netflix开发的,而是spring 社区自己开发的。
Gateway是什么
官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
面试可能会问,是什么,为什么选这个
是什么?
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中采用zuul;
2.x版本中,SpringCloud自己研发了一个网关代替Zuul,那就是Gateway.
Gateway: 旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty.
提供 安全,监控/指标,限流。
为什么选择Gateway
一、基于异步非阻塞模型上进行开发的,性能方面不需要担心;稳定,Zuul 2 进入了维护期。
二、特性
动态路由:能够匹配任何请求属性
可以对路由指定 Predicate (断言) 和 Filter (过滤器);
集成Hystrix 的断路器功能;
集成 Spring Cloud 服务发现功能;
易于编写的 Predicate (断言) 和 Filter (过滤器);
请求限流功能;
支持路径重写;
三、spring cloud gateway 还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验,Zuul阻塞模型,性能要慢,gateway非阻塞模型,是Zuul速度的1.6倍
Gateway工作流程
三大核心概念
Route(路由) :路由是构建网关的基本模块,它由ID,目标URI, 一系列的断言和过滤器组成,如果断言为true,则匹配该路由
Predicate(断言) :参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤) :指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或之后进行修改。
总体:web请求,通过一些匹配条件,定位到真正的服务节点。并且在这个转发过程的前后,进行一些精细化控制。 predicate就是我们的匹配条件;而filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri, 就可以实现一个具体的路由了。
额外的知识:一个请求的流程:
外部请求 ——> 负载均衡——> 网关 ——> 微服务
官网总结流程
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行 业务逻辑,然返回。
过滤器可能会在发送代理请求之前(pre)或之后(post)执行业务逻辑。
Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,
在 “post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
核心逻辑
路由转发 + 执行过滤器链
入门配置
新建Module : cloud-gateway-gateway9527
POM
<dependencies>
<!--Gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--需要注册进eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.huawei.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</d