当前位置:首页 > 后端开发 > Spring Cloud 使用 GateWay

Spring Cloud 使用 GateWay

6个月前 (05-27)49

GateWay简介

Spring Cloud GateWay是Spring Cloud的一个全新项目,目标是取代Netflix Zuul,它基于Spring5.0+SpringBoot2.0+WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能高于Zuul,官方测试,GateWay是Zuul的1.6倍,旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式。

Spring Cloud GateWay不仅提供统⼀的路由⽅式(反向代理)并且基于 Filter(定义过滤器对请求过滤,完成⼀些功能) 链的⽅式提供了⽹关基本的功能,例如:鉴权、流量控制、熔断、路径重写、⽇志监控等。

网关在架构中的位置,可以看到是请求进来由网关路由分配找到需要请求的服务,其中Nginx是用来做网管高可用的。

Spring Cloud 使用 GateWay _ Java侠

一、filter的作用和生命周期

Zuul1.x 阻塞式IO 2.x 基于Netty,Spring Cloud GateWay天生就是异步非阻塞的,基于Reactor模型;

一个请求-->网关根据特定的条件匹配—>匹配成功之后可以将请求转发到指定的服务地址;在这个过程中,我们可以进行一些比较具体的控制(限流、日志、黑白名单)

路由(route): 网关最基础的部分,也是网关比较基础的工作单元。路由由多个ID、多个多标URL(最终路由到的地址)、一系列的断言(匹配条件判断)和Filter过滤器(精细化控制)组成。如果断言为true,则匹配该路由。

断言(predicates):参考了Java8中的断言java.util.function.Predicate,开发人员可以匹配Http请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配),如果断言与请求相匹配则路由。

过滤器(filter):一个标准的Spring webFilter,使用过滤器,可以在请求之前或者之后执行业务逻辑。

Predicates断言就是我们的匹配条件,Filter就可以理解为多个无所不能的拦截器,有了这两个元素,结合⽬标URL,就可以实现一个具体的路由转发。

1.1、作用

 在微服务的上一层加一个全局的权限控制、限流、日志输出的Api Gatewat服务,然后再将请求转发到具体的业务服务层。这个Api Gateway服务就是起到一个服务边界的作用,外接的请求访问系统,必须先通过网关层。

1.2、生命周期

  Spring Cloud Gateway同zuul类似,有“pre”和“post”两种方式的filter。

Spring Cloud 使用 GateWay _ Java侠

客户端向Spring Cloud GateWay发出请求,然后在GateWay Handler Mapping中找到与请求相匹配的路由,将其发送到GateWay Web Handler;Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(pre)或者之后(post)执行业务逻辑。 

Filter在“pre”类型过滤器中可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改、日志的输出、流量监控等。

从过滤器生命周期(影响时机点)的⻆度来说,主要有两个pre和post:

  • pre:这种过滤器在请求被路由之前调用。我们可以利用这类过滤器实现身份验证、在集群中选择 请求的微服务、记录调试信息等。
  • post:这种过滤器在路由到微服务以后执行。这类过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端。

与zuul不同的是,filter除了分为“pre”和“post”两种方式的filter外,在Spring Cloud Gateway中,

从过滤器作用范围的角度来说,可分为另外两种,一种是针对于单个路由的gateway filter,它在配置文件中的写法同predict类似;另外一种是针对于所有路由的global gateway filer。现在从作用范围划分的维度来讲解这两种filter。

Spring Cloud 使用 GateWay _ Java侠

 区别:

  • GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。
  • GlobalFilter:全局过滤器,不需要再配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain能够识别的过滤器。

二、gateway filter

GatewayFilter : 需要通过spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过spring.cloud.default-filters配置在全局,作用在所有路由上。

2.1、gateway内置的filter

Spring Cloud 使用 GateWay _ Java侠

 

2.2、自定义filter

2.2.1、自定义过滤器工厂

在上面的自定义过滤器中,有没有办法自定义过滤器工厂类呢?这样就可以在配置文件中配置过滤器了。现在需要实现一个过滤器工厂,在打印时间的时候,可以设置参数来决定是否打印请参数。查看GatewayFilterFactory的源码,可以发现GatewayFilterfactory的层级如下:

Spring Cloud 使用 GateWay _ Java侠

过滤器工厂的顶级接口是GatewayFilterFactory,我们可以直接继承它的两个抽象类来简化开发AbstractGatewayFilterFactory和AbstractNameValueGatewayFilterFactory,这两个抽象类的区别就是前者接收一个参数(像StripPrefix和我们创建的这种),后者接收两个参数(像AddResponseHeader)。

过滤器工厂的顶级接口是GatewayFilterFactory,有2个两个较接近具体实现的抽象类,分别为AbstractGatewayFilterFactory和AbstractNameValueGatewayFilterFactory,这2个类前者接收一个参数,比如它的实现类RedirectToGatewayFilterFactory;后者接收2个参数,比如它的实现类AddRequestHeaderGatewayFilterFactory类。

可以参考gateway内置的Filter例如RedirectToGatewayFilterFactory的写法,

  1. extends AbstractGatewayFilterFactory类,实现apply方法;
  2. 需要在工程的启动文件Application类中,向Srping Ioc容器注册RequestTimeGatewayFilterFactory类的Bean;
  3. 配置文件中配置,配置时只需要填写xxxGatewayFilterFactory前面的xxx;或者通过编码方式:例如:
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes()
                    .route(r -> r.path("/serviceApi/**").filters(f -> f.filter(new MonitoringGatewayFilter()))
                            .uri("lb://tag"))
                    .route(r -> r.path("/offline/**").filters(f -> f.filter(new MonitoringGatewayFilter()))
                            .uri("lb://claimplat-offline"))
                    .route(r -> r.path("/test/**").filters(f -> f.filter(new MonitoringGatewayFilter()))
                            .uri("lb://claimplat-offline"))
    
                    .route(r -> r.order(11000).path("/baidu")
                            .filters(f -> f.addRequestHeader("x-request-uuid", UUID.randomUUID().toString())
                                    .filter(new MonitoringGatewayFilter()))
                            .uri("https://www.baidu.com"))
                    .build();
        }

    三、Global Filter

    GlobalFilter : 全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,系统初始化时加载,并作用在每个路由上。 

    3.1、gateway内置的Global Filter

    Spring Cloud Gateway框架内置的GlobalFilter如下:

Spring Cloud 使用 GateWay _ Java侠

 

3.2、自定义Global Filter

一般情况下GlobalFilter全局过滤器是程序员使用较多的过滤器;可以用来自定义一些黑名单校验、Token校验等。

 步骤:

  1. implements GlobalFilter, Ordered,实现filter方法;
  2. 需要在工程的启动文件Application类中,向Srping Ioc容器注册GlobalFilter类的Bean;


原文链接:https://blog.csdn.net/weixin_39693437/article/details/113318568

原文链接:https://blog.csdn.net/weixin_38361347/article/details/114108368

作者:码上得天下
来源链接:https://blog.csdn.net/meser88/article/details/122340264

标签: Gateway

“Spring Cloud 使用 GateWay” 的相关文章

网关Zuul、Gateway、nginx的区别

zuul:是Netflix的,早期在微服务中使用较广泛,是基于servlet实现的,阻塞式的api,不支持长连接。只能同步,不支持异步。不依赖spring-webflux,可以...

Gateway详解

Gateway详解

一、词汇表 路由:是网关基本的模块,分别为id、目标uri、一组谓词+过滤器一起组合而成,如果谓词匹配成功,则路由匹配成功。 谓...

springcloud 2020 gateway 503 错误代码

springcloud 2020 gateway 503 错误代码

POM文件依赖 <dependencies> <dependency> <groupId>org.spring...

微服务网关(gateway)概述 与 嵌入式 Zuul 反向代理

微服务网关(gateway)概述 与 嵌入式 Zuul 反向代理

目录 微服务网关 gateway 概述 路由器网关 Zuul 概述 嵌入式 Zuul 反向代理 ignored-services 不代理指定服务...

Gateway网关服务搭建(4)

Gateway网关服务搭建(4)

目录 一、搭建方式 二、搭建过程 三、上述总结...

微服务之Gateway,Config,Bus,Stream,Sleuth

微服务之Gateway,Config,Bus,Stream,Sleuth

Gateway网关 提供一种简单而有效的方式对API进行路由,以及提供强大的过滤器的功能。(webflux是一种异步非阻塞的框架),也算是一种...

springcloud(六) --GateWay服务网关介绍和使用

springcloud(六) --GateWay服务网关介绍和使用

什么是GateWay Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0、Spring Boot 2....

SpringCloud 微服务网关Gateway介绍及简单路由配置

SpringCloud 微服务网关Gateway介绍及简单路由配置

概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网...

五、SpringCloud之Gateway网关整合Eureka

五、SpringCloud之Gateway网关整合Eureka

一、SpringCloud Gateway介绍 该项目提供了一个用于在 Spring WebFlux 之上构建 API 网关的库。Spring...

8、gateway请求日志记录

8、gateway请求日志记录

要启用 Reactor Netty 访问日志,请设置-­Dreactor.netty.http.server.accessLogEnabl...