Spring Cloud Gateway 网关

一. 什么是网关(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. 重试

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

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

相关文章

Linux磁盘高级操作

RAID RAID存储系统是一种数据存储虚拟化技术,它将多个物理磁盘驱动器组合成一个或多个逻辑单元,以提供数据冗余和/或提高性能。 1. RAID 0 无奇偶校验与冗余(磁盘容错)的条带存储(带区卷/条带卷) 由两块…

Linux-文件或目录权限

在使用 ll 时,可以查看文件夹内容的详细信息,信息的第1位表示类型,具体信息如下: 类型说明-普通文件d文件夹b块设备文件c字符设备文件p管道文件s套接口文件 第2-10位表示权限, 举例:rwxr-xr-x 类型说明r…

简单快捷的图片格式转换工具:认识webp2jpg-online

经常写博客或记笔记的朋友们可能会碰到图床不支持的图片格式或图片太大需要压缩的情况。通常,我们会在浏览器中搜索在线图片格式转换器,但这些转换器往往伴有烦人的广告或要求登录,并且支持的转换格式有限。最近,我在浏览 GitHub …

java8总结

java8总结 java8新特性总结1. 行为参数化2. lambda表达式2.1 函数式接口2.2 函数描述符 3. Stream API3.1 付诸实践 java8新特性总结 行为参数化lambda表达式Stream Api 1. 行为参数化 定义:行为参数化,就是一个方法接受多个不同的行为作为参数&#x…

HiWoo Box边缘计算网关

​在数字化浪潮汹涌的今天,边缘计算网关成为了连接物理世界与数字世界的桥梁,其重要性日益凸显。HiWoo Box,作为一款功能强大的边缘计算网关,不仅具备了传统网关的基本功能,更在数据采集、处理、传输等方面展现出了卓越…

岛屿问题刷题

200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int numIslands(char[][] grid) {int n grid.length;//grid行数int m grid[0].length;//grid列数int res 0;for(int r 0;r<n;r){for(int c0;c<m;c){if(grid[r][c]1){dfs(grid,r,c);res…

Web Server项目实战3-Web服务器简介及HTTP协议

Web Server&#xff08;网页服务器&#xff09; 一个 Web Server 就是一个服务器软件&#xff08;程序&#xff09;&#xff0c;或者是运行这个服务器软件的硬件&#xff08;计算机&#xff09;。其主要功能是通过 HTTP 协议与客户端&#xff08;通常是浏览器&#xff08;Brow…

面试八股之MySQL篇5——主从同步原理篇

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

绿色智能:AI机器学习在环境保护中的深度应用与实践案例

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

CSS transform 三大属性 rotate、scale、translate

transform 浏览器支持定义和用法translate位移函数rotate旋转函数scale缩放函数 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 紧跟在 -webkit-, -ms- 或 -moz- 前的数字为支持该前缀属性的第一个浏览器版本号。 定义和用法 transform 属性向元素应用 2D…

音视频安卓主板记录仪手持终端定制开发_基于MT6762平台解决方案

音视频安卓主板采用了基于MT6762高性能处理器芯片的设计&#xff0c;其中包括4个主频高达2.0GHz的Cortex-A53核心和4个主频1.5GHz的Cortex-A53高效聚焦核心&#xff0c;可提供无比流畅的体验。搭载Android 12操作系统&#xff0c;系统版本进行了全新的优化&#xff0c;进一步确…

新火种AI|净利润上升628%,英伟达财报说明AI热潮还将持续

作者&#xff1a;一号 编辑&#xff1a;美美 AI大潮仍未放缓&#xff0c;英伟达再次超越预期。 今天凌晨&#xff0c;全球AI算力芯片龙头&#xff0c;被称为“AI时代卖铲人”的英伟达&#xff0c;正式公布了截至2024年4月28日的2025财年第一财季财报&#xff0c;其中第一财季…

Linux:top命令的每一列的具体含义

Linux&#xff1a;top命令的每一列的具体含义 文章目录 Linux&#xff1a;top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具&#xff0c;用于实…

医院是自建档案室还是档案寄存好呢

医院可以选择自建档案室或档案寄存&#xff0c;具体选择取决于医院的需求和资源。 自建档案室意味着医院会拥有自己的档案空间和设施&#xff0c;可以更方便地管理和保管档案。这种方式可以确保医院对档案的访问和控制有更多的自主权&#xff0c;同时也能够根据医院的需求进行档…

是做软件开发,还是软件测试,哪个职业更好,全方位对比

文章目录 前言一、市场需求二、技能需求三、工作强度四、行业趋势总结 前言 在IT行业中&#xff0c;软件开发和软件测试这两个职业长期共存&#xff0c;相爱相杀。很多人都纠结过是做软件开发还是做软件测试&#xff0c;本篇文章将进行全方位对比分析&#xff0c;供各位读者参…

小程序-收货地址管理模块实现

页面结构代码&#xff1a; address-form.vue --->新建地址和修改地址页面 <template><view class"content"><form><!-- 表单内容 --><view class"form-item"><text class"label">收货人</text>…

Chatgpt人工智能对话系统:引领的智能交互新时代 附带完整的源代码以及搭建教程

系统概述 在人工智能技术日新月异的今天&#xff0c;对话式AI系统正逐步成为连接人与信息、服务乃至情感的桥梁。其中&#xff0c;ChatGPT作为新一代人工智能对话系统的杰出代表&#xff0c;凭借其卓越的自然语言处理能力、个性化交互体验和广泛的应用场景&#xff0c;正在引领…

【Linux】-Flink分布式内存计算集群部署[21]

注意&#xff1a; 本节的操作&#xff0c;需要前置准备好Hadoop生态集群&#xff0c;请先部署好Hadoop环境 简介 Flink同spark一样&#xff0c;是一款分布式内存计算引擎&#xff0c;可以支撑海量数据的分布式计算 Flink在大数据体系同样是明星产品&#xff0c;作为新一代的…

ubuntu下交叉编译安卓FFmpeg 和 官方指导链接

将之前的编译方法在此记录 Linux系统&#xff1a;Ubuntu 18.04.6 LTS 交叉编译工具链&#xff1a;gcc-aarch64-linux-gnu gaarch64-linux-gnu ffmpeg版本&#xff1a;5.1.3 1.下载源码 ffmpeg官网&#xff1a;https://ffmpeg.org/download.html#releases 下载完成后&#x…

Yolov5保姆及入门-含源码【推荐】

前言 YOLO系列模型作为一种实时目标检测算法&#xff0c;自从YOLO1发布以来&#xff0c;就以其检测速度快、准确率高而受到广泛关注。随着技术的迭代&#xff0c;YOLO系列已经发展到了YOLO8。本文将详细介绍YOLO5的技术规格、应用场景、特点以及性能对比。 yolov5源码下载地址…