【Spring Cloud】API网关

news/2024/7/22 1:07:21/文章来源:https://blog.csdn.net/weixin_37833693/article/details/139265549

目录

  • 什么是API网关
  • 为什么需要API网关
    • 前言
    • 问题列表
  • API网关解决了什么问题
    • 常见的网关解决方案
    • Nginx+Lua
    • Spring Cloud Netflix Zuul
      • SpringCloud Zuul的IO模型
        • 弊端
    • Spring Cloud Gateway
  • 第二代网关——Gateway
    • Gateway的特征
    • Spring Cloud Gateway的处理流程
    • Spring Cloud Gateway的相关概念
      • Route(路由)
      • Predicate(断言)
      • Filter(过滤器)
  • 案例
    • 需求
    • 搭建Gateway微服务网关
      • 1.创建项目
      • 2.添加Gateway依赖
      • 3.修改配置——基础URI的路由配置方式
        • 配置解析
  • 网关过滤器
    • 为网关添加过滤器
      • 1.在上述案例的基础上,创建AuthGlobalFilter并实现GlobalFilter、Ordered接口
      • 2.重写方法
      • 3.filter方法验证token参数
      • 4.添加过滤器定义
      • 5.验证

什么是API网关

  • API Gateway(API 网关),顾名思义,是出现在系统边界上的一个面向 API 的、串行集中式的强管控服务,这里的边界是企业 IT 系统的边界,可以理解为企业级应用防火墙,主要起到隔离外部访问与内部系统的作用。在微服务概念的流行之前,API 网关就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的问题列表。
  • API 网关的流行,源于近几年来移动应用与企业间互联需求的兴起。移动应用、企业互联,使得后台服务支持的对象,从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件。
  • API 网关是一个服务器,是系统对外的唯一入口。API 网关封装了系统内部架构,为每个客户端提供定制的 API。所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。API 网关并不是微服务场景中必须的组件。

在这里插入图片描述

为什么需要API网关

前言

  • 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题

问题列表

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  • 存在跨域请求,在一定场景下处理相对复杂。
  • 认证复杂,每个服务都需要独立认证。
  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
  • 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

API网关解决了什么问题

在这里插入图片描述

常见的网关解决方案

Nginx+Lua

  • Nginx 适合做门户网关,是作为整个全局的网关。
  • Gateway 可以实现熔断、重试等功能,这是 Nginx 不具备的。

Spring Cloud Netflix Zuul

  • Zuul 是 Netflix 公司开源的一个 API 网关组件,Spring Cloud 对其进行二次基于 Spring Boot 的注解式封装做到开箱即用。
  • 可以做到请求转发,根据配置或者默认的路由规则进行路由和 Load Balance,无缝集成 Hystrix。

SpringCloud Zuul的IO模型

  • Zuul 是Netflix出品的开源微服务网关,可与 Eureka、Ribbon、Hystrix 等组件配合使用,
  • Zuul 的核心是一系列过滤器
  • Spring Cloud中所集成的Zuul版本,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型。
弊端
  • servlet是一个简单的网络IO模型,当请求进入servlet container时,servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的
  • 但是一旦并发上升,线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。
  • 在一些简单的业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势。

Spring Cloud Gateway

  • Spring Cloud官方推出的第二代网关框架,性能显著提升;

第二代网关——Gateway

  • SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
  • SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
  • Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

Gateway的特征

  • 基于Spring Framework 5、Project Reactor和Spring Boot 2.0构建
  • 能够在任意请求属性上匹配路由
  • predicates(谓词) 和 filters(过滤器)是特定于路由的
  • 集成了Hystrix断路器
  • 集成了Spring Cloud DiscoveryClient
  • 易于编写谓词和过滤器
  • 请求速率限制
  • 路径重写

Spring Cloud Gateway的处理流程

  1. 客户端向 Spring Cloud Gateway 发出请求。
  2. 然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
  3. Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
  4. 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

在这里插入图片描述

Spring Cloud Gateway的相关概念

Route(路由)

  • 网关配置的基本组成模块,和Zuul的路由配置模块类似。
  • 一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。
  • 如果断言为真,则路由匹配,目标URI会被访问。

Predicate(断言)

  • 这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,
  • 例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。

Filter(过滤器)

  • 和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。
  • 过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。

案例

需求

  • 提供三个微服务EurekaServer、Consumer端、Provider端
  • 通过网关转发微服务请求
    • 要求访问Gateway网关,然后转发请求到Consumer端,然后继续调取Provider端服务

搭建Gateway微服务网关

1.创建项目

指定artifactId为:demo-gateway

2.添加Gateway依赖

  • 还要添加Spring Cloud依赖,此处省略
        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

3.修改配置——基础URI的路由配置方式

  • 指定服务端口、Eureka Server地址等信息
spring:application:name: demo-gatewaycloud:gateway:routes:- id: user-consumer-1uri: lb://demo-user-consumerpredicates:- Path=/api/user/**config:uri: http://localhost:7600label: devprofile: dev
eureka:client:service-url:defaultZone: http://192.168.2.220:7776/eureka
配置解析
属性解释
id我们自定义的路由 ID,保持唯一
uri目标服务地址, lb代表从注册中心获取服务
predicates路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂逻辑。
Path转发地址格式
filters过滤器链
StripPrefix作用是去掉请求路径的最前面n个部分截取掉,StripPrefix=1就代表截取路径的个数为1,比如前端过来请求http://localhost:8085/user/login,匹配成功后,路由到后端的请求路径就会变成http://localhost:8082/login

网关过滤器

  • 每个服务在处理请求的时候都要判断是否验证token
  • 需要验证token是否有效
  • 效率低
    • 每个请求都需要转发到具体的微服务后再判断,然后将判断的结果回转给网关
  • 在网关转发前就行进过滤处理
    • 过滤器

为网关添加过滤器

创建网关过滤器

1.在上述案例的基础上,创建AuthGlobalFilter并实现GlobalFilter、Ordered接口

2.重写方法

  • filter:过滤器实现
  • getOrder():过滤顺序

3.filter方法验证token参数

public class AuthGlobalFilter implements org.springframework.cloud.gateway.filter.GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("token");if (token == null || token.isEmpty()) {System.out.println("token为空,不能通过");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

4.添加过滤器定义

修改启动类,添加方法

    @Beanpublic AuthGlobalFilter globalFilter() {return new GlobalFilter();}

5.验证

  • 请求接口
  • 分别携带token和不携带token验证请求结果

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

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

相关文章

基于trunk、yew构建web开发脚手架

trunk 构建、打包 rust wasm 程序&#xff1b;yewweb 前端开发库&#xff1b; 项目仓库yew-web trunk 之前已经简单介绍了trunk,全局安装&#xff1a; $> cargo install --locked trunk常用命令&#xff1a; trunk build 基于wasm-bindgen构建 wasm 程序。trunk watch …

企企通入选第一新声《2024年中国CIO数字化产品选型白皮书》供应链数字产品可信名录

近日&#xff0c;第一新声研究院根据多年产业数字化研究&#xff0c;历经近半年时间&#xff0c;并综合近200位CIO调研与推荐意见&#xff0c;发布《2024年中国CIO数字化产品选型白皮书》&#xff0c;并推出企业CIO选型指南及可信产品名录。企企通凭借其优秀的采购数字化与供应…

【小米手环7】表盘修改/制作指南

2024年了还有人用小米手环7么&#xff1f; 5月10号得到我的小米手环7nfc&#xff0c;随之开启了我对表盘制作的探索之旅。~历时18天&#xff0c;终于让我成功修改了官方表盘——荧光电子&#xff01;表盘&#xff1a;羽球人的荧光电子已上传至表盘自定义工具app。 接下来&…

Android软件渲染流程

Android软件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 渲染缓存的初始化1.2 graphics::Canvas的创建1.3 graphics::Canvas与渲染缓存的绑定1.3.1 SkBitmap的初始化1.3.2 SkiaCanvas与SkBitmap的绑定1.3.3 SkCanvas的创建 2.矩形的…

Window Linux 权限提升

#基础点&#xff1a; 0、为什么我们要学习权限提升转移技术&#xff1a; 简单来说就是达到目的过程中需要用到它 心里要想着我是谁 我在哪 我要去哪里 1、具体有哪些权限需要我们了解掌握的&#xff1a; 后台权限&#xff0c;数据库权限&#xff0c;Web权限&#xff0c;用户权…

红外成像人员检测数据集VOC+YOLO格式5838张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5838 标注数量(xml文件个数)&#xff1a;5838 标注数量(txt文件个数)&#xff1a;5838 标注…

FTP协议——Pure-Ftpd安装(Linux)

1、简介 Pure-FTPd是一个高效、免费且开源的FTP服务器软件&#xff0c;广泛应用于各种Unix/Linux系统。它以其易用性、高安全性和功能丰富而闻名&#xff0c;适用于个人和企业的文件传输需求。 2、步骤 环境&#xff1a;Ubuntu 22.04.4 下载地址&#xff1a;Index of /pub/p…

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、无继承关系类的初始化 1、静态变量k被初始化 2、静态变量t1初始化 3、静态变量 t2初始化 4、静态变量i初始化 5、静态变量n初始化 6、静态块初始化 7、非静态块初始化 8、非静态属性初始化 9、执行构造…

triton之paged attention

一 原理 图解大模型计算加速系列之&#xff1a;vLLM核心技术PagedAttention原理 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/691038809 二 源码分析 1 测试参数设置 test_paged_attention(num_seqs32,num_heads(64, 64),head_size64,block_size16,dtypetorch.float16,…

八股文(C#篇)

C#中的数值类型 堆和栈 值类型的数据被保存在栈&#xff08;stack)上&#xff0c;而引用类型的数据被保存在堆&#xff08;heap&#xff09;上&#xff0c;当值类型作为参数传递给函数时&#xff0c;会将其复制到新的内存空间中&#xff0c;因此在函数中对该值类型的修改不会影…

Elasticsearch集群许可证过期问题解决方法汇总

最近在使用elasticsearch的过程中,使用elastic-head进行可视化展示集群的状态和信息,从2024年5月18日突然elastic-head无法现在集群的状态界面啦,elasticsearch集群状态是正常,命令如下: curl -X GET "localhost:9200/_cluster/health?pretty" 在google页面上通过…

给pdf加水印,python实现

from PyPDF2 import PdfReader, PdfWriterdef add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):"""把水印添加到pdf中"""pdf_output PdfWriter()input_stream open(pdf_file_in, rb)pdf_input PdfReader(input_stream, strictFalse…

for循环绑定id,更新html页面的文字内容

需求&#xff1a;将方法中内容对齐 实现方式 给for循环中每个方法添加一个动态的id在DOM结果渲染完后&#xff0c;更新页面数据&#xff0c;否则会报错&#xff0c;找不到对应节点或对应节点为空 <view v-for"(item, index) in itemList" :key"index"…

DSP开发入门

视频&#xff1a; 创龙TI 最新DSP CPU核心架构 C66x 以及 KeyStone I 架构 DSP TMS320C6655/57以及TMS320C6678视频教程全集_哔哩哔哩_bilibili 2024年硬汉科技手把手教您学DSP28335视频教程持续更新中_哔哩哔哩_bilibili DSP芯片介绍 DSP选型 TI的DSP 分为三大系列&#…

如何连接SharePoint?

知行之桥EDI系统支持连接SharePoint&#xff0c;通过在成熟的SharePoint端口&#xff08;知行之桥EDI系统中的端口是指功能模块&#xff09;的可视化界面中进行简单配置&#xff0c;即可创建连接。 创建一个SharePoint 端口 本操作指南基于知行之桥EDI系统2024版&#xff0c;…

java配置文件解析yml/xml/properties文件

XML 以mybatis.xml:获取所有Environment中的数据库并连接session为例 import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder; impo…

23ai中的True Cache到底能做啥?

最近&#xff0c;Oracle的产品管理总监在Oracle数据库内幕中介绍了True Cache。 原文链接如下&#xff1a; https://blogs.oracle.com/database/post/introducing-oracle-true-cache 由于这篇文章比较火爆&#xff0c;我们国内已经有很多的数据库爱好者完整的翻译这篇文章&am…

水电自动抄表系统是什么?

1.简述&#xff1a;水电自动抄表系统 水电自动抄表系统是一种现代化计量检定解决方法&#xff0c;为提升公用事业服务项目的效率和精确性。传统式手动抄水表方法已经被这类高效率、精准的自动化系统所替代&#xff0c;它能够实时、远程控制地收集解决水电使用数据。 2.系统原…

【二叉树】非递归实现前中后序遍历

目录 前言 算法思想 非递归实现前序遍历 过程分析 代码 非递归实现中序遍历 过程分析 代码 非递归实现后序遍历 过程分析 代码 前言 1&#xff09;前序&#xff1a;根 左子树 右子树 2&#xff09;中序&#xff1a;左子树 根 右子树 3&#xff09;后序&#xff1…