SpringCloud Gateway 详解
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
什么是API网关
API网关是整个为微服务API 请求的入口,可以实现过滤API请求。
过滤器适合于单个服务实现过滤请求;
网关拦截整个微服务实现过滤请求,能够解决整个微服务中冗余代码;
过滤器是局部拦截,网关实现全局拦截。
为什么需要API网关
随着微服务架构的流行,API网关也越来越抽到欢迎,在微服务体系架构中,将应用程序划分为几个低耦合的服务(称为微服务)。每个微服务都有其独特的功能,尽管微服务提供了许多好处(最显着的是更加易于开发,部署和维护应用程序的不同),但他们却使客户难以快速、安全的访问所需要的信息。
API网关还可以充当使用这些微服务的苦短的中央接口,从而解决其中的一些问题。客户端不必访问数十个单独的微服务,而是可以向API网关发送单个请求,而API网关本身将聚集微服务。API网关的主要功能陈伟路由,但是使用API网关的原因还有很多。
API网关的职能
请求接入:作为所有API接口服务请求的接入点,管理所有的接入请求。
业务聚合:作为所有户端业务服务的聚合点,所有的业务都可以在这里被调用
中介策略:实现安全、验证、路由、过滤、流控、缓存等策略,进行一些必要的中介处理
统一管理:提供配置管理工具,对所有API服务的调用生命周期和相应的中介策略进行统一管理。
API网关的分类
如上图所示,面对互联网复杂的业务系统,基本可以将API网关分成两类:流量网关和业务网关。
**流量网关:**跟具体的后端业务系统和服务完全无关的部分,比如安全策略、全局性流控策略、流量分发策略等。流量网关的功能跟 Web 应用防火墙(WAF)非常类似。WAF一般是基于 Nginx/OpenResty 的 ngx_lua 模块开发的 Web 应用防火墙。
**业务网关:**针对具体的后端业务系统,或者是服务和业务有一定关联性的部分,并且一般被直接部署在业务服务的前面。业务网关一般部署在流量网关之后,业务系统之前,比流量网关更靠近系统。我们大部分情况下说的 API 网关,狭义上指的是业务网关。并且如果系统的规模不大,我们也会将两者合二为一,使用一个网关来处理所有的工作
开源API网关
目前常见的开源网关大致上按照语言分类有如下几类:
**Nginx+lua:**Open Resty、Kong、Orange、Abtesting gateway 等
**Java:**Zuul/Zuul2、Spring Cloud Gateway、Kaazing KWG、gravitee、Dromara soul 等
**Go:**Janus、fagongzi、Grpc-gateway
**Dotnet:**Ocelot
**NodeJS:**Express Gateway、Micro Gateway
按照使用数量、成熟度等来划分,主流的有 4 个:
OpenResty
Kong
Zuul/Zuul2
Spring Cloud Gateway
Spring Cloud GateWay
概述
SpringCloud GateWay 是 Spring Cloud 的一个全新的项目, 基于 Spring 5.0
+Spring Boot 2.0
和 Project Reactor
等技术开发的网关,它旨在为微服务架构通过一种鸡蛋呢有效的统一的API 路由管理方式
Spring Cloud GateWay 作为 Spring Cloud 生态系统的网关, 目标是替代 Zuul , 在Spring Cloud2.0 以上版本种,没有对新版本的 Zuul 2.0 以上版本最高性能版本进行集成,仍然还是使用的 Zuul 1.x 非 Reactor
模式的老版本,为了提升网关性能, Spring Cloud GateWay 基于 WebFlux 框架实现的,而WebFlux 框架底层则使用了高性能的 Reactor 模式通讯框架 Netty
Spring Cloud GateWay 的目标是提供统一的路由方式且基于Filter 链的方式提供网关的基本功能,例如:安全,监控/指标, 和限流。
特性
基于Spring Framewrok5,Project Reactor 和Spring Boot 2.0进行构建
动态路由:能够匹配任何请求属性;
可以对路由指定 Predicate(断言)和 Filter(过滤器);
集成 Spring Cloud 服务发现功能;
易于编写 Predicate(断言)和 Filter(过滤器);
请求限流功能;
支持路径重写。
Spring Cloud GateWay与Zuul区别
zuul1 基于Servlet2.5使用阻塞架构,本质上就是一个同步 Servlet,它不支持任何长连接,每来一个请求会专门分配一个线程去处理,然后转发到后端服务,后端再启线程处理请求,后端处理时网关的线程会阻塞,当请求数量比较大时,很容易造成线程池被沾满而无法接受新的请求。
zuul2是基于Netty实现的异步非阻塞编程模型,SpringCloud目前没有整合
pring Cloud Gateway 建立在 Spring Framework5、 Project Reactor 和Spring Boot 2之上,使用非阻塞 API。
Spring Cloud Gateway 还支持 websocket , 并且与 Spring 紧密集成拥有更好的开发体验。
Gateway原理
Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
Predicate(断言):参考的是java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
Web请求,通过一些匹配条件,定位到真正的服务节点,并在这个转发过程前后,进行一些精细化控制。Predicate就是我们的匹配条件;而filter,就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标URL,就可以实现一个具体的路由了。
客户端向Spring Cloud Gateway发出请求。然后在GateWay Handler Mapping中找到与请求相匹配的路由,将其发送到GateWay Web Handler。
Handler再通过制定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Filter在‘pre’类型的过滤器可以做参数校验、流浪监控、日志输出、协议转换等, 在’post‘类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/damishidai15/article/details/108063621
粉丝福利:108本java从入门到大神精选电子书领取
???
?长按上方锋哥微信二维码 2 秒 备注「1234」即可获取资料以及 可以进入java1234官方微信群
感谢点赞支持下哈