Spring Cloud Gateway 网关

news2025/1/17 15:18:58

一. 什么是网关(Gateway)

网关就是一个网络连接到另一个网络的关口。

在同一个项目或某一层级中,存在相似或重复的东西,我们就可以将这些相似重复的内容统一提取出来,向前或向后抽象成单独的一层。这个抽象的过程就是网关。

和AOP切面类似,但有区别。AOP切面是独立于单个项目的,也就是每个项目都需要自己实现AOP逻辑,并引入相应的AOP切面包。而网关是一种更加通用的方案,可以统一处理所有情况。

根据上图所示,最传统的统计接口调用次数的方案是每个接口被调用时都自己去统计一次,计数器加1。

在引入AOP切面后,将统计次数作为一个切面,每个接口被调用后,接口再去调用统计次数的方法。

网关则是作为最前面的一层,用户直接去调用网关,由网关根据用户请求的地址,找到对应的接口,然后调用它,同时调用后次数加1。

对于用户来说,无需关心接口到底是哪个项目的或者是谁开发的,只要知道自己需要什么功能,然后调用对应的网关即可。对开发者来说,也无需统计调用的次数,只要把自己的接口接入到网关中,让网关能找到并调用即可,网关会自己统计调用次数。

综上,网关可以理解成火车站的检票口,通过网关检票后,再去找到对应的车厢。

二. 网关的作用

统一进行一些操作或处理一些问题。

1.路由

起到转发的作用,比如有接口A和B,网关会去记录这些信息,根据用户访问的地址和参数,转发请求到对应的接口。可以理解为转发的条件。

/a => 接口A     /b => 接口B

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

这里就是说如果时间在2017年1月20后之后,都会去访问https://example.org 这个网址。

同理,还有Before、Between等。

参考文档:Spring Cloud Gatewayicon-default.png?t=N7T8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-after-route-predicate-factory

2.负载均衡

在路由的基础上,根据条件随机转发到其中某个机器上。

/c => 服务A/集群A。

3.统一处理跨域

网关统一处理跨越,不用在每个项目里单独处理。

参考文档:Spring Cloud Gatewayicon-default.png?t=N7T8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-cors-configuration

4.发布控制

灰度发布,比如上线了新接口,先给新接口分配20%的流量,旧接口80%,之后再逐渐调整比重。

参考文档:Spring Cloud Gatewayicon-default.png?t=N7T8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory

5.流量染色

给请求(流量)添加一些标识,一般是设置请求头,或者添加新的请求头。

什么是流量染色?假设现在有个用户想要访问某个接口,但我希望用户不能绕过网关去访问,那么应该如何防止绕过网关呢?

可以给通过网关访问的用户请求增加一个标识,比如添加一个请求头source=gateway,所有经过网关的请求都会有这个请求头,接口就可以根据这个请求头去判断,如果没有的话,直接拒绝掉,说明不是通过网关的请求。这就是流量染色的一种应用。

另一个常见的应用是用于排查用户调用接口时出现的问题。为每个用户的每次调用都打上一个唯一的traceid,当出现问题时,通过这个id,下游服务可以快速追踪到具体的请求,从而逐层排查问题。

参考文档:Spring Cloud Gatewayicon-default.png?t=N7T8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-addrequestheader-gatewayfilter-factory

 6.统一接口保护

  • 限制请求
  • 信息脱敏
  • 降级(熔断)
  • 限流
  • 超时时间
  • 重试(业务保护)

7.统一业务处理

把每个项目中都要做的通用逻辑放到上一层(网关),进行统一处理,比如接口调用次数统计。

8.统一鉴权

判断用户是否有权限进行操作,无论访问什么接口,都统一去判断权限,不用重复写。

9.访问控制

黑白名单,比如DDos IP。

10.统一日志

统一的请求、响应信息记录。

11.统一文档

将下游项目的文档进行聚合,在一个页面统一查看。类似于语雀的目录。

三. 网关分类

  • 全局网关(接入层网关):实现负载均衡、请求日志等,不和业务逻辑绑定。
  • 业务网关(微服务网关):有一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务等。

全局网关通常层级较高,可能覆盖多个项目或微服务,主要用于请求的负载均衡,如Nginx、kong等。Nginx可以部署前端或后端,还能提供文件访问服务等多种功能,比较灵活,但操作不如Spring Cloud Gateway方便。

业务网关,特别是基于Spring Boot技术栈的项目,比较推荐使用Spring Cloud Gateway,性能较高,并允许使用Java编写逻辑,容易上手。Nginx或kong需要学习额外的语言和编程。

四.核心概念和逻辑

核心概念:

  • 路由(Route):根据什么条件,转发请求到哪里。
  • 断言(Predicate):一组规则、条件,用来确定如何转发路由。
  • 过滤器(Filter):对请求进行一系列的处理,比如添加请求头、添加请求参数等。

实现逻辑:

  1. 客户端发起请求。
  2. Handler Mapping:根据断言,去将请求转发到对应的路由。
  3. Web Handler:处理请求(一层层经过过滤器)。
  4. 实际调用服务

Spring Cloud Gateway的两种配置方式:

  • 配置式:更方便、规范,比较推荐。有简化版、全称版。就是在application.yml中写配置,也就是在创建项目时,将它作为一个依赖导入。

  • 编程式:更灵活,但相对麻烦。

如上述这段官方提供的代码,就是创建了一个路由器,它的作用是当用户访问某个网址时,将其重定向到指定的网址。

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie = mycookie, mycookievalue

上述是一个简化版的配置方式。

spring.cloud.gateway.routes:这是配置路由的属性。

- id:after_route:这是路由的唯一标识符,用于区分不同的路由。

uri:https://example.org:这是路由将请求转发到目标URI,即请求经过此路由后会被转发到https://example.org这个地址。

predicates:这个就是断言的配置属性,用于定义请求是否满足路由条件。

- Cookie = mycookie, mycookievalue:这是一个断言条件,指定了请求必须具有名为mycookie的Cookie,且其值必须为mycookievalue,才能匹配这个路由。

通过这个配置,当满足请求带有mycookie的Cookie且值为mycookievalue时,请求会被转发到https://example.org。

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
             name: mycookie
             regexp: mycookievalue

上述是一个复杂版的配置方式,前面都没变,在predicates处设置的更加详细了。

- name: Cookie :断言条件,指定使用Cookie作为断言类型来检查请求。

args: 断言条件的参数配置。

name: mycookie:匹配名为mycookie的Cookie。

regexp: mycookievalue:使用正则表达式匹配mycookie的值是否为mycookievalue。

注意,predicates使用了复数形式,说明可以加多个规则(“-”代表列表)。

通过阅读官方文档后,断言(Predicates)的作用大概有:

  1. After 在xx时间之后
  2. Before 在xx时间之前
  3. Between 在xx时间之间
  4. 请求类别
  5. 请求头(包含Cookie)
  6. 查询参数
  7. 客户端地址
  8. 权重(可用来实现灰度测试) 

过滤器(Filter)的作用大概有:

对请求头、响应头、请求参数的增删改查,可以这样理解。

  1. 添加请求头
  2. 添加请求参数
  3. 添加响应头
  4. 降级
  5. 限流
  6. 重试

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

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

相关文章

简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.有无预编译 优点 缺点 2.SQL执行的快慢 3.能否被SQL注入 4.参数输入方式 5.总结 1.有无预编译 #{}是有预编译的而${}是没有预编译的&…

深度学习之基于Yolov3的行人重识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 行人重识别(Person Re-Identification,简称ReID)是计算机视觉领域…

基础2 JAVA图形编程桌面:探索图形程序的抽象实现

嘿,大家好!我非常高兴又一次有机会与大家相聚,分享新的知识和经验。对于热爱编程和探索新技术的朋友们来说,今天的内容绝对不容错过。我为大家准备了一个详尽的视频教程:《基础2 JAVA 图形编程:主程序调用…

软件协作开发方法论

引言 作为程序员,你是否有过这样的经历?软件发版前,你需要把你的代码合并到主分支,拉取主分支代码后,发现有数十个文件冲突,你开始小心翼翼地解决冲突,有些其实你也不知道咋处理,几…

Spring Cloud Alibaba-08-SMS短信服务

Lison <dreamlison163.com>, v1.0.0, 2024.5.1 Spring Cloud Alibaba-08-SMS短信服务 短信服务介绍 短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。 产品优势:覆盖全面、高并发处理、消息堆积处理、开发管理简单、智能监控调度 产品功能:短…

linux 排查java内存溢出(持续更新中)

场景 tone.jar 启动后内存溢出,假设pid 为48044 排查 1.确定java程序的pid(进程id) ps 或 jps 都可以 ps -ef | grep tone jps -l 2.查看堆栈信息 jmap -heap 48044 3.查看对象的实例数量显示前30 jmap -histo:live 48044 | head -n 30 4.查看线程状态 jstack 48044

5.23 学习总结

一.项目优化&#xff08;语音通话&#xff09; 实现步骤&#xff1a; 1.用户发送通话申请&#xff0c;并处理通话请求&#xff0c;如果同意&#xff0c;为两个用户之间进行连接。 2.获取到电脑的麦克风和扬声器&#xff0c;将获取到的语音信息转换成以字节数组的形式传递。 …

宇宙“超级地球”系列,你知道几个?

在宇宙中&#xff0c;可能存在着类地行星&#xff0c;这样的行星可能同样也拥有适宜生命存在的条件。银河系大约有60亿颗类地行星。 开普勒442b 这是脱离太阳系以后&#xff0c;人类发现的第二颗离地球最近的类地行星。开普勒442b这颗类地行星位于天鹅座&#xff0c;离地球约有…

机器学习势系列教程(3):cp2k的安装

大家好&#xff0c;我是小马老师。 本文继续介绍机器学习势相关内容&#xff1a;cp2k的安装。 和abacus一样&#xff0c;cp2k也是一款开源的第一性原理模拟软件&#xff0c;模拟的数据也可作为机器学习势的训练数据集。 cp2k安装方法也很多&#xff0c;常见的有docker安装、…

数据可视化第十天(爬虫爬取某瓣星际穿越电影评论,并且用词云图找出关键词)

开头提醒 本次爬取的是用户评论&#xff0c;只供学习使用&#xff0c;不会进行数据的传播。希望大家合法利用爬虫。 获得数据 #总程序 import requests from fake_useragent import UserAgent import timefuUserAgent()headers{User-Agent:fu.random }page_listrange(0,10) …

AI绘画Stable diffusion小白入门:文生图精讲,超全干货一定要看!

大家好&#xff0c;我是设计师阿威 今天&#xff0c;我们将深入了解Stable diffusion的文生图功能&#xff0c;让你也能生成满意的图片&#xff01; 如上图&#xff0c;这是Stable diffusion的文生图界面&#xff0c;这个界面总体可以分为五个区域&#xff1a; 模型区&#xf…

NegativePrompt:利用心理学通过负面情绪刺激增强大型语言模型

【摘要】大型语言模型 (LLM) 已成为各种应用不可或缺的一部分&#xff0c;从传统的计算任务到高级人工智能 (AI) 应用。这种广泛的应用促使社会科学等各个学科对 LLM 进行了广泛的研究。值得注意的是&#xff0c;研究表明 LLM 具有情商&#xff0c;可以通过积极的情绪刺激进一步…

UNION的使用

UNION的使用 给出将多条查询语句组合成单个结果集&#xff0c;两个表对应的列数和数据类型必须相同 UNION操作符&#xff1a; 返回两个查询结果集的并集&#xff0c;并去除重复记录 UNION ALL操作符 返回两个查询的结果集的并集。不去掉两个结果集的重复部分&#xff0c;重…

为什么说change Buffer写缓冲区,仅适用于辅助索引页

change buffer: 写缓冲区&#xff0c;是针对于二级索引页的更新优化措施。 change Bufer作用:在进行DML操作的时候&#xff0c;如果请求的是辅助索引(非唯一索引)并且没有在缓冲池中&#xff0c;并不会立刻将磁盘页加载到缓冲池&#xff0c;而是在CB记录缓冲变 更&#xff0c…

JVM(7):虚拟机性能分析和故障解决工具之jstat工具

1 jstat(JVM Statistics Monitoring Tool)作用 监视虚拟机各种运行状态信息&#xff0c;可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据 2 命令格式 jstat [options vmid [interval[count]]] 参数解释 第一个参数&#xff1a;options 代…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

CSS学习笔记之中级教程(三)

14、CSS 下拉菜单 14.1 示例1&#xff1a;普通弹窗 思路&#xff1a;弹窗内容先隐藏display: none;&#xff0c;:hover时候修改弹窗部分的 display: block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><me…

IT学习笔记--Kafka

Kafka概述: 定义: Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要应用于大数据实时处理领域。 消息队列消息队列的两种模式: 点对点模式: 消息生产者生产消息发送到Queue中&#xff0c;然后消息消费者从Queue中取出并且消费消息。 消息被消费以后&#…

C语言游戏实战(12):植物大战僵尸(坤版)

植物大战僵尸 前言&#xff1a; 本游戏使用C语言和easyx图形库编写&#xff0c;通过这个项目我们可以深度的掌握C语言的各种语言特性和高级开发技巧&#xff0c;以及锻炼我们独立的项目开发能力&#xff0c; 在开始编写代码之前&#xff0c;我们需要先了解一下游戏的基本规则…

git拉取项目前需要操作哪些?

1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa&#xff1a;(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase&#xff1a;(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…