spring cloud gateway一些相关概念

        在云架构中运行着众多客户端和服务端,API网关的存在提供了保护和路由消息,隐藏服务,限制负载等等功能。下图是spring cloud gateway所处的位置。

 它有三大概念:

路由:路由是构建网关的基本模块,它由ID,目标URI,一系列的断言Predicates和过滤器Filters组成,如果断言为true,则匹配该路由。

断言:参考Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容,例如请求头或请求参数,如果请求与断言相匹配则进行路由。

过滤:Spring框架中GatewayFilter的实例,使用过滤器,可以载请求被路由前或者后对请求进行修改。

工作流程图如下:

SpringCloud Gateway 和nginx 都在流量进入服务前做一些处理, 那谁先执行呢,他们之间有联系吗 ?

在微服务架构中,SpringCloud Gateway和Nginx的执行顺序和它们之间的联系主要取决于你的具体配置和架构设计。

  1. 执行顺序

    • 如果你将Nginx用作反向代理服务器,并且将所有入站流量都首先路由到Nginx,那么Nginx将首先执行。Nginx可以根据其配置将请求转发到后端的SpringCloud Gateway或其他微服务。
    • 如果SpringCloud Gateway是直接暴露给外部用户的,那么它将首先执行。但是,你仍然可以在SpringCloud Gateway之前使用Nginx作为反向代理,以增加额外的安全性、负载均衡或其他功能。
  2. 联系

    • 反向代理:Nginx经常被用作反向代理服务器,将外部请求转发到后端的SpringCloud Gateway或其他微服务。这可以为你的架构提供额外的安全性、负载均衡和缓存功能。
    • 负载均衡:Nginx和SpringCloud Gateway都支持负载均衡功能。Nginx可以在其配置中定义负载均衡规则,将请求分发到多个SpringCloud Gateway实例或其他微服务实例上。同样,SpringCloud Gateway也可以配置负载均衡策略,将请求路由到后端的微服务实例。
    • 安全性:Nginx和SpringCloud Gateway都可以提供安全性功能,如SSL终止、IP白名单、基本身份验证等。但是,它们的安全性功能可能有所不同,具体取决于你的配置和需求。
    • 解耦和细分:在某些情况下,Nginx可能不再承担服务的路由分发和负载均衡的角色,而是将这些功能转交给更专业的工具(如SpringCloud Gateway)来处理。这是一种解耦和细分的表现,可以使你的架构更加灵活和可扩展。

Nginx和SpringCloud Gateway之间可以存在紧密的联系,但也可以完全独立地运行。需要根据你的具体需求和架构设计来决定如何配置和使用它们。

那SpringCloud Gateway 和spring security谁先执行呢?

在Spring Cloud微服务架构中,SpringCloud GatewaySpring Security的执行顺序取决于它们是如何配置和集成的。但通常来说,SpringCloud Gateway作为API网关,会首先接收到来自客户端的请求,并在处理这些请求时可能会涉及到Spring Security的安全检查。

以下是它们之间可能的工作流程:

  1. 客户端发起请求:客户端(如Web浏览器、移动应用或其他服务)向API网关(即SpringCloud Gateway)发起HTTP请求。
  2. SpringCloud Gateway接收请求:SpringCloud Gateway作为API网关,会首先接收到这些请求。它会根据配置的路由规则来确定将请求转发到哪个微服务。
  3. SpringCloud Gateway的安全检查(如果配置):在转发请求之前,SpringCloud Gateway可能会执行一些安全检查。这些检查可能包括验证请求头、请求参数或JWT令牌等。这些安全检查可以通过自定义的过滤器(Filter)来实现,这些过滤器可以在请求被转发到微服务之前对请求进行拦截和处理。
  4. 转发请求到微服务:如果请求通过了SpringCloud Gateway的安全检查(如果有的话),那么它就会被转发到相应的微服务。
  5. Spring Security在微服务中的执行:当请求到达微服务时,如果微服务配置了Spring Security,那么Spring Security就会执行相应的安全检查。这些检查可能包括验证用户的身份(如用户名和密码登录、OAuth令牌等)、检查用户是否有权访问请求的资源等。
  6. 微服务处理请求并返回响应:如果请求通过了Spring Security的安全检查,那么微服务就会处理该请求并返回响应。这个响应会经过SpringCloud Gateway返回给客户端。

SpringCloud Gateway和Spring Security的安全检查是独立的,它们可以分别配置和执行。在某些情况下,你可能需要在SpringCloud Gateway中执行一些安全检查(如验证JWT令牌),然后在微服务中执行更细粒度的安全检查(如基于角色的访问控制)。这取决于具体需求和架构设计。

spring cloud gateway 断言配置:

        predicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]  # 在..之前可以匹配- After=2017-01-20T17:42:47.789-07:00[America/Denver]   # 在..之后可以匹配- Between=xxx,xxx										# 在..之间可以匹配- Cookie=chocolate, ch.p								# 带cookie- Header=X-Request-Id, \d+								# 规定header- Host=**.somehost.org,**.anotherhost.org				# 规定host- Method=GET,POST										# 规定请求方法- Path=/red/{segment},/blue/{segment}					# 规定请求路径- Query=green											# 规定请求参数- RemoteAddr=192.168.1.1/24								# 规定remoteAddr# 将80%的流量转到weighthigh.org,20%转到weightlow.org- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

例子:假如有两个相同的服务实例cloud-payment-service(即它们提供相同的功能和API),并且你希望它们能够共同分担负载(即实现负载均衡,端口分别为8001和8002),现在通过gateway的断言设置分别请求这两个服务里的/payment/hello方法。

gateway的yml配置:

server:port: 9527spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment1/**         # 断言,路径相匹配的进行路由- After=2020-11-26T21:27:26.256+08:00[Asia/Shanghai]- id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment2/lb/**         # 断言,路径相匹配的进行路由- After=2020-11-25T22:42:23.608+08:00[Asia/Shanghai]- Cookie=username,hyh#- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式
#            - Host=**.somehost.org,**.anotherhost.org  # 匹配hostname
#            - Method=GET,POST
#            - Path=/red/{segment},/blue/{segment}
#            - Query=green
#            - RemoteAddr=192.168.1.1/24
#            - Weight=group1, 2- id: payment_routh3 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001          #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/hello         # 断言,路径相匹配的进行路由- After=2020-11-25T22:42:23.608+08:00[Asia/Shanghai]- Cookie=username,hyh- Header=X-Request-Num, \d+
eureka:instance:hostname: cloud-gateway-serviceinstance-id: gateway9527prefer-ip-address: trueclient: #服务提供者provider注册进eureka服务列表内service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka

8001的服务的方法:

 @GetMapping("/payment/hello")public String helloNum() {log.info("(8001)/payment/hello 执行了");return serverPort + "/payment/hello 执行了";}

8002的服务的方法:

@GetMapping("/payment/hello")
public String helloNum() {log.info("(8001)/payment/hello 执行了");return serverPort + "/payment/hello 执行了";
}

设置请求参数:

 

连点两次发送请求gateway服务,发现两次分别调用了两个服务的同一个方法:

 如果将请求头header或者cookies设置为错误的值,不满足断言,gateway则不转发这个请求:

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

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

相关文章

vue中的事件

vue中的事件是什么 绑定事件用v-on,简写v-on指令的参数是事件名(原生或者自定义),值是事件处理器有原生事件(click)和自定义事件(myEvent)在组件上使用原生事件,需要加n…

worklist配置调试日志记录

工作记录用,不拘小节! 设备请求日志 2024-05-23 09:03:14,503 [WorkListServer: 10.87.232.253 [18]] INFO - LISTMWL Request from [gehc]: (0008,0005) CS [ISO_IR 100] # 10 Specific Character Set 1-N (0008,0020) DA [] …

用python做的一个登录界面——浔川python社

以下代码是一个基于Tkinter的简单的登录注册界面。 代码的功能如下: 导入tkinter模块,并重命名为tk。 创建一个窗口对象window,并设置标题和大小。 创建一个随机的四位数作为验证码,并将其显示在窗口中。 创建用户名、密码和验…

如何搭建一个vue项目(完整步骤)

搭建一个新的vue项目 一、安装node环境二、搭建vue项目环境1、全局安装vue-cli2、进入你的项目目录,创建一个基于 webpack 模板的新项目3、进入项目:cd vue-demo,安装依赖4、npm run dev,启动项目 三、vue项目目录讲解四、开始我们…

go 爬虫之 colly 简单示例

1. 背景 colly 是 Go 实现的比较有名的一款爬虫框架,而且 Go 在高并发和分布式场景的优势也正是爬虫技术所需要的。它的主要特点是轻量、快速,设计非常优雅,并且分布式的支持也非常简单,易于扩展。 2. 官方文档 https://go-col…

RPC原理技术

RPC原理技术 背景介绍起源组件实现工作原理 背景 本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。 介绍 RPC,Remote Procedure Call,远程过程调用,允许像调用本地方法一样调…

Java 如何使用aws的kinesis实现消费端,消费流中数据

1.前言 AWS 官网给了两种方式实现: java 1.x java 2.x 这两种方式,包是不一样的,1.x是com.amazonaws,2是software.amazon.kinesis 使用也是天差地别,而且国内对kinesis这个资料简直少的可怜,这也就增加了开发难度, 2.什么是kinesis 我说一下kinesis是啥吧,其实和咱们队…

spring jpa 公共字段设计

数据库公共字段 1、多租户 tenantId 2、创建者名字 createName 3、创建者时间 createTime 4、更新者名字 updateName 5、更新者时间 updateTime 基础model类 /*** 基础Model*/ Data MappedSuperclass public class BaseModel implements Serializable{IdGeneratedValue(stra…

Linux DAY 6 _systemctl

systemctl命令,通过这个命令控制系统操作 语法:systemctl start | stop | status | enable | disable 服务名 start 启动 stop 关闭 status 查看状态 enable 开启开机自启 disable 关闭开机自启 服务名: NetworkManager 主网络服务 net…

源网络地址转换SNAT

左上角的是访问互联网发送的数据包,第一个是访问,第二个是网页传回来的 3、4项是源端口号和目的端口号(3是随机的(1024-65535),那个是http的网页服务端口就是80) 那么往回传数据的时候源和目的…

解决uniapp中的web-view页面进入时全屏问题

当我们在使用uniapp开发应用的时候,我们使用web-view进行外部页面的引入 在h5 浏览器下显示正常,我通过样式控制,上面是web-view,下面是菜单栏。 但是在 app调试或真机上,无论如何,web-view都占满全屏&…

0.零基础入门微服务实战课

0.零基础入门微服务实战课 1.微服务和 Spring Cloud1.1 什么是微服务?1.2 什么是 Spring Cloud?1.3 微服务 VS Spring Cloud 2.为什么要学微服务?3.Spring Cloud 组件介绍 1.微服务和 Spring Cloud 1.1 什么是微服务? 微服务是将…

【Leetcode 每日一题】28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入:haystack &qu…

DFE_offset失调校准

1.校准原因 *制造工艺的限制:晶体管在制造过程中,由于工艺的限制,不可能做到完全对称,这导致了输入级晶体管的性能存在微小的差异。 *输入级偏置电流的不对称:输入级晶体管的偏置电流也会存在差异,这也会…

H4vdo 台湾APT-27视频投放工具

地址:https://github.com/MartinxMax/H4vdo 视频 关于 H4vdo RTMP lock 屏播放视频工具,可以向目标发送有效载荷,播放目标的屏幕内容。目标无法曹作计算机 使用方法 安装依赖 根据你的操作系统选择一个安装程序 RTMP 服务端 ./rtsp-simple-server.…

npm run dev启动element-ui,提示node_modules中webpack的版本跟package.json中webpack的版本不一致

问题一:修改node_modules/webpack/package.json版本为4.14.0,npm run dev时版本号又自动更改为 4.47.0 问题二:使用yarn 安装依赖,webpack的版本默认是4.47.0,为什么 求大佬们帮我解答一下以上两个问题 左侧是node_m…

【退役重学Java】关于 Sentinel 与服务熔断熔断

一、Sentinel 分布式系统的流量防卫兵 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度 二、服务熔断 是什么: 服务熔断是一种微服务架构中的容错机制&#…

数据中心大型AI模型网络需求

数据中心大型AI模型网络需求 随着Transformer的崛起和2023年ChatGPT的大规模应用,业界逐渐形成共识:遵循一定的规模效应原则,增加模型参数量能够显著提升模型性能。特别是在参数数量级跃升至数百亿乃至更高时,大型AI模型在语言理…

【C++】 类型转换的详细讲解

前言 本章我们将学习C里面的几种类型转换。如: static_cast、reinterpret_cast、const_cast、dynamic_cast。 这些都是操作符关键字。 目录 1. C的类型转换1.1 C语言的类型转换:1.2 为什么C需要四种类型转换:1.3 C强制类型转换:1.…

知识分享|非凸问题求解方法及代码示例【分类迭代】【大M法】

主要内容 之前发布了非线性问题线性化的几种方法,如知识分享|分段函数线性化及matlab测试,学习园地 | yalmip实用操作-线性化,非线性优化 | 非线性问题matlabyalmip求解案例,但是在实际建模及编程过程中,会遇到各种…