Spring Cloud Gateway 详解:构建高效的API网关解决方案

Spring Cloud Gateway 详解:构建高效的API网关解决方案

Spring Cloud Gateway 是 Spring Cloud 生态系统中用于构建 API 网关的核心组件。它基于 Spring WebFlux 构建,旨在提供简单且有效的方式来路由和增强 API 请求。以下是 Spring Cloud Gateway 的详细解释:
CSDN开发云

核心概念

1. 路由(Route)

路由是 Spring Cloud Gateway 的基本构建块。每个路由包含一个 ID、一个目标 URI、一组断言和一组过滤器。路由的配置决定了哪些请求会被转发到哪个服务。

2. 断言(Predicate)

断言用于匹配进入网关的请求。Spring Cloud Gateway 提供了多种内置断言,如路径断言、方法断言、头部断言等。例如,Path 断言可以匹配 URL 路径。

3. 过滤器(Filter)

过滤器用于在请求和响应过程中对请求进行修改。过滤器有两类:全局过滤器和局部过滤器。全局过滤器对所有路由生效,局部过滤器只对特定路由生效。常见的过滤器包括修改请求头、修改响应头、重写路径等。

配置示例

路由配置

以下是一个基本的配置示例:

spring:cloud:gateway:routes:- id: example_routeuri: http://example.orgpredicates:- Path=/example/**filters:- AddRequestHeader=X-Request-Foo, Bar

在这个例子中,所有路径匹配 /example/** 的请求会被转发到 http://example.org,并且在请求头中添加 X-Request-Foo: Bar。

断言工厂

Spring Cloud Gateway 提供了多种断言工厂:

  • Path: 匹配请求路径。
  • Method: 匹配 HTTP 方法。
  • Header: 匹配请求头。
  • Query: 匹配查询参数。

例如:

predicates:- Path=/foo/**- Method=GET- Header=X-Request-Id, \d+- Query=foo, ba.*

过滤器工厂

常用的过滤器工厂包括:

  • AddRequestHeader: 添加请求头。
  • AddRequestParameter: 添加请求参数。
  • RewritePath: 重写路径。
  • StripPrefix: 去除路径前缀。

例如:

filters:- AddRequestParameter=foo, bar- RewritePath=/foo/(?<segment>.*), /${segment}- StripPrefix=1

自定义过滤器

您还可以创建自定义过滤器。实现 GlobalFilter 接口并注入 Spring 容器即可。例如:

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在此处添加您的逻辑return chain.filter(exchange);}@Overridepublic int getOrder() {return -1;}
}

高级特性

负载均衡

Spring Cloud Gateway 可以与 Spring Cloud LoadBalancer 集成来实现负载均衡。例如:

spring:cloud:gateway:routes:- id: lb_routeuri: lb://service-idpredicates:- Path=/loadbalance/**

熔断器

Spring Cloud Gateway 可以与 Resilience4j 集成来实现熔断器模式。例如:

spring:cloud:gateway:routes:- id: circuitbreaker_routeuri: http://example.orgpredicates:- Path=/circuitbreaker/**filters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/fallback

安全

Spring Cloud Gateway 可以与 Spring Security 集成来保护路由。例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {@Beanpublic SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {http.authorizeExchange().pathMatchers("/secure/**").authenticated().anyExchange().permitAll().and().oauth2Login();return http.build();}
}

与 Sentinel 集成

引入依赖

在 pom.xml 文件中引入 Sentinel 的依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置 Sentinel

在 application.yml 中进行基本配置:

spring:cloud:sentinel:transport:dashboard: localhost:8080port: 8719

在网关路由中启用 Sentinel

通过配置文件:

spring:cloud:gateway:routes:- id: example_routeuri: http://example.orgpredicates:- Path=/example/**filters:- name: Sentinelargs:blockHandler: com.example.gateway.sentinel.CustomBlockHandler.handleException

定义 BlockHandler

创建一个自定义的 BlockHandler 来处理被 Sentinel 限流或降级的请求:

package com.example.gateway.sentinel;import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;@Configuration
public class CustomBlockHandler {@PostConstructpublic void init() {BlockRequestHandler blockRequestHandler = (exchange, t) -> {ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.TOO_MANY_REQUESTS);response.getHeaders().setContentType(MediaType.APPLICATION_JSON);String data = "{\"code\":429,\"message\":\"Too Many Requests - Custom BlockHandler\"}";DataBuffer buffer = response.bufferFactory().wrap(data.getBytes(StandardCharsets.UTF_8));return response.writeWith(Mono.just(buffer));};GatewayCallbackManager.setBlockHandler(blockRequestHandler);}
}

总结

Spring Cloud Gateway 是一个功能强大且灵活的 API 网关解决方案,适用于微服务架构。它提供了丰富的内置功能和易于扩展的架构,能够满足大多数企业应用的需求。通过断言和过滤器的组合,开发者可以轻松实现复杂的路由和请求处理逻辑。同时,通过与 Sentinel 等工具的集成,可以进一步增强系统的稳定性和高可用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年十堰市“武当人才支持计划”科技创新团队申报条件、时间

2024年十堰市“武当人才支持计划”科技创新团队项目申报要求如下&#xff0c;十堰市的企业单位可以了解一下 一 、遴选计划 聚焦十堰市“一主四优多支撑”现代产业体系发展&#xff0c;重点围 绕新能源与智能网联汽车、生态文旅康养、新型电池、绿色食品饮料、生物医药健康等…

【iOS】YYModel源码阅读笔记

文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…

如何计算可截素数

什么是可截素数&#xff1f; 它本身是一个素数&#xff0c;如果从左往右逐一截去数字&#xff0c;剩下的仍然都是素数&#xff0c;如果从右往左逐一截去数字&#xff0c;剩下的也仍然都是素数。 例如&#xff1a;3797就是一个可截素数。 从左往右截去数字&#xff1a;797&a…

利用three-csg-ts对做物体交互式挖洞

默认物体均为居中&#xff0c;如果指定位置没有发生偏移&#xff0c;可能是因为在执行布尔操作之前没有正确设置变换。确保在进行布尔运算之前应用所有必要的变换。以下是经过修正的完整代码示例&#xff0c;它会确保圆柱正确旋转并与盒子进行 CSG 操作。 安装依赖 首先&…

Linux部署FTP服务

什么是FTP服务 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是TCP/IP协议组中的协议之一。该协议是Internet文件传输的基础&#xff0c;它由一系列规格说明文档所定义&#xff0c;目的是让用户能把一个主机上的文件复制到另一个主机上&#xff…

如何实现网络隔离后,军工单位内网数据导出的安全性?

在现代信息化战争中&#xff0c;军工单位在信息安全方面的需求尤为突出。通常会采用物理隔离&#xff0c;将网络隔离成内网和外网&#xff0c;防止外部网络的恶意入侵和数据窃取。隔离后的数据仍存在内外网交换的需求&#xff0c;即涉及到内网数据导出&#xff0c;因此每日会面…

盒马鲜生礼品卡如何使用?

盒马鲜生的礼品卡除了在门店用以外&#xff0c;还有什么用处啊 毕竟家附近的盒马距离都太远了&#xff0c;好多卡最后都闲置下来了&#xff0c;而且以前都不知道盒马卡还会过期&#xff0c;浪费了好多 还好最近发现了 盒马鲜生礼品卡现在也能在收卡云上兑现了&#xff0c;而且…

低功耗蓝牙ble开发(二)——bluez5源码分析

3、bluetoothctl工具代码分析 Bluetoothctl工具的入口程序client/main.c中的main函数&#xff0c;现在跳到main函数开始分析 &#xff08;1&#xff09;client/main.c/main函数分析 int main(int argc, char *argv[]) { ……//命令行输入初始化&#xff0c;该函数里面调…

深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南

&#x1f4e2;&#x1f4e2;&#x1f4e2; 深入解析 Spring Cloud Sentinel&#xff1a;分布式系统流量控制与熔断降级的全面指南 Spring Cloud Sentinel 是阿里巴巴开源的一款强大的分布式系统流量防卫组件&#xff0c;专为微服务架构设计&#xff0c;提供流量控制、熔断降级…

watcher学习小结

架构 主要是watcher-api&#xff0c;watcher-applier&#xff0c;watcher-decision-engine watcher-applier watcher-decision-engine 将DecisionEngineManager和DecisionEngineSchedulingService封装到oslo_service&#xff0c;然后调service的launch_service&#xff0c;实…

NetSuite ERP项目中非批次物料—批次物料数据转换流程

最近在刚结束的项目上也再次碰到了非批次物料转换为批次物料的操作&#xff0c;因此也想把我们在处理数据流程中的心得写出来&#xff0c;以便复盘与总结&#xff0c;也分享给各位。 整体的步骤我们可分为准备工作&#xff0c;调整工作以及检查工作&#xff1a; 准备工作 主…

抖店退款退货率太高,平台也不帮助商家,快做不下去了怎么办?

我是王路飞。 现在很多商家对抖店的评价是&#xff1a;比拼多多还狠&#xff0c;动不动就扣保证金&#xff0c;退款率太高&#xff0c;而平台一边倒站买家&#xff0c;要是再遇到个别发疯的买家&#xff0c;商家真的很无助。 其实关于抖店退款退货率高、平台也不站在商家这一…

【运维项目经历|031】GitLab自动化运维管理平台项目

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目…

【Flutter】路由组件的应用 (学习记录)

前言 在 Flutter 中&#xff0c;路由用于管理应用程序中不同页面之间的导航和跳转。Flutter 提供了多种方式来实现路由管理&#xff0c;包括基本的静态路由、动态路由、命名路由以及使用第三方库&#xff08;如 GetX、Provider 等&#xff09;来管理路由。 一、 静态路由&#…

编译结果处理的shell脚本

#!/bin/bash WEB"web" DIST"dist" RED\033[0:31m GREEN\033[0;32m NC\033[0m #生产打包传参 BUILD"b" if [ -e ${WEB} ];then#删历史文件rm -r ${WEB}rm ${WEB}.zip fi #编辑文件 npm run build #检查构建是否成功 if[ -e ${DIST} ];then#改名mv…

分布式事务的八种方案解析(1)

针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知等方案&#xff0c;以下总结8 种常见的解决方案&#xff0c;帮助大家在实际的分布式系统中更好地运用事务。 1.2PC 二阶段提交协议&#xff08;Two-phase commit protocol&#xff09;&…

好用的视频压缩软件

在当今数字化时代&#xff0c;视频已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;视频都扮演着重要的角色。视频的存储空间也越来越大&#xff0c;这给我们的设备存储带来了不小的挑战。因此&#xff0c;学习如何将视频压缩小点成为了一项实用的…

Qt QMake指南(如何写pro文件)

QMake相关介绍 QMake是一个通过编译Pro文件自动生成Makefile文件的工具。 扩展知识 这里是关于make、makefile、cmake、CMakeLists.txt、qmake等工具和文件之间关系的详细解释&#xff1a; 起始&#xff1a;当我们开始学习基础的helloworld项目时&#xff0c;一般使用gcc命令…

微信营销在使用时应该注意什么?

&#xff08;一&#xff09;注重个人品牌的打造 微信好友的信任是开展个人微信营销成功的基础&#xff0c;因此&#xff0c;平时应利用朋友圈和微信群发布一些有助于提升个人形象的信息。 &#xff08;二&#xff09;发送营销信息不可过滥 如果一个人的朋友圈内容充斥营销信息&…

叁[3],VM二次开发异常处理

1&#xff0c;开发环境 VS2022/WPF/.NetFramework4.8 VM4.2 2&#xff0c;"模块状态0&#xff0c;错误码10100005&#xff0c;错误信息:模块与平台不匹配" 现象描述&#xff1a; 1&#xff0c;WPF/NetFramework项目中打开方案&#xff0c;对工具做模板&#xff0c…