springcloud入门——gateway

本文详细介绍了SpringCloud Gateway的架构、工作流程、常用的Predicate和Filter,展示了如何搭建、配置动态路由,并演示了如何使用内置Predicate和自定义Filter实现路由规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.gateway简介

2.Gateway工作流程

3.Gateway搭建

3.GateWay常用的Predicate(断言)

4.GateWay的Filter(过滤器)


1.gateway简介

Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和Project Reactor等技术。

SpringCloud Gateway是Spring Cloud的一个全新项目,基于Spring 5.0+Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供—种简单有效的统一的API路由管理方式

SpringCloud Gateway作为Spring Cloud 生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty

SpringCloud Gateway具有如下特性

  •     基于Spring Framework 5,Project Reactor和Spring Boot 2.0进行构建;
  •     动态路由:能够匹配任何请求属性;
  •     可以对路由指定Predicate (断言)和Filter(过滤器);
  •     集成Hystrix的断路器功能;
  •     集成Spring Cloud 服务发现功能;
  •     易于编写的Predicate (断言)和Filter (过滤器);
  •     请求限流功能;
  •     支持路径重写。

微服务架构中网关的位置
 

总结来说,Spring Cloud Gateway的作用:方向代理、鉴权、流量控制、熔断、日志监控 

GateWay非阻塞异步模型:

Springcloud中所集成的Zuul版本,采用的是Tomcat容器,使用的是传统的Serviet IO处理模型。

阻塞式处理模型:Servlet是一个简单的网络IO模型,当请求进入Servlet container时,Servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。但是一旦高并发(如抽风用Jmeter压),线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。在一些简单业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势。

非阻塞异步框架:WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。区别于Spring MVC,它不需要依赖Servlet APl,它是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。

2.Gateway工作流程

三大核心概念:

  •     Route(路由) - 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由;
  •     Predicate(断言) - 参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由;
  •     Filter(过滤) - 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

具体工作流程:

客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler。

Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post")执行业务逻辑。

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

核心逻辑:路由转发 + 执行过滤器链。

3.Gateway搭建

1.构建新模块cloud-gateway,修改pom文件引入依赖:

注意:此处不可引入web及actuator依赖,否则会报错!

2.编写yml文件:

3.建立主启动类:

4.yml文件配置网关地址:

此处配置localhost:8001/payment/get/**路由进行测试

5.测试,访问9527端口,访问成功:

以后使用统一网关即可使用,不需暴露8001端口

Gateway配置路由编码方式:

案例: 通过9527网关访问到外网的百度新闻网址:http://news.baidu.com/guonei

新建config类:

测试:浏览器输入http://localhost:9527/guonei,返回http://news.baidu.com/guonei相同的页面。

Gateway动态路由方式:

默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能(即不写死一个地址)。

修改yml文件配置,开启动态路由,并配置微服务名:

测试,启动eureka集群,8001,8002微服务,再启动9527路由。

输入网址:http://localhost:9527/payment/lb,不停刷新页面,8001/8002两个端口切换。

3.GateWay常用的Predicate(断言)

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。

Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个RoutePredicate工厂可以进行组合。

Spring Cloud Gateway创建Route 对象时,使用RoutePredicateFactory 创建 Predicate对象,Predicate 对象可以赋值给Route。Spring Cloud Gateway包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。

常用的Route Predicate Factory:

  •     The After Route Predicate Factory
  •     The Before Route Predicate Factory
  •     The Between Route Predicate Factory
  •     The Cookie Route Predicate Factory
  •     The Header Route Predicate Factory
  •     The Host Route Predicate Factory
  •     The Method Route Predicate Factory
  •     The Path Route Predicate Factory
  •     The Query Route Predicate Factory
  •     The RemoteAddr Route Predicate Factory
  •     The weight Route Predicate Factory

一些断言规则的应用:

The After Route Predicate Factory:

可以通过下述方法获得符合格式的时间戳字符串:

再在yml文件配置时间蹿:

测试,在该时间前访问,则失败。

The Between Route Predicate Factory

同理,获得时间窜后配置。

The Cookie Route Predicate Factory

配置是否允许带cookie访问,以及带什么样的cookie才能访问。

The Header Route Predicate Factory

同理,配置是否允许带header以及带什么header的访问。

小结

说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。

4.GateWay的Filter(过滤器)

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。

种类(具体看官方文档),分为单一的和全局的:

  • GatewayFilter - 有31种
  • GlobalFilter - 有10种

常用的GatewayFilter:AddRequestParameter GatewayFilter

自定义全局GlobalFilter:

  • 两个主要接口:GlobalFilter、Ordered

作用:全局日志记录、统一网关鉴权

案例:

编写filter类:

该类继承了GlobalFilter类及Ordered类。getorder()方法用来设置加载过滤器的顺序;

Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)中设置过滤器规则:此处为过滤用户名为空的用户。

测试:

浏览器输入:

  • http://localhost:9527/payment/lb  - 访问异常
  • http://localhost:9527/payment/lb?uname=abc  - 访问正常
### Spring Cloud Gateway 入门教程 #### 1. Spring Cloud Gateway 的基本概念 Spring Cloud Gateway 是基于 Spring Framework 5、Project Reactor 和 Spring Boot 2 构建的一个高性能网关框架,它提供了非阻塞式的 API 支持[^2]。作为微服务架构中的重要组成部分,它的主要功能是对 HTTP 请求进行路由转发并提供过滤能力。 #### 2. 工作原理概述 Spring Cloud Gateway 的工作流程可以分为以下几个部分: - **路由匹配**:通过预定义的路由规则来决定请求应该被发送到哪个目标服务。 - **过滤器执行**:在请求到达目标服务之前以及返回客户端之后,可以通过一系列的过滤器对请求和响应进行处理[^1]。 #### 3. 路由配置详解 路由是 Spring Cloud Gateway 中的核心概念之一,其配置通常包括以下几项: - `id`:唯一标识符用于区分不同的路由规则。 - `uri`:指定目标服务地址。 - `predicates`:一组断言函数用来判断当前请求是否满足条件。 - `filters`:应用在此路由上的过滤逻辑列表。 下面是一个简单的 YAML 配置例子展示如何设置一个基本路由: ```yaml spring: cloud: gateway: routes: - id: example_route uri: http://example.org predicates: - Path=/example/** filters: - AddRequestHeader=foo, bar ``` 上述代码片段展示了如何创建一条名为 `example_route` 的路径映射,并向所有符合条件的请求头添加键值对 `foo:bar`[^4]。 #### 4. 网关过滤器的作用与分类 网关过滤器允许开发者以特定的方式修改进入系统的 HTTP 请求或者离开系统的 HTTP 响应。按照作用范围划分,它们可分为局部过滤器(Local Filters)和全局过滤器(Global Filters)。其中前者仅应用于单一路由上而后者则影响整个应用程序内的每一个请求/回应周期。 #### 5. 自定义谓词(Predicate) 除了内置的标准外,Spring Cloud Gateway还支持用户自行扩展新的谓词类以便更灵活地控制流量行为模式[^5]。这使得我们可以针对特殊需求设计专属解决方案而不局限于现有选项集之内. --- ### 实践案例分享 假设我们需要实现这样一个场景——当访问 `/api/v1/users/{userId}` 接口时如果参数 userId 小于等于零就拒绝该次调用,则可通过如下方式完成: ```java @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder){ return builder.routes() .route(r -> r.path("/api/v1/users/**") .and().args("userId", (arg)->Integer.parseInt(arg)<0 ) .filter((exchange, chain) -> ServerResponse.status(HttpStatus.BAD_REQUEST).build()) .uri("lb://USER-SERVICE")) .build(); } ``` 此段程序利用了复合型 Predicates 来组合多个简单条件形成复杂查询表达式的同时也引入了一个错误处理器 Filter 当检测失败时候立即中断链路并向外部反馈状态码信息。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值