【Spring Cloud】API网关

目录

  • 什么是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.mzph.cn/bicheng/18510.shtml

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

相关文章

数据集要点和难点以及具体应用案例

数据集(Data set),又称为资料集、数据集合或资料集合,是一种由数据所组成的集合。它通常以表格形式出现,其中每一列代表一个特定变量,每一行对应于某一成员的数据集的问题。数据集列出的价值观为每一个变量,如身高和体重的一个物体或价值的随机数,每个数值被称为数据资…

我的又一个神奇的框架——Skins换肤框架

为什么会有换肤的需求 app的换肤&#xff0c;可以降低app用户的审美疲劳。再好的UI设计&#xff0c;一直不变的话&#xff0c;也会对用户体验大打折扣&#xff0c;即使表面上不说&#xff0c;但心里或多或少会有些难受。所以app的界面要适当的改版啊&#xff0c;要不然可难受死…

Android Surface对应的Buffer怎么传递给HWC

Android Surface对应的Buffer怎么传递给HWC 引言 因为要预研Android Video overlay&#xff0c;需要将SurfaceView对应的GraphicBuffer从drm_hwcomposer中剥离出来&#xff0c;这就需要们了解SurfaceView对应的GraphicBuffer的前世今生&#xff0c;以及它的数据流向以及在各个…

轻兔推荐 —— vfox

简介 vfox 是一个跨平台且可扩展的版本管理工具&#xff0c;终于有一个可以管理所有运行环境的工具了 - 支持一键安装 Java、Node.js、Flutter、.Net、Golang、PHP、Python等多种环境 - 支持一键切换不同版本 特点 支持Windows(非WSL)、Linux、macOS! 支持不同项目不同版本、…

(四)事件系统

视频链接:尚硅谷2024最新版微信小程序 文章目录 事件绑定和事件对象事件分类以及阻止事件冒泡事件传参-data-*自定义数据事件传参-mark 自定义数据事件绑定和事件对象 小程序中绑定事件与在网页开发中绑定事件几乎一致,只不过在小程序不能通过 on 的方式绑定事件,也没有 cli…

C# 9.0的init访问器

不控制可变性 下面是我们最常见的属性声明方式&#xff0c;允许属性在类的内部和外部都可以读取和修改 public int Id { get; set; }namespace Demo {public class Company{public int Id { get; set; }public Company(){}public Company(int id){Id id; // 可以在构造函数中…

22.Volatile原理

文章目录 Volatile原理1.Volatile语义中的内存屏障1.1.volatile写操作的内存屏障1.1.1.StoreStore 屏障1.1.2.StoreLoad 屏障 1.2.volatile读操作的内存屏障1.2.1.LoadStore屏障1.2.2.LoadLoad屏障 2.volatile不具备原子性2.1.原理 Volatile原理 1.Volatile语义中的内存屏障 在…

用于生成 Avatar 的文本引导式情感和运动控制-InstructAvatar

网址 https://wangyuchi369.github.io/InstructAvatar/ 用于生成 Avatar 的文本引导式情感和运动控制 官网翻译 最近的会说话的头像生成模型在实现与音频的真实和准确的嘴唇同步方面取得了长足的进步&#xff0c;但在控制和传达头像的详细表情和情感方面往往存在不足&#…

APM2.8如何做加速度校准

加速度的校准建议准备一个六面平整&#xff0c;边角整齐的方形硬纸盒或者塑料盒&#xff0c;如下图所示&#xff0c;我们将以它作为APM校准时的水平垂直姿态参考&#xff0c;另外当然还需要一块水平的桌面或者地面 首先用双面泡沫胶或者螺丝将APM主板正面向上固定于方形盒子上&…

JavaScrip原型对象

参考 JavaScrip原型对象 | LogDicthttps://www.logdict.com/archives/javascripyuan-xing-mo-shi

每天写两道(二)LRU缓存、

146.LRU 缓存 . - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

如何使用Python和大模型进行数据分析和文本生成

如何使用Python和大模型进行数据分析和文本生成 Python语言以其简洁和强大的特性&#xff0c;成为了数据科学、机器学习和人工智能开发的首选语言之一。随着大模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-4的崛起&#xff0c;我们能够利用这些模型实现诸多…

Revit——(2)模型的编辑、轴网和标高

目录 一、关闭缩小的隐藏窗口 二、标高&#xff08;可创建平面&#xff0c;其他标高线复制即可&#xff09; 三、轴网 周围的四个圈和三角表示四个里面&#xff0c;可以移动&#xff0c;不要删除 一、关闭缩小的隐藏窗口 二、标高&#xff08;可创建平面&#xff0c;其他标…

计算机体系结构期末快速复习

文章目录 前言CPI&#xff0c;MIPS&#xff08;大题1&#xff09;加速比&#xff08;大题2&#xff09;流水线&#xff08;大题3&#xff09;CRAY-1向量机&#xff08;大题4&#xff09;Tomasulo算法&#xff08;大题5&#xff09;概念简答题计算机系统结构的经典定义什么是透明…

深入分析 Android Activity (二)

文章目录 深入分析 Android Activity (二)1. Activity 的启动模式&#xff08;Launch Modes&#xff09;1.1 标准模式&#xff08;standard&#xff09;1.2 单顶模式&#xff08;singleTop&#xff09;1.3 单任务模式&#xff08;singleTask&#xff09;1.4 单实例模式&#xf…

利用边缘计算网关的工业设备数据采集方案探讨-天拓四方

随着工业4.0时代的到来&#xff0c;工业设备数据采集成为了实现智能制造、提升生产效率的关键环节。传统的数据采集方案往往依赖于中心化的数据处理方式&#xff0c;但这种方式在面对海量数据、实时性要求高的工业场景时&#xff0c;往往显得力不从心。因此&#xff0c;利用边缘…

CSS实现一个雨滴滑落效果

使用纯CSS来实现一个真实的雨滴滑落效果可能会有些挑战&#xff0c;因为CSS主要关注于静态样式和简单的动画效果。然而&#xff0c;你可以使用CSS动画和keyframes来模拟一个雨滴滑落的简化效果。 以下是一个基本的示例&#xff0c;展示如何使用CSS来模拟雨滴从顶部滑落到底部的…

AI学习指南数学工具篇-MATLAB中的凸优化工具

AI学习指南数学工具篇-MATLAB中的凸优化工具 在人工智能领域&#xff0c;凸优化是一个非常重要的数学工具&#xff0c;它在机器学习、深度学习、数据分析等领域都有着广泛的应用。而MATLAB作为一款强大的数学工具软件&#xff0c;提供了丰富的凸优化工具和函数&#xff0c;为用…

二叉树的链式结构(二叉树)与顺序结构(堆)---数据结构

一、树的概念与结构 1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。我们常把它叫做树&#xff0c;是因为它看起来像一棵倒挂的树&#xff0c;它的根是朝上的&#xff0c;而叶是朝下的。 下面…

给我一个用断言结果执行下一步的例子

在使用 pytest 和 Selenium 进行自动化测试时&#xff0c;通常我们会根据断言的结果来决定测试流程的走向。如果断言失败&#xff0c;测试通常会停止执行后续的步骤&#xff0c;因为失败意味着被测系统没有按照预期工作。然而&#xff0c;有时候我们可能需要在断言失败后执行特…