Spring Cloud Gateway 网关

一. 什么是网关(Gateway)

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

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

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

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

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

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

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

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

二. 网关的作用

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

1.路由

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

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

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- 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_routeuri: https://example.orgpredicates:- 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_routeuri: https://example.orgpredicates:- name: Cookieargs:name: mycookieregexp: 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.mzph.cn/pingmian/13461.shtml

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

相关文章

SSL证书制作及nginx部署

SSL证书制作及nginx中部署 本文主要介绍了SSL证书的制作及如何将证书部署在nginx中,并简要说明在制作及部署过程中可能遇到的问题。 SSL证书制作 推荐在Linux环境上制作SSL证书,本文使用的是CentOS。 安装openssl: #更新系统中的软件包&am…

VUE3.0-条件渲染

在Vue 中&#xff0c;提供了条件渲染&#xff0c;这类似于 JavaSeript 中的条件语句 V-if V-else V-else-if V-show v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才被渲染 <template><h3>条件渲染</h3><div v-if"fla…

SDUT 链表9-------7-9 sdut-C语言实验-约瑟夫问题

7-9 sdut-C语言实验-约瑟夫问题 分数 20 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 n个人想玩残酷的死亡游戏&#xff0c;游戏规则如下&#xff1a; n个人进行编号&#xff0c;分别从1到n&#xff0c;排成一个圈&#xff0c;顺时针从1开始数到m&#xff0c;数到m的…

【Linux取经路】进程通信——共享内存

文章目录 一、直接原理1.1 共享内存的的申请1.2 共享内存的释放 二、代码演示2.1 shmget2.1.1 详谈key——ftok 2.2 创建共享内存样例代码2.3 获取共享内存——进一步封装2.4 共享内存挂接——shmat2.5 共享内存去关联——shmdt2.6 释放共享内存——shmctl2.7 开始通信2.7.1 pr…

Git学习和使用指南详细篇

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

第十五节:带你梳理Vue2:computed/methods/watch之间的区别

1. 计算属性computed与方法methods的比较 通过学习的知识,我们已经了解了computed计算属性和methods方法, 计算属性computed和methods方法都可以将一段逻辑代码进行复用,那么他们有什么不同之处呢. 我们先看一个示例: <div id"app"> <h2>对于字符串数…

真香!Github上的这个项目,可以帮你节省打印费。

众所周知&#xff0c;我们在打印文档时&#xff0c;往往在选择黑白还是彩色打印上纠结。 全彩的文档也还好&#xff0c;最害怕的就是那种只有一部分是彩色页面&#xff0c;其他都是黑白页面的文档。 遇到这种文档&#xff0c;打印店老板好心的话会帮你分开。如果黑心一点的话…

Javaweb 中过滤器(Filter)的使用

在 Java Web 开发中&#xff0c;过滤器&#xff08;Filter&#xff09;是一种用于拦截和处理请求和响应的组件。它们在 Servlet 请求到达目标 Servlet 之前&#xff0c;或者在响应发送给客户端之前&#xff0c;对请求和响应进行预处理或后处理。过滤器在许多场景中都非常有用&a…

深入了解 RabbitMQ:构建可靠消息传递系统的关键

前言 在现代分布式应用程序开发中&#xff0c;构建可靠的消息传递系统至关重要。RabbitMQ 作为一款强大的消息代理软件&#xff0c;为开发人员提供了丰富的工具和解决方案。本文将深入探讨 RabbitMQ 的核心概念、工作原理以及其在实际应用中的应用场景。 一、什么是 RabbitMQ…

Dockerfile在jdk8基础镜像上,制作ffmpeg镜像

基础镜像,也可以改成自己的 xyjdk8:0.1 #FROM openjdk:8-jre-alpine FROM xyjdk8:0.1 MAINTAINER XiaoYe# 设置仓库&#xff0c; 因为基础镜像已经设置了&#xff0c;这里注释 #RUN echo "http://mirrors.aliyun.com/alpine/v3.10/main" > /etc/apk/repositories…

java版CRM客户关系管理系统crm 客户关系管理系统-简单高效管理客户

我司的CRM客户关系管理系统是一款功能强大的客户关系管理软件&#xff0c;旨在帮助企业更有效地管理客户关系&#xff0c;提高销售效率和客户满意度。该系统涵盖了多个功能模块&#xff0c;包括待办事项、线索管理、客户管理、联系人管理、客户公海、商机管理、合同管理、回款管…

Cent OS 7 64位 安装Docker教程

[root@localhost ~]# mkdir -p /home/envsafe/data/docker [root@localhost ~]# work_dir="/home/envsafe/data/docker" [root@localhost ~]# yum remove -y docker 已加载插件:fastestmirror, langpacks 参数 docker 没有匹配 不删除任何软件包 [root@localhost ~]…

Linux中使用CMake导入第三方开发库

Linux中使用CMake导入第三方开发库 背景 一般CMake中导入第三方库主要使用如下三个方法&#xff1a; find_package 主要使用场景是第三方库提供了CMake文件或是CMake官方适配了部分流行的开发库。FindPkgConfig 主要使用场景是第三方库没有提供CMake文件&#xff0c;但是提供…

Leetcode刷题笔记3:链表基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录链表基础1部分的题目&#xff0c;主要题目包括&#xff1a; 203.移除链表元素707.设计链表206.反转链表 知识点 链表 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据…

HQL面试题练习 —— 取出累计值与1000差值最小的记录

题目来源&#xff1a;滴滴 目录 1 题目2 建表语句3 题解 1 题目 已知有表 t_cost_detail 包含 id 和 money 两列&#xff0c;id 为自增&#xff0c;请累加计算money 值&#xff0c;并求出累加值与 1000 差值最小的记录。 ------------- | id | money | ------------- | 1 …

LLM中的few-shot是什么意思

我上篇博客写了我做的测试Baichuan2-13B模型的一些工作&#xff0c;测试过程免不了要修改代码&#xff0c;在代码中接触了下所谓的few-shot。 比如&#xff0c;所谓2-shot&#xff0c;就是在提示词里提供两个问题和答案&#xff0c;让大模型以为自己回答过问题&#xff0c;后面…

vscode插件-03 PHP

PHP Intelephense 如果php在远程计算机上&#xff0c;要把插件安装在远程&#xff0c;而不是本地。 这个插件&#xff0c;要求php版本大于7&#xff0c;且设置环境变量&#xff08;好像不一定要设置&#xff09;。 设置里面搜索php.executablePath&#xff0c;打开setting.js…

vue-router路由懒加载以及三种实现方式

什么是路由懒加载&#xff1f; 延迟加载或按需加载路由所对应的组件&#xff0c;而不是在应用初始化时就一次性加载所有组件。 路由懒加载做了什么事情&#xff1f; 主要作用是将路由对应的组件打包成一个个的js代码块 只有在这个路由被访问到的时候&#xff0c;才加载对应…

Windows系统安装OpenSSH使用VScode远程连接内网Linux服务器开发

文章目录 &#x1f4a1;推荐 前言1、安装OpenSSH2、VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网…

【详细讲解】二叉树的层序遍历

广度优先搜索 总结一下&#xff0c;思路就是&#xff1a; 加入元素&#xff0c;记录size&#xff0c;size就是当前这一层的元素个数。不断弹出元素&#xff0c;size - 1&#xff0c; 同时加入弹出元素的左右孩子&#xff0c;直到size0&#xff0c;说明当前层已经完全遍历完&am…