当前位置: 首页 > news >正文

Spring Cloud集成Gateaway

Spring Cloud Gateway 是一个基于 Spring 生态的网关框架,用于构建微服务架构中的API网关。它可以对请求进行路由、过滤、限流等操作,是Spring Cloud微服务体系中常用的组件之一。下面介绍 Spring Cloud Gateway 的核心概念、应用场景以及简单的示例。

Spring Cloud Gateway的核心概念

  1. Route(路由)

    • 路由是网关的核心组成部分,定义了请求的转发规则。每个路由都由一个ID、目标URI、Predicates(断言)和Filters(过滤器)组成。
    • 断言用来判断请求是否匹配该路由,过滤器用来对请求进行处理或修改。
  2. Predicate(断言)

    • 断言是基于请求的特定条件进行判断的功能组件。Spring Cloud Gateway 提供了丰富的断言工厂,比如根据请求路径、请求头、查询参数等进行匹配。
    • 常用的断言包括PathHostMethodQuery等。
  3. Filter(过滤器)

    • 过滤器可以在请求被路由到目标服务之前或之后进行某些处理。比如权限验证、请求日志记录、限流等。
    • Spring Cloud Gateway 支持两类过滤器:全局过滤器(对所有路由生效)和局部过滤器(只对特定路由生效)。

Spring Cloud Gateway的应用场景

  1. 请求路由与负载均衡

    • 将请求根据路径或其他条件路由到不同的微服务,并与负载均衡组件(如Spring Cloud LoadBalancer)结合,分发请求到多个服务实例。
  2. API限流与安全

    • 可以通过过滤器实现对接口的限流,防止过多请求涌入后端服务。
    • 结合OAuth 2.0或JWT等方式进行认证与鉴权,确保只有合法用户能够访问内部服务。
  3. 日志与监控

    • 通过全局过滤器可以实现请求日志的记录。
    • 可以与监控系统(如Prometheus、Grafana)结合,实现对网关流量、健康状况的监控。
  4. 缓存和请求头修改

    • 对于某些不需要实时刷新的接口,可以通过缓存来减少对后端服务的请求压力。
    • 修改请求头或响应头,如增加特定的安全性标志或调试信息。

Spring Cloud Gateway 简单示例

假设我们有多个微服务,分别处理不同的业务需求。我们可以通过 Spring Cloud Gateway 路由请求到不同的服务。

1. 添加依赖

pom.xml 中添加 Spring Cloud Gateway 的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

确保 Spring Cloud 的版本管理:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR12</version> <!-- 选择适合的Spring Cloud版本 --><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
2. 简单路由配置

application.yml 中配置一个简单的路由,将请求 /service-a/** 路由到服务A:

spring:cloud:gateway:routes:- id: service-auri: http://localhost:8081predicates:- Path=/service-a/**- id: service-buri: http://localhost:8082predicates:- Path=/service-b/**

这个配置表示:

  • 当用户访问 /service-a/** 路径时,Spring Cloud Gateway 会将请求转发到 http://localhost:8081 的微服务实例。
  • 同样,访问 /service-b/** 路由时会转发到另一个服务 http://localhost:8082
3. 基于断言与过滤器的复杂路由

我们可以添加更多的断言和过滤器,例如根据请求的头信息路由,或者实现限流。

spring:cloud:gateway:routes:- id: service-curi: http://localhost:8083predicates:- Path=/service-c/**- Header=X-Request-Id, \d+ # 根据请求头X-Request-Id判断是否路由filters:- AddRequestHeader=X-Gateway, MyGateway # 在请求中添加一个头信息- AddResponseHeader=X-Response-Time, '#{T(java.time.LocalTime).now()}' # 在响应中添加处理时间- RequestRateLimiter=key-resolver=#{@myKeyResolver}, redis-rate-limiter.replenishRate=10, redis-rate-limiter.burstCapacity=20 # 限流

上述配置表示:

  • 请求路径是 /service-c/** 并且请求头 X-Request-Id 是数字格式的情况下,转发到 localhost:8083
  • 在请求头中添加 X-Gateway,并在响应头中添加当前时间。
  • 使用 Redis 实现限流,每秒最多允许10个请求,并且最多可以瞬时处理20个请求。
4. 全局过滤器

除了在特定路由中配置过滤器,还可以添加全局过滤器,处理所有经过网关的请求。全局过滤器可以在Java代码中定义:

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@Component
public class LoggingFilter implements GlobalFilter {private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, org.springframework.cloud.gateway.filter.GatewayFilterChain chain) {logger.info("Request URI: " + exchange.getRequest().getURI());return chain.filter(exchange);}
}

总结

Spring Cloud Gateway 是一个强大的API网关解决方案,能够有效地处理微服务架构中的请求路由、限流、安全、日志等任务。通过断言和过滤器的灵活配置,你可以根据业务需求自定义各种路由策略,实现高效、可扩展的微服务网关系统。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【视频教程】基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用
  • Linux shell编程学习笔记80:gzip命令——让文件瘦身
  • redis底层—数据结构
  • 在职研生活学习--20240908
  • JQuery简介 - 什么是jQuery
  • SpringBoot实现房产销售系统全解析
  • vs code: pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本
  • modbus调试助手/mqtt调试工具/超轻巧物联网组件/多线程实时采集/各种协议支持
  • Linux编程获取指定网口MAC地址
  • 9.11 QT ( Day 4)
  • 大数据之Flink(三)
  • 尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)
  • SQLyou基础用法讲解
  • vue2基础系列教程之todo的实现及面试高频问题
  • PowerBI 自定义组合两个表的列
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • angular学习第一篇-----环境搭建
  • echarts的各种常用效果展示
  • JavaScript设计模式之工厂模式
  • Js基础知识(四) - js运行原理与机制
  • Map集合、散列表、红黑树介绍
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PAT A1017 优先队列
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • React-生命周期杂记
  • use Google search engine
  • XML已死 ?
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 经典排序算法及其 Java 实现
  • 码农张的Bug人生 - 初来乍到
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 我是如何设计 Upload 上传组件的
  • 小而合理的前端理论:rscss和rsjs
  • 仓管云——企业云erp功能有哪些?
  • 昨天1024程序员节,我故意写了个死循环~
  • ​iOS实时查看App运行日志
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #AngularJS#$sce.trustAsResourceUrl
  • #include
  • #大学#套接字
  • (1)(1.11) SiK Radio v2(一)
  • (3) cmake编译多个cpp文件
  • (4) PIVOT 和 UPIVOT 的使用
  • (AngularJS)Angular 控制器之间通信初探
  • (C++17) optional的使用
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十一)c52学习之旅-动态数码管
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .net core 的缓存方案
  • .net framework 4.0中如何 输出 form 的name属性。