【Spring Cloud 微服务】2.守护神网关Gateway

目录

1.API网关的作用

2.Spring Cloud Gateway 是什么?

3.核心由来与背景

1. 微服务架构的挑战:

2. API 网关模式的兴起:

3. Zuul 的局限性:

4. Spring Cloud Gateway 的诞生:

4.核心特征:

5.核心概念与工作原理

1. 路由 (Route)

2. 断言 (Predicate)

3. 过滤器 (Filter)

工作原理流程

6.如何与 Spring Cloud 集成

第一步:创建项目并添加依赖

第二步:配置文件 (application.yml)

第三步:编写简单的降级控制器

第四步:主启动类

7.集成案例:一个简单的路由

总结


1.API网关的作用

在微服务中,每个模块都是单独的服务,每个服务之间通过Fegin或着RPC之间进行通信,那我们客户端如何与不同服务进行调用呢?

但是带来以下几个问题

在我们引入APi网关之后

架构优势:

  1. 简化客户端:客户端只需知道网关的地址,不需要了解所有微服务的细节
  2. 安全性:可以在网关层面统一实施安全策略
  3. 可观察性:集中收集日志、指标和追踪信息
  4. 灵活性:可以在不影响客户端的情况下重构后端服务

2.Spring Cloud Gateway 是什么?

Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术构建的 API 网关。它的核心是一个建立在 Spring Framework 之上的反向代理,旨在为微服务架构提供一种简单、有效且统一的方式来路由到 API,并提供跨领域的关注点,如:安全、监控/指标和弹性。

3.核心由来与背景

要理解 Spring Cloud Gateway 的由来,需要先了解微服务架构的演进和其前身。

1. 微服务架构的挑战:


在微服务架构中,系统被拆分为数十甚至上百个细粒度的服务。客户端(如 Web 前端、移动 App)如果直接与这些服务通信,会面临诸多问题:

  • 客户端复杂性:客户端需要知道所有服务的网络位置(IP/域名)。
  • 交叉关切点:每个服务都需要独立实现认证、授权、日志、限流等功能,造成代码重复和维护困难。
  • 协议适配:后端微服务可能使用 gRPC、Dubbo 等协议,而外部客户端通常只接受 HTTP/HTTPS。

2. API 网关模式的兴起:

为了解决上述问题,API 网关模式 应运而生。它作为系统的唯一入口,扮演了“门卫”和“路由器”的角色,将所有非业务功能集中处理。Netflix 开源的 Zuul 是这个领域的先驱。

3. Zuul 的局限性:

Spring Cloud 早期整合了 Netflix Zuul 1.x 作为其网关解决方案。

然而,Zuul 1.x 基于 阻塞式 I/O (Servlet API) 模型。在处理大量并发连接或慢速客户端时,容易阻塞工作线程,成为性能瓶颈,无法很好地应对未来的响应式编程趋势。

4. Spring Cloud Gateway 的诞生:

为了提供一款现代化、高性能、响应式且与 Spring 生态无缝集成的官方网关,Spring 团队自己开发了 Spring Cloud Gateway。它的设计目标非常明确:

    • 性能:基于 Netty 和 Project Reactor,提供非阻塞、异步的响应式编程模型,能够轻松处理高并发场景。
    • 与 Spring 生态深度集成:天生支持通过服务发现(如 Eureka、Nacos)动态路由,与 Spring Cloud CircuitBreaker、Spring Cloud Security 等组件完美配合。
    • 强大的功能:提供简单而强大的断言(Predicates)过滤器(Filters) 机制,可以通过配置或编程方式灵活地定义路由和请求处理逻辑。
    • 面向未来:支持 WebSocket、gRPC 等现代通信协议。

简单来说,Spring Cloud Gateway 是 Spring 官方为了取代老旧的 Zuul 1.x,顺应响应式编程潮流而推出的新一代高性能 API 网关

4.核心特征:

  1. 建立在 Spring Framework 5、Project Reactor 和 Spring Boot 2 之上:这意味着它天生支持异步非阻塞(Reactive) 模型,能够轻松处理高并发请求,资源消耗低,性能强劲。
  2. 动态路由:能够与任何服务发现组件(如 Eureka, Nacos, Consul)集成,实现到微服务的动态路由。
  3. 请求限流:集成 Resilience4j 或 Sentinel 实现限流和熔断。
  4. 路径重写:可以修改转发前后的请求路径。
  5. 强大的过滤器(Filter):提供了丰富的、功能各异的过滤器,用于在请求转发前(Pre) 和接收响应后(Post) 执行各种逻辑(如修改请求头、添加参数、认证鉴权、记录日志等)。

5.核心概念与工作原理

要理解 Gateway,必须先掌握它的三个核心概念:路由(Route)断言(Predicate)过滤器(Filter)

1. 路由 (Route)

路由是网关最基础的部分。它由一个 ID、一个目标 URI、一组断言和一组过滤器组成。如果断言为真,则匹配该路由,请求就会被转发到目标 URI。

  • id:路由的唯一标识。
  • uri:最终要转发到的目标地址。可以是 lb://SERVICE-NAME(lb 代表从注册中心负载均衡)或一个具体的 http://host:port
  • predicates:断言数组,决定什么时候使用这个路由。
  • filters:过滤器数组,用于在发送下游请求之前或之后修改请求和响应。

2. 断言 (Predicate)

这是 Java 8 中的 Predicate 函数式接口。它接收一个 ServerWebExchange 对象,可以访问到请求的所有信息(如路径、方法、头、参数等),并返回布尔值。

  • 作用:定义匹配条件。例如:“如果请求路径是 /api/user/**” 或 “如果请求方法是 GET 并且包含一个 X-Token 头”。
  • 常见断言Path, Method, Header, Host, Query, Cookie, After, Before 等。

3. 过滤器 (Filter)

这是 Gateway 的核心功能组件,基于 Spring Framework 的 GatewayFilter 工厂构建。

  • 作用:在请求被转发前(pre)收到响应后(post) 执行特定操作。
  • 种类
    • Gateway Filter:作用于单个路由。
    • Global Filter:作用于所有路由,实现 GlobalFilter 接口,常用于全局鉴权、日志等。
  • 常见过滤器AddRequestHeader, AddRequestParameter, AddResponseHeader, StripPrefix, PrefixPath, RewritePath, Retry, RequestRateLimiter, Hystrix (已不推荐,用 Resilience4j)。

工作原理流程

一个请求到达 Spring Cloud Gateway 后的处理流程,清晰地展示了其基于反应式编程模型的核心组件如何协同工作:路由定位、断言判断及过滤器链处理。


6.如何与 Spring Cloud 集成

集成非常简单,主要通过 spring-cloud-starter-gateway 依赖和配置文件即可完成。

第一步:创建项目并添加依赖

创建一个新的 Spring Boot 项目,在 pom.xml 中添加以下依赖:

<dependencies><!-- Spring Cloud Gateway 核心依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 与服务发现组件集成(以Nacos为例) --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 如果需要限流等功能,引入Resilience4j --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-circuitbreaker-reactor-resilience4j</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><!-- Spring Cloud 版本管理 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.8</version> <!-- 请使用最新稳定版 --><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba 版本管理 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.5.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

第二步:配置文件 (application.yml)

这是最核心的集成部分,展示了如何配置路由、与服务发现集成、配置过滤器等。

server:port: 8080 # 网关端口spring:application:name: api-gatewaycloud:gateway:discovery:locator:enabled: true # 开启根据服务名自动创建路由的功能(可选)lower-case-service-id: true # 服务名小写routes:# 路由1: 用户服务路由- id: user-service-routeuri: lb://user-service # lb:// 表示从注册中心负载均衡发现服务predicates:- Path=/api/user/**   # 断言:路径匹配- Method=GET,POST     # 断言:请求方法匹配filters:- StripPrefix=1       # 过滤器:去掉路径的第一部分(/api),再转发给user-service- AddRequestHeader=X-Request-color, blue # 过滤器:添加请求头- name: RequestRateLimiter # 过滤器:请求限流args:redis-rate-limiter.replenishRate: 10 # 每秒允许的请求数redis-rate-limiter.burstCapacity: 20 # 每秒最大处理的请求数key-resolver: "#{@userKeyResolver}" # 限流策略(需自己定义Bean)# 路由2: 订单服务路由- id: order-service-routeuri: lb://order-servicepredicates:- Path=/api/order/**- After=2023-01-20T17:42:47.789-07:00[America/Denver] # 在此时间之后生效filters:- StripPrefix=1- name: CircuitBreaker # 断路器过滤器 (Resilience4j)args:name: myCircuitBreakerfallbackUri: forward:/fallback/orderServiceDown # 降级URI# 全局默认过滤器,会对所有路由生效default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue# Nacos 服务发现与注册配置nacos:discovery:server-addr: localhost:8848# 配置限流使用的Redis(如果使用了RequestRateLimiter过滤器)redis:host: localhostport: 6379

第三步:编写简单的降级控制器

当触发熔断时,需要一个本地的 fallback 端点来返回托底信息。


@RestController
@RequestMapping("/fallback")
public class FallbackController {@GetMapping("/orderServiceDown")public ResponseEntity<String> orderServiceFallback() {return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("订单服务暂时不可用,请稍后再试。");}
}

第四步:主启动类

主启动类非常简单,只需添加 @EnableDiscoveryClient 注解即可与 Spring Cloud 集成。

@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现客户端
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class, args);}
}

7.集成案例:一个简单的路由

假设你有两个服务:

  • user-service (注册到 Nacos,实例地址为 localhost:8081)
  • order-service (注册到 Nacos,实例地址为 localhost:8082)

配置网关路由后

  • 当你访问 http://localhost:8080/api/user/1 (网关地址)
  • Gateway 的 Path 断言匹配到 /api/user/**
  • StripPrefix=1 过滤器会将路径中的第一部分 /api 去掉
  • 最终,网关会将请求负载均衡地转发到 user-service/user/1 这个接口上。
  • 对于客户端来说,它只和网关交互,完全不知道后端微服务的具体地址,实现了解耦和统一入口。

总结

Spring Cloud Gateway 通过 路由 + 断言 + 过滤器 的组合,提供了一个强大而灵活的方式来管理微服务API的入口流量。它与 Spring Cloud 生态系统的其他组件(如服务发现、熔断器)无缝集成,通过简单的 YAML 配置即可完成大部分工作,是构建现代微服务架构不可或缺的组件。

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

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

相关文章

解读商业智能BI,数据仓库中的元数据

之前的文章讨论过数据分析、数据治理、数据仓库等等&#xff0c;即使是非业内人员从字面意思&#xff0c;也是可以了解一二的&#xff0c;但是&#xff0c;很多人对于元数据可能就比较陌生了。那么&#xff0c;今天我们就来聊一聊元数据管理。数据仓库要说元数据&#xff0c;那…

3 种无误的方式删除 Itel 手机上的短信

如果你希望释放存储空间、保护隐私&#xff0c;或者准备出售或转让手机&#xff0c;删除 Itel 手机上的短信是一个实用的步骤。无论是收件箱中充斥着垃圾短信、过时的对话还是敏感内容&#xff0c;删除不需要的短信可以让你的消息体验更加干净和安全。本文将向你介绍 3 种简单且…

【学习笔记】网络安全专用产品类别与参考标准

一、基本标准 1.1 关键设备 网络关键设备认证依据的强制标准为 GB 40050-2021。 1.2 专用产品 网络安全专用产品认证依据的强制标准为 GB 42250-2022。 二、数据备份与恢复产品标准 相关标准&#xff1a; GB/T 29765-2021《信息安全技术 数据备份与恢复产品技术要求与测试评…

Pytho“张量”(Tensor)和 Java的“向量”(Vector)区别和联系

在Python和Java中&#xff0c;“张量”&#xff08;Tensor&#xff09;和“向量”&#xff08;Vector&#xff09;是两个不同语境下的概念&#xff0c;它们的设计目标、功能和应用场景存在显著差异&#xff0c;但也存在一定的共性。以下从区别和联系两方面详细说明&#xff1a;…

Ubuntu部署K8S集群

Ubuntu部署K8S集群 本例以三台Ubuntu24.04为例,1master节点2worker节点 环境准备 修改hostname,三台服务器分别执行 hostnamectl set-hostname k8s-master01hostnamectl set-hostname k8s-worker01hostnamectl set-hostname k8s-worker02 配置静态ip(不同系统修改方法略微差…

openEuler系统安装Ascend Docker Runtime的方法

在openEuler系统中使用NPU前一定要安装Ascend Docker Runtime,也是在安装CANN和mis-tei前的必备工作。 使用容器化支持、整卡调度、静态vNPU调度、动态vNPU调度、断点续训、弹性训练、推理卡故障恢复或推理卡故障重调度的用户,必须安装Ascend Docker Runtime。 下面是具体的安…

控制对文件的访问:Linux 文件系统权限管理总结

在 Linux 系统中&#xff0c;文件权限是保障系统安全和数据完整性的核心机制。红帽企业 Linux 9.0通过一套灵活且精细的权限控制体系&#xff0c;让用户能够精确管理文件和目录的访问范围。本章将系统梳理 Linux 文件系统权限的核心概念、管理方法及高级应用&#xff0c;为系统…

ansible中roles角色是什么意思?

文章目录一、介绍二、Ansible Roles目录编排三、创建role四、playbook调用角色五、roles中tags使用免费个人运维知识库&#xff0c;欢迎您的订阅&#xff1a;literator_ray.flowus.cn 一、介绍 角色是ansible自1.2版本引入的新特性&#xff0c;用于层次性、结构化地组织playbo…

pytorch 网络可视化

1.torchsummary在 Anaconda prompt 中进入自己的 pytorch 环境&#xff0c;安装依赖包。 bash pip install torchsummary 2.tensorboardX 3. graphviz torchviz 4.Jupyter Notebook tensorwatch 5.netron 6.hiddenlayer 7.PlotNeuralNet

可以一键生成PPT的AI PPT工具(最新整理)

在当今快节奏的职场环境中&#xff0c;高效制作专业PPT已成为一项必备技能。传统PPT制作流程耗时费力&#xff0c;从构思大纲、搜集资料、撰写内容到设计排版&#xff0c;往往需要数小时甚至数天时间。AI生成PPT工具的兴起彻底改变了这一局面&#xff0c;让职场人士能够专注于内…

数仓核心概念阐述

数仓核心概念阐述一、数据仓库建模模型二、数据处理架构三、流批处理架构演进**为什么需要流批融合&#xff1f;****1. Lambda 架构&#xff08;双引擎护航&#xff09;****2. Kappa 架构&#xff08;流处理一统江湖&#xff09;****关键概念对照表****实际案例理解****演进趋势…

Spring Boot 自动配置全流程深度解析

在 Spring Boot 的世界里&#xff0c;“约定优于配置” 理念通过自动配置机制展现得淋漓尽致。从一个简单的SpringBootApplication注解开始&#xff0c;背后隐藏着一套精妙的自动配置加载流程。本文将从SpringBootApplication出发&#xff0c;逐步拆解自动配置类是如何被发现、…

AI:业务驱动与技术赋能:企业智能化应用的双向进化深度指南

一、业务与技术的双螺旋进化模型 1.1 从单向适配到双向驱动的认知转变 传统的信息化建设往往遵循"业务提需求、技术做实现"的线性模式&#xff0c;这种模式在稳定的业务环境中确实有效&#xff0c;但在当前快速变化的数字化时代已经显露出明显的局限性。真正的数字化…

2721. 【SDOI2010】外星千足虫

2721. 【SDOI2010】外星千足虫 题解 题目描述 题目描述 公元2089年6月4日&#xff0c;在经历了17年零3个月的漫长旅行后&#xff0c;“格纳格鲁一号”载人火箭返回舱终于安全着陆。此枚火箭由美国国家航空航天局&#xff08;NASA&#xff09;研制发射&#xff0c;行经火星、…

[RestGPT] RestGPT智能体

第3章&#xff1a;RestGPT智能体 欢迎回来&#x1f43b;‍❄️ 在第1章&#xff1a;配置与环境中&#xff0c;我们为RestGPT配备了必要的"钥匙和密码"&#xff1b;在第2章&#xff1a;OpenAPI规范(OAS)中&#xff0c;我们为它提供了与在线服务对话的"使用说明…

笔记本电脑Windows+Ubuntu 双系统,Ubuntu无法挂载Windows的硬盘 报错问题解决

目录 一、前情提要 二、解决方案步骤 第一步&#xff1a;进入Windows进行修复和检查。这是最关键的一步&#xff0c;目的是让Windows来检查和修复它自己的文件系统。 第二步&#xff1a;回到Ubuntu验证挂载 三、总结与预防 一、前情提要 网上找到许多解决方案&#xff0c…

加密货币与区块链:六大刑事重灾区

高鹏律师&#xff08;首席数据官&#xff09;数字经济团队创作&#xff0c;AI辅助在数字货币的世界里&#xff0c;一夜暴富的传说屡见不鲜&#xff0c;但顷刻间失去所有的悲剧也时有发生&#xff0c;现在&#xff0c;我将为您剖析加密货币与区块链领域的六大刑事风险重灾区&…

Spring Ai 1.0.1中存在的问题:使用MessageChatMemoryAdvisor导致System未被正确的放在首位

使用MessageChatMemoryAdvisor导致System未被正确的放在首位 如下是使用Spring Ai实现多轮对话的官方例子&#xff08;文档地址&#xff1a;https://docs.spring.io/spring-ai/reference/api/chat-memory.html&#xff09;&#xff1a;AutowiredChatMemoryRepository chatMemor…

全景式综述|多模态目标跟踪全面解析:方法、数据、挑战与未来

【导读】 目标跟踪&#xff08;Visual Object Tracking, VOT&#xff09;一直是计算机视觉领域的核心问题之一&#xff0c;广泛应用于自动驾驶、无人机监控、人机交互等场景。随着单模态方法在复杂环境下逐渐遇到瓶颈&#xff0c;多模态视觉目标跟踪&#xff08;Multi-Modal V…

怎么用pytorch训练一个模型,并跑起来

MNIST 手写数字识别 任务描述 MNIST 手写数字识别是机器学习和计算机视觉领域的经典任务&#xff0c;其本质是解决 “从手写数字图像中自动识别出对应的数字&#xff08;0-9&#xff09;” 的问题&#xff0c;属于单标签图像分类任务&#xff08;每张图像仅对应一个类别&#x…