【Spring Cloud】API网关

news2024/11/15 8:45:33

目录

  • 什么是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-gateway
  cloud:
    gateway:
      routes:
        - id: user-consumer-1
          uri: lb://demo-user-consumer
          predicates:
            - Path=/api/user/**
    config:
      uri: http://localhost:7600
      label: dev
      profile: 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 {
    @Override
    public 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);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

4.添加过滤器定义

修改启动类,添加方法

    @Bean
    public AuthGlobalFilter globalFilter() {
        return new GlobalFilter();
    }

5.验证

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

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

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

相关文章

人体姿态识别(教程+代码)

作用 该文涉及两个项目代码&#xff08;需要的请私&#xff09;&#xff0c;代码可以用于简单的课程设计或平时的课程小作业&#xff0c;代码已经能成功跑通&#xff0c;效果也比较好&#xff0c;如下所示。 算法介绍 该项目主要是基于Openpose算法基础之上&#xff0c;能够…

LVM与磁盘配额09

一、LVM 1、lvm概述 lvm &#xff08;logical volume manager &#xff09;&#xff1a;逻辑卷管理 linux系统下对硬盘分区的一种管理机制。 场景&#xff1a;lvm机制特别适合于管理大存储设备。 作用&#xff1a;可以动态的对硬盘进行扩容 。 逻辑上的磁盘&#xff0c;概…

品牌建设不迷路:系统化方法让品牌成长更高效

很多创始人才创业过程中都会发现&#xff1a; 企业越大&#xff0c;遇到的系统性的底层品牌问题就会越多&#xff0c;品牌的系统化建设底层根基如果不稳&#xff0c;后续的增长也会摇摇欲坠。 所以在当今竞争激烈的市场环境中&#xff0c;品牌的成功不仅仅依靠一个响亮的名字…

CTF| 格式化字符串漏洞

格式化字符串漏洞是PWN题常见的考察点&#xff0c;仅次于栈溢出漏洞。漏洞原因&#xff1a;程序使用了格式化字符串作为参数&#xff0c;并且格式化字符串为用户可控。其中触发格式化字符串漏洞函数主要是printf、sprintf、fprintf、prin等C库中print家族的函数 0x01 格式化字符…

查分小程序怎么用?

在教育信息化的浪潮中&#xff0c;一种新型的成绩管理工具成绩发布小程序&#xff0c;正逐渐成为教师的得力助手。简化了成绩发布流程&#xff0c;还提高了信息的安全性和便捷性。 查分小程序的使用方法非常直观。只需在威信中搜索并打开易查分小程序&#xff0c;教师按照提示注…

Warning: Each child in a list should have a unique “key“ prop.

问题描述&#xff1a; 使用ProTable的时候&#xff0c;报错如下 原因分析&#xff1a; 根据报错内容可以分析出&#xff0c;表格数据缺少唯一key&#xff0c; <PaginationTablecolumns{columns}pagination{{pageSize: 10,current: 1,showSizeChanger: true,showQuickJum…

探秘网页内容提取:教你定位特定标签

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、定位带有ID属性的第二个标签 三、定位具有特定属性值的标签 四、提取含有特…

高动态范围成像(HDRI)技术在AI去衣中的革新作用

引言&#xff1a; 在计算机视觉和图像处理领域&#xff0c;人工智能&#xff08;AI&#xff09;去衣技术是一项颇具争议但又不容忽视的技术。它不仅在娱乐和多媒体制作领域中扮演着重要角色&#xff0c;还在时尚设计与电子商务中展现了其独特的价值。随着技术的不断进步&#x…

ComfyUI 基础教程:界面介绍/文生图工作流

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文将介绍 ComfyUI 的主要界面&#xff0c;包括&#xff1a;工作流区域、操作面板、基础操作和快捷键&#xff0c;并详…

一键恢复,U盘被删除文件方法分享

U盘是一种轻巧便携的移动储存工具&#xff0c;在日常的工作以及学习过程中&#xff0c;我们经常性会使用它来传输、备份、存储一些重要文件。然而&#xff0c;随着后期使用频率的增多&#xff0c;会在不同的设备上来回插拔&#xff0c;也就给里面存储文件带来了很大的隐患。比方…

大模型备案VS算法备案:差异、要求与合规快照

​下图为最新的直至第五批深度合成服务算法备案信息的公告 根据目前公开的国内大模型算法备案统计来看&#xff0c;首批境内深度合成服务算法备案清单&#xff0c;总共通过了五批。 以第二批举例&#xff0c;境内深度合成服务算法备案清单&#xff0c;总共通过110家&#xff0…

飞控如何连接地面站

飞控连接地面站有两种方法&#xff0c;一种是USB线&#xff0c;一种是数传。 一.USB线连接 usb连接线使用安卓手机线&#xff08;一般人都有吧&#xff0c;没有很容易买和借到&#xff09; 电脑打开地面站软件。 端口选择C OM口&#xff0c;不要选择auto&#xff0c;如果你…

【原创】java+springboot+mysql日程管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

js中的作用域和作用域链,你未必能分清,用代码示例告诉你。

有很多小伙伴分不清二者&#xff0c;看了网上教程也是很迷茫&#xff0c;好吧让我告诉你吧。 一、作用域和作用域链 作用域是指在程序中变量和函数的可访问性和可见性范围。作用域决定了在哪些地方可以访问到变量和函数&#xff0c;以及在哪些地方可以对其进行修改和调用。 …

大学生选择算法向还是嵌入式向?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 由于嵌入式的薪资待遇和…

qt把虚拟键盘部署到arm开发板上(imx6ull)

分为了qt官方配置的虚拟键盘以及各路大神自己开源的第三方键盘&#xff0c;我本来想尝试利用官方键盘结果一直失败&#xff0c;最后放弃了&#xff0c;后面我用的第三方键盘参考了如下文章&#xff1a; https://blog.csdn.net/2301_76250105/article/details/136441243 https…

ABAP 借助公司封装的钉钉URL,封装的RFC给钉钉发送消息

FUNCTION ZRFC_BC_SMSSEND_DINGTALK. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" VALUE(DESTUSRID) TYPE CHAR255 *" VALUE(CONTENT) TYPE CHAR255 *&quo…

【接口测试_04课_Jsonpath断言、接口关联及加密处理】

一、Jasonpath的应用 JsonPath工具网站&#xff1a;JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里&#xff01; 1、JSONPath的手写与获取 手写JSONPath 1、 $ &#xff08;英文美元符号&#xff09;代表外层的{} . &#xff08;英文句号&#xff09;表示当前…

4K型护套连接器与喇叭口替换插座

4K型护套连接器概述 4K型护套连接器作为煤矿一款关键的电气连接产品&#xff0c;一般安标认证型号包含&#xff1a;LCFB-4、LCFB-6、LCYB-8、LCYB-4、LCYB-8。根据不同的厂家也会有不同订货型号ZE0703-09/DLJ0601/conmN/4c等 4K型护套连接器是一种专为煤矿、非煤矿、石油化工等…

N的阶乘(高精度)

目录 题目描述 输入格式 输出格式 样例输入 样例输出 思路 参考代码 题目描述 输入正整数n&#xff0c;输出n&#xff01; 输入格式 一个正整数n&#xff0c;n 3000 输出格式 输出n&#xff01; 样例输入 3 样例输出 9 思路 主要就是高精度乘法的模版&#x…