Spring Cloud Gateway的使用总结

SpringCloud 微服务 | Gateway Spring Cloud Gateway 阅读详情

目录

前言

一、如何使用网关?

二、网关特性

三、工作流程

四、配置路由

五、配置断言 

六、配置过滤器

七、自定义网关全局过滤器

八、在网关层配置请求超时

 九、使用基于注册中心的路由配置

十、在网管层配置跨域

总结


前言

Spring Cloud Gateway提供了一个构建在 Spring 生态之上的 API Gateway,包括:Spring 5、Spring Boot 2 和 Project Reactor。  Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。


一、如何使用网关?

要在项目中使用 Spring Cloud Gateway,需要引入 ID 为 org.springframework.cloud 和工件 ID 为 spring-cloud-starter-gateway 的 starter。 有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅 Spring Cloud 项目页面。 如果包含启动器,但不希望启用网关,请设置 spring.cloud.gateway.enabled=false。

二、网关特性

  1. 路由:网关的基本构建块。  它由 ID、目标 URI、断言集合和过滤器集合定义。  如果聚合断言为真,则匹配路由,将请求转发到对应的URI,此外,如果配置了过滤器,则转发之前先会进行过滤器过滤。
  2. 断言:这是一个 Java 8 函数Predicate。这使您可以匹配来自 HTTP 请求的任何内容,例如标头或参数。只有当断言为真时,网关才会将请求转发到对应的URI地址
  3. 过滤器:这些是使用特定工厂构建的 GatewayFilter 实例。  在这里,您可以在发送下游请求之前或之后修改请求和响应。

三、工作流程

首先,客户端向 Spring Cloud Gateway 发出请求。  然后,网关根据请求去查找路由配置,如果存在匹配的路由,则将该请求放行到过滤器链中,经过一系列过滤操作之后,将请求发送到对应UR地址的服务的对应Controller处理。

四、配置路由

routes属性对应着一个List<RouteDefinition> routes 用来管理所有的路由配置,其中,RouteDefinition拥有6个配置属性,具体如下:

@Validated
public class RouteDefinition {
    private String id;
    private @NotEmpty @Valid List<PredicateDefinition> predicates = new ArrayList();
    private @Valid List<FilterDefinition> filters = new ArrayList();
    private @NotNull URI uri;
    private Map<String, Object> metadata = new HashMap();
    private int order = 0;
}

一般来说,我们配置一个路由时至少需要配置id、uri两项,参考如下:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org

五、配置断言 

Spring Cloud Gateway 将路由匹配为 Spring WebFlux HandlerMapping 基础设施的一部分。  Spring Cloud Gateway 包含许多内置的路由断言工厂。  所有这些断言都匹配 HTTP 请求的不同属性。  我们可以将多个路由断言工厂与逻辑和语句结合起来。至于我们需要配置什么样的断言,以及可以选择哪些断言,我们可以参考Spring Cloud Gateway 的断言工厂

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

六、配置过滤器

网关路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。  路由过滤器的范围是特定的路由。  Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

在配置文件中配置路由过滤器需要注意每个过滤器需要两个参数,第一个为name也可以称之为key

第二个为value,比如上面的AddRequestHeader路由过滤器就是在请求头中添加一个name为

X-Request-red,value为blue的属性。至于有哪些路由过滤器可以选择,我们可以参考Spring Cloud Gateway的GatewayFilter路由过滤器工厂

七、自定义网关全局过滤器

网关的全局过滤器GlobleFilter不同于路由过滤器GatewayFilter的是,全局过滤器作用于所有经过网关的请求,而路由过滤器则作用于所归属的路由。两个作用范围不同,此外,路由过滤器GatewayFilter比全局过滤器GlobleFilter多了两个name和value属性,源码如下:

public interface GlobalFilter {
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}


public interface GatewayFilter extends ShortcutConfigurable {
    String NAME_KEY = "name";
    String VALUE_KEY = "value";

    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

结合自定义全局过滤器分析请求过程:当一个请求过来时,首先会通过断言规则去路由集合中匹配路由,如果匹配上了,则进入过滤器链,网关会将该路由下配置的路由过滤器和全局过滤器都纳入到滤器链中,并根据过滤器的顺序逐个执行过滤器,至于顺序该如何设定,我们可以在过滤器上使用注解@Order(100)在其中指定一个数字,数字越大越晚执行,如果为负数则最晚执行;或者实现Ordered接口。参口如下:

@Component
@Order(100)
public class CustomeGlobleFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // do something
        return null;
    }
}

 Spring Cloud Gateway网关已经为我们提供了一些现成的全局过滤器,具体可以参考Gateway网关提供的全局过滤器,但一般来说,我们都会通过实现GlobleFilter接口来实现符合自己需求的全局过滤器。

八、在网关层配置请求超时

1、全局设置

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 2    # 连接超时2秒
        response-timeout: 3000    # 响应超时3秒

2、基于路由局部配置

spring:
  cloud:
    gateway:
      routes:
        - id: per_route_timeouts
          uri: https://example.org
          predicates:
            - name: Path
              args:
                pattern: /delay/{timeout}
          metadata:
            response-timeout: 200
            connect-timeout: 200

 九、使用基于注册中心的路由配置

首先,gateway网关服务必须注册到注册中心,其次,需要在配置文件中添加如下配置开启该功能

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true

然后我们就使用基于serviceId的路由配置,具体可以如下配置路由:

spring:
  cloud:
    gateway:
      routes:
        - id: gulimall-product
          uri: lb://gulimall-product
          predicates:
            - Path=/api/product/**
          filters:
            - StripPrefix=1

其中id配置的是注册中心中对应服务的为服务名、uri中的 lb 前缀代表负载均衡,使用的是 loadbalancer 组件,predicates使用的是路径匹配,意为,当请求的的地址与该路径匹配时,通过负载均衡从注册中心拿到服务的host地址,然后将请求的host替换成从注册中心拿到的hsot,这样就可以实现从网关host替换成对应服务的hsot;此外,过滤器中的StripPrefix=1意为剔除路径的首节路径地址,例如,假设8888端口为网关端口,一个http://127.0.0.1:8888/api/product/selectAll请求,会先到网关,然后根据地址去匹配路由,假设有路由断言为Path=/api/product/**则该请求就匹配上了该路由,然后,网关会根据id名去注册中心里查找服务并拿到他的host地址,然后,将原来网关的host替换成拿到的host地址,假设拿到的host为http://127.0.0.1:8882,则新的地址为http://127.0.0.1:8882/api/product/selectAll,然后该请求进入过滤器链,StripPrefix=1过滤操作将从原有请求地址中剔除首个前缀/api从而变为http://127.0.0.1:8882/product/selectAll,

十、在网管层配置跨域

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

@Configuration
public class CorsConfig {
    // 该配置适用于reactive响应式环境,注意导包不要到错了
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        // 设置允许携带cookie
        config.setAllowCredentials(true);
        // 设置允许的最大跨域时间 3秒
        config.setMaxAge(3000L);

        // 必须是reactive包下的UrlBasedCorsConfigurationSource 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

总结

Spring Cloud Gateway网关作为我们开发过程经常使用的微服务组件,我们有必要对他的一些常用方式进行总结,以此来应对快速开发,因为,有些用法都是固定的,所以,我希望在以后使用网关的过程中能够直接拿来就用,而不是耗费大量时间在查找资料上,同时,也希望诸君能够从这篇文章受益。

Spring Cloud Gateway集成Nacos作为注册中心和配置中心 本篇文章将介绍Spring Cloud Alibaba体系下Spring Cloud Gateway的搭建,服务注册中心和分布式配置中心使用Nacos,后续将会持续更新,介绍集成Sentinel,如何做日志链路追踪,如何做全链路灰度发布设计,以及Spring Cloud Gateway的扩展等。 阅读详情

相关推荐

Spring cloud gateway详解和配置使用

实际上hystrix也实现了这一点:当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑,如果此次请求正常返回,那么断路器将进行闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。如果达到最大并发请求数,请求会被拒绝。通过上面的机制,hystrix的断路器实现了对依赖资源故障的处理,对降级策略的自动切换以及对主逻辑的自动恢复。

ewenge的博客 3915

Spring Cloud 学习笔记5——网关

网关的主要作用: 校验过滤:统一在网关做校验过滤,避免维护每个微服务的校验逻辑 请求路由:相当于一个门面,避免把内部服务的url暴露给外部调用者,网关负责url映射 负载均衡 spring cloud基于Netflix Zuul来实现网关功能 导入Zuul依赖、开启Zuul功能 <dependency> <groupId>org.springframe......

wudiyong22的专栏 2091

Spring Cloud Gateway 11种断言工厂

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。Spring Cloud Gateway路由匹配是Spring WebFlux基础功能的一部分,在Spring Cloud Gateway中内置了很多路由断言工厂类。不同的断言工厂类针对HTTP请求的不同属性。多个断言工厂类可以使用逻辑“and”进行组合使用。官方文档:POM引入:

pleaseprintf的博客 1964

Spring Cloud Gateway 网关

一,网关背景。 客户端向微服务发送请求时,每个微服务都有一个公开的URL路径,通过该URL可以 直接映射到具体的微服务当中,如果没有网关的存在,我们只能在客户端记录每个 微服务的地址,然后分别去调用,但是在调用时需要独立认证,并且存在跨域请求, 这在一定程度上提高了代码的复杂度,基于这些问题提出了网关的概念。 ======================================================================= 二,什么是网关? 网关本质上是提供了一个各种服务访问入口

abc1641211976的博客 807

Spring Cloud Gateway深入探究

文章目录Spring Cloud Gateway介绍Spring Cloud Gateway 配置MavenYmlJava ConfigSpring Cloud Gateway使用RoutePredicateFilterSpring Cloud Gateway 工作原理Spring Cloud Gateway 总结相关文档 Spring Cloud Gateway介绍 废话不多说,看官方文档的介绍...

Nico专栏 6912

解决Spring Cloud Gateway中使用OpenFeign出现的错误

问题描述 Spring Cloud版本: Spring Boot 版本: Spring Cloud Gateway 项目中使用了OpenFeign组件,配置引用均正确。报错如下: feign.codec.EncodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which

爱码士的博客 1万+

Spring Cloud Gateway重试机制

前言 重试,我相信大家并不陌生。在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口。 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊等等原因,你总会打不通,当你第一次没打通之后,你会打第二次,第三次…第四次就通了。 重试也要注意应用场景,读数据的接口比较适合重试的场景,写数据的接口就需要注意接口的幂等性了。还有就是重试次数如...

u010889990的专栏 1万+

Spring Cloud Gateway 的简单搭建

在 《服务注册、发现和远程调用》 这篇文章中介绍关于服务注册、发现和远程调用的一个 Demo,本文在这篇文章的基础上介绍如何使用 Spring Cloud Gateway 搭建一个网关。 一、问题 在上篇文章中,分别创建了 service_user 和 service_dict 两个服务,两个服务分别使用了 8001 和 8002 两个端口。这样直接通过 PostMan 或浏览器调用其中的接口没什么问题,如下图所示。 从上图可以看到,访问 user 使用了 8001 端口,访问 dict 使用了

uuqaz的博客 1642

Spring Cloud Gateway简单使用

包括简单使用,快速开始、谓词配置、Filter配置、限流。

lydms的博客 1万+

别再手动盘点了!教你给微信小程序仓库系统加个‘扫码枪’:完整扫码入库与查询功能实现

本文详细介绍了如何为微信小程序仓库系统添加扫码入库与查询功能,实现零硬件成本的智能仓储管理。通过优化摄像头参数、增强动态识别算法和深度整合业务逻辑,提升扫码精度和效率,同时提供混合查询方案应对复杂场景。这套方案显著提升入库效率,降低错误率,适用于各类仓储管理需求。

weixin_30844577的博客 298

DMA+Timer 生成 PWM 波形错位问题分析与解决

本文深入分析了DMA与Timer协同生成PWM波形时出现的错位问题,揭示了DMA传输启动时机与定时器溢出中断的微妙关系。通过占空比强制清零法和预装载值调校技巧,提供了有效的解决方案,并总结了PWM+DMA配置的最佳实践,帮助开发者避免类似问题。

weixin_29191081的博客 347

【Spring Cloud】Gateway

API网关、Gateway Filter Factories

每篇博客都不是最终版,都会随着我的学习更新 1865

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6263

使用 Solon Cloud Gateway 替换 Spring Gateway

在「使用国产化框架 Solon 的一些开发经验」中提到,我们只是在平台的一个应用开始使用 Solon 框架,并非一次性的完全替换。另外系统中个问卷功能是对外提供服务的,当时为了提供对外服务和减少Gateway的路由判断逻辑,增加一个api-gateway。此次使用 solon gateway 进行替换需要完整的实现旧有Spring Gateway的功能,同时想利用 solon 的本地 gateway 的路由分组功能合并api-gateway。// admin的异常抛出,可能包含SQL,起码更详细。

发强-CrazyAirhead的专栏 1013

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 379

【微信小程序开发与设计】垃圾智能分类小程序

垃圾分类是将来生活可持续发展的必需项。但是很多人由于缺乏垃圾分类知识,或是因为垃圾分类困难,费时费力,所以没有好好贯彻垃圾分类政策,此时设计一款方便于群众进行智能化垃圾识别分类的微信小程序就显得尤为必要。

Markelle_Fultz的博客 8242

Spring Cloud Gateway

摘要:Spring Cloud Gateway 是微服务架构中的核心 API 网关组件,提供动态路由、请求过滤和负载均衡功能。本文详细介绍其配置方法:1)基本路由配置,通过 YAML 定义路由 ID、URI 和断言;2)过滤器使用,包括内置过滤器(如请求头修改)和自定义全局过滤器实现;3)动态路由整合,结合 Nacos 实现服务发现与自动路由更新。指南包含完整配置示例和最佳实践建议,如使用 Redis 限流、安全认证等,帮助开发者快速构建高效可靠的微服务网关系统。

Java_soul_GJH的博客 1327

5分钟搞定微服务架构图:手把手教你用Draw.io画出专业级设计

本文详细介绍了如何使用Draw.io快速绘制专业级微服务架构图。通过5分钟入门教程,掌握核心组件拖拽、连接线优化等技巧,提升系统设计可视化效率。特别适合需要快速呈现分布式系统架构的开发团队,利用内置微服务元素和分层展示功能,轻松创建清晰易懂的技术文档。

pz890123的博客 1238

创建spring Cloud Gateway

创建spring Cloud Gateway 一、准备pom.xml依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependen...

github_35976996的博客 2614

Python爬虫经典案例第67篇:社交媒体平台爬取:Twitter数据采集实战

Twitter(现更名为X)是全球最具影响力的社交媒体平台之一,拥有超过3.3亿月度活跃用户。作为一个实时信息传播平台,Twitter上的数据涵盖了新闻、政治、娱乐、科技等各个领域,具有极高的研究价值:本文将深入探讨Twitter数据采集的技术方案,包括官方API调用、网页爬取和浏览器自动化三种方式。Twitter采用现代化的微服务架构,主要特点包括:Twitter作为全球最大的社交媒体平台,拥有完善的反爬机制:在开始爬取前,需要明确合法的数据采集方式:重要提示:未经授权爬取Twitter数据可能违反服务条

2201_76125261的博客 658

【误码率仿真】基于matlab 小波变换OFDM误码率仿真

其中,与传统的 OFDM 相比,小波变换 OFDM 在进行调制和解调时,使用的是小波变换函数。需要注意的是,由于小波变换函数将频域信号转换为时域信号,因此与传统 OFDM 不同,小波变换 OFDM 中的信号需要在时域上添加循环前缀。与传统的 OFDM 不同,小波变换 OFDM 使用小波函数作为基函数,而非正弦函数作为基函数,因此可以在保持子载波正交性的同时,让子载波之间的带宽变得更加均匀。在频域进行信号加权,然后进行小波逆变换,得到时域信号。在接收端进行信号接收,去掉循环前缀并进行小波变换得到频域信号。

Fanjufei的博客 662

【Spring Cloud】Spring Cloud Gateway 网关介绍

Spring Cloud Gateway 允许开发者自定义过滤器,以实现特殊的业务需求。自定义过滤器可以分为两类:全局过滤器和局部过滤器。全局过滤器适用于所有路由,而局部过滤器仅适用于特定路由。全局过滤器示例@Component@Override@Override// 执行顺序局部过滤器示例通过实现@Component@Override}));

国家专精特新小巨人、资深消防行业企业、国家高新技术企业、智慧消防技术实验室、准独角兽企业、浙江省电流AI技术研发中心 1979

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring Cloud Gateway网关

(一)SpringCloudeGateway基本使用 Spring Cloud Gateway是Spring官方基于Spring5.0、SpringBoot2.0和Project Reactor等技术开发的网 关 旨在为微服务框架提供一种简单而有效的统一的API路由管理方式,统一访问接口。 Spring Cloud Gateway作为Spring Cloud生态体系中的网关,目标是替代Netflix的Zuul,其不仅提供统 一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例

m0_60413225的博客 4414

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring Cloud Gateway详解

SpringCloudGateway是SpringCloud官方推出的第二代网关框架,取代Netflix中的Zuul网关。SpringCloudGateway旨在为微服务架构提供一种简单且有效的API路由的管理方式,并基于Filter的方式提供网关的基本功能,例如安全认证、监控、限流等等。

qq_41269519的博客 1632

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring Cloud Gateway 入门

很多时候, 有些微服务是不应该被外部(UI) 直接调用的,我们需要API gateway来拦截这些请求。

nvd11的专栏 470
上一篇: Nacos作为注册中心和配置中心的使用总结
下一篇: 查询出所有菜单并将其组装成父子结构
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值