Spring Cloud Gateway 的简单介绍和基本使用

前言

本文主要对Spring Cloud Gateway进行简单的概念介绍,并通过多模块编程的方式进行一个简单的实操。

文章目录

  • 前言
  • 1 什么是网关(概念)
  • 2 微服务中的网关
    • 2.1 问题1
    • 2.2 问题2
  • 3 网关作用
  • 4 Spring Cloud Gateway组成
  • 5 Spring Cloud Gateway基础使用
    • 5.1 父类pom.xml依赖
    • 5.2子模块Userservice
    • 5.3 子模块GatewayService
    • 5.4 实操1
    • 5.5 实操2
    • 5.6 注意事项
  • 6 断言类型

1 什么是网关(概念)

网关是一种网络设备,它用于连接不同网络之间的数据传输。它是在网络层级上工作的,能够将数据从一个网络传输到另一个网络。网关可以是物理设备,如路由器,也可以是软件程序,如网络服务器

2 微服务中的网关

在微服务架构中,网关的作用主要是用来作为客户端内部服务端之间中间转发人,因为在微服务架构中,后端服务基本上会被放在私网中,不对外开放地址的,那么客户端身在远方不跟后端服务在一个私网中,是无法通过具体地址访问到后端服务的。

那么这个时候,就需要一个中间人作为连接二者的点,而这个中间人,在私网中,唯独他的IP对外开放,服务器多的情况下,这个中间人还需要额外做一份请求分发的工作,这个中间人我们专业一点就叫做:网关

2.1 问题1

在这里插入图片描述 问:这个时候可能会有朋友会问:客户端和服务端沟通不是可以通过OpenFeign+LoadBalancer吗????

在这里插入图片描述 答:现在的项目前后端分离项目比较多,我们后端是Java,OpenFeign+LoadBalancer的使用需要Jar包,但是我们前端(Vue、三剑客)语言并不能适配Jar包,所以就需要第三个人作为中间人,衔接前端客户端和后端服务端,而OpenFeign+LoadBalancer则作为后端中的通信使用,或者你可以理解访问过程为:前端客户端->网关->后端客户端->后端服务端
在这里插入图片描述

2.2 问题2

在这里插入图片描述 问:为什么不用Nginx这种反向代理作为中间人?

在这里插入图片描述 答:在微服务架构中,你要部署很多个后端且独立存在,这就意味着我前脚在这台服务器上刚登录认证过,后脚我的请求到另一台服务器就被认为是未认证请求,这不就成了我的每一次请求都被提示未登录认证。而我们的网关可以统一认证处理,就实现一次登录,各服务端生效的效果,当然还不止这些效果,接下来便会逐一介绍。

3 网关作用

  • 路由功能:网关可以根据目标地址不同,选择最佳路径将请求从源地址发送到目标地址。
  • 安全控制(统一鉴权):网关可以设置安全策略,对数据包进行检查和过滤,可以验证和授权网络数据包,并阻止未授权数据包访问。(防火墙是一种常用的网关设备,用于保护和过滤网络免收恶意攻击和未经授权的访问)
  • 协议转换:不同网络使用不同的通信协议,网关可以进行协议转换,使不同设备之间可以互相访问(例如:HTTP->HTTPS)
  • 网络地址转换(NAT):网络地址转换,将内部私有IP地址转换为外部网络公共IP地址。

总而言之,网关是一个关键的网络设备,它起到连接不同网络之间的桥梁作用,使得数据能够在不同网络之间传输和交换。

4 Spring Cloud Gateway组成

  • 路由(route):定义了请求应该被发往到哪个的服务端的目标地址,路由由路由ID、断言、目标URI、过滤器组成。通过配置多个路由器,可以实现不同请求的路由规则。
  • 断言(Predicate):用于匹配请求的条件,请求匹配断言条件,则会被路由到对应的目标地址。断言可以基于请求的路径、请求头、请求参数等信息进行匹配。
  • 过滤器(Filter):用于路由请求前后统一处理,如添加请求头、修改请求体等。

5 Spring Cloud Gateway基础使用

下面我们通过多模块编程的方式演示Spring Cloud Gateway的使用,跳过创建过程,直接展示结果:
在这里插入图片描述

5.1 父类pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>Spring-Cloud-Gateway-Demo</artifactId><version>0.0.1-SNAPSHOT</version><name>Spring-Cloud-Gateway-Demo</name><description>Spring-Cloud-Gateway-Demo</description><packaging>pom</packaging><modules><module>UserService</module><module>GatewayService</module></modules><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>3.0.2</spring-boot.version><spring-cloud.version>2022.0.0</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

5.2子模块Userservice

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>UserService</artifactId><version>0.0.1-SNAPSHOT</version><name>UserService</name><description>UserService</description><parent><groupId>com.example</groupId><artifactId>Spring-Cloud-Gateway-Demo</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.userservice.UserServiceApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

application.yml

server:port: 10086

controller代码

@RestController
@RequestMapping("/user")
public class UserControler {@RequestMapping("/getrandom")public String getRandom(){return "userservice:10086-"+new Random().nextInt(1000);}
}

5.3 子模块GatewayService

Spring Cloud Gateway分为两个步骤:

  1. 导入Gateway依赖(pom文件)
  2. 设置网关规则(yml文件)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>GatewayService</artifactId><version>0.0.1-SNAPSHOT</version><name>GatewayService</name><description>GatewayService</description><parent><groupId>com.example</groupId><artifactId>Spring-Cloud-Gateway-Demo</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.gatewayservice.GatewayServiceApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

application.yml

server:port: 8080spring:cloud:gateway:routes:- id: userservice #服务IDuri: http://localhost:10086 #目的地址路由predicates: #断言- Path=/user/** #断言匹配规则

5.4 实操1

启动UserService和启动GatewayService
在这里插入图片描述
我们先正常访问UserService中的路由(http://localhost:10086/user/getrandom)
结果:
在这里插入图片描述

现在已经确认UserService是正常的,那么我们接下来就看看通过网关(http://localhost:8080/user/getrandom)能不能访问到它:

在这里插入图片描述
从中可以发现,我们的Gateway可以帮我们去完成请求转发到适合的服务端上。

5.5 实操2

如果是对于多组的路由该如何编写GatewayService的application.yml呢?编写时又该注意什么?
以下面为例进行说明:
在这里插入图片描述

server:port: 8080spring:cloud:gateway:routes:- id: userserviceuri: http://localhost:10086 #路由predicates:- Path=/user/**, /update/**- id: adminserviceuri: http://localhost:9000predicates:- Path=/admin/**

照虎画猫,我们在创建adminservice子模块与/update/xxx服务

UpdateController类
在这里插入图片描述

@RestController
@RequestMapping("/update")
public class UpdateController {@RequestMapping("/op")public String updateOrInsert(){return "updateOrInsert";}
}

AdminService.AdminController
在这里插入图片描述

@RestController
@RequestMapping("/admin")
public class AdminController {@RequestMapping("/getroles")public String getRoles(){return "AdminService:9000-admin";}
}

下面就进行访问测试,网关能否正确应对多个请求的分发
http://localhost:8080/update/op (√)
在这里插入图片描述
http://localhost:8080/admin/getroles(√)
在这里插入图片描述

补充:
上面我们介绍了application.yml文件中对于数组的写法,而对于application.propeties编写方式如下

server.port=9000
spring.cloud.gateway.routes[0].id=userservice
spring.cloud.gateway.routes[0].uri=http://localhost:10086
spring.cloud.gateway.routes[0].predicates[0]=Path=/user/**
spring.cloud.gateway.routes[0].predicates[1]=Path=/update/**
spring.cloud.gateway.routes[1].id=adminservice
spring.cloud.gateway.routes[1].uri=http://localhost:9000
spring.cloud.gateway.routes[1].predicates[0]=Path=/admin/**

5.6 注意事项

细心的朋友可能已经发现了,在多模块项目中,我的SpringWeb依赖没有放到父模块pom中,而是放在子模块。

这是因为父类中添加SpringWeb依赖会导致全子类都使用,而我们的Spring Cloud Gateway是基于Reactive进行开发的,不能使用简单的Spring Web依赖,需要使用Spring Reactive Web依赖,但是Spring Cloud Gateway底层中已经包含了这个依赖,所以我们没有在GatewayService中导入Spring Reactive Web,在其他子模块中导入Spring web依赖的原因。
在这里插入图片描述
假如我们错误的将Spring Web适用到Spring Cloud Gateway模块中,也会有error抛出,示例如下:
在这里插入图片描述
错误中也告诉我们解决方式,要么在gateway中使用Spring Reactive Web要么吧Spring Web移除

6 断言类型

Spring Cloud Gateway支持的断言类型目前有12种,包含以下这些:

  1. 根据时间匹配(包含3中类型)
    a. After:请求在指定时间之后才匹配
    b. Before: 请求在指定时间之前才匹配
    c. Between: 请求在指定时间中才匹配
  2. cookie:配置请求中的Cookie值
  3. Header:配置请求中的Header值
  4. Host:匹配请求头中的Host值
  5. Method:匹配请求头中的Method的值
  6. Path: 匹配请求路径
  7. Query: 匹配请求参数
  8. RemoteAddr:匹配请求的IP地址,支持IPV4和IPV6
  9. Weight:根据权重来分发请求,权重根据Group来计算
    10.XForwardRemoteAddr:根据X-ForWord-For匹配

官方参考文档:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

其中Cookie和Header方式的匹配需要配合正则表达式来使用

正则表达式

  1. \w+:匹配一个或多个字母、数字、下划线字符
  2. \s+:匹配一个或多个空白字符 (包括空格、制表符、换行符等)。
  3. .*:匹配任意字符(除了换行符) 零次或多次
  4. .+:匹配除了换行符之外的任意字符一次或多次。
  5. [abc]:匹配字符集中的任意一个字符,例如 [abc] 可以匹配a、b或c。
  6. [^abc]:匹配除了字符集中的任意字符之外的任意字符,例如[^abc] 可以匹配除了a、b和c之外的任意字符
  7. ^:匹配字符串的开始位置
  8. $:匹配字符串的结束位置
    9.|:表示"或”的意思,用于匹配多个模式中的任意一个10.(): 用10.():于分组,可以将一组字符作为一个整体进行匹配。
END
希望对你有所帮助

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

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

相关文章

tidyverse数据特征学习

目录 特征缩放 1&#xff0c;标准化-scale 2&#xff0c;归一化-rescale 3&#xff0c;行规范化 4&#xff0c;数据平滑 特征变换 1. 非线性特征 2. 正态性变换 3. 连续变量离散 特征降维 特征缩放 不同数值型特征的数据量纲可能相差多个数量级&#xff0c;这对很多…

【企业微信连接问题】

1、个人可以创建企业微信的企业账号么&#xff1f; 答&#xff1a;可以的&#xff0c;只是没法认证。不过基础的功能还是有的。 注册步骤&#xff1a;企业微信注册步骤 2、集简云链接企业微信&#xff0c;在授权之后&#xff0c;找不到集简云怎么办&#xff1f; 答&#xff1a…

计算机组成原理4

1.汇编语言 2.汇编语言常见的运算指令 3.AT&T格式 和 Intel格式 4.跳转指令 5.cmp比较的底层原理 6.函数调用的机器级表示 7.CISC和RISC

多线程详解(未完结)

文章目录 ⭐️写在前面的话⭐️一、线程简介1.1 进程1.2 线程1.3 多线程和多进程的区别1.4 总结 二、继承实现2.1 继承Thread类例子&#xff1a;网图下载 2.2 实现Runnable接口 (推荐)案例&#xff1a;火车站买票问题案例&#xff1a;龟兔赛跑 2.3 实现Callable接口 (了解即可)…

ubuntu20.04打不开github网址的有效解决方案

问题描述&#xff1a;重装的ubuntu系统&#xff0c;chrome浏览器刚开始还能打开github网址&#xff0c;然后突然就打不开了&#xff0c;换网络也不行。 解决方案步骤 1&#xff0c;查询你的电脑IP对应的github网址信息 2&#xff0c;修改host文件&#xff0c;添加第1步查询到…

【React】打包体积分析 source-map-explorer

通过分析打包体积&#xff0c;才能知道项目中的哪部分内容体积过大&#xff0c;方便知道哪些包需要进一步优化。 使用步骤 安装分析打包体积的包&#xff1a;npm i source-map-explorer在 package.json 中的 scripts 标签中&#xff0c;添加分析打包体积的命令对项目打包&…

【C++】多线程(一):std::thread的使用

这篇文章应我朋友的邀请&#xff0c;写一篇文章介绍下C多线程。 编译环境准备 首先确定你的编译器支持std的thread&#xff0c;如果不支持&#xff0c;就会出现诸如“thread找不到”的问题。 以下假设你使用 gnu gcc 编译器&#xff0c;因为 MSVC 的我也不太熟悉。 linux …

Effective Modern C++(1.顶层const与底层const)

1.顶层const与底层const的定义 const修饰的变量不可以改变&#xff0c;那么他就是顶层const&#xff0c;如&#xff1a; const int a 10; 那么&#xff0c;对于 const int *const p new int(10); 第二个const就是顶层const&#xff0c;因为他修饰的是p&#xff1b;第一个…

学习.NET验证模块FluentValidation的基本用法(续3:ASP.NET Core中的调用方式)

FluentValidation模块支持在ASP.NET Core项目中进行手工或自动验证&#xff0c;主要验证方式包括以下三种&#xff1a;   1&#xff09;手工注册验证类&#xff0c;并在控制器或其它模块中调用验证&#xff1b;   2&#xff09;基于ASP.NET验证管道&#xff08;validation …

Visual Studio 中文注释乱码解决方案

在公司多人开发项目中经常遇到拉到最新代码&#xff0c;发现中文注释都是乱码&#xff0c;很是emjoy..... 这是由于编码格式不匹配造成的&#xff0c;如果你的注释是 UTF-8 编码&#xff0c;而文件编码是 GBK 或者其他编码&#xff0c;那么就会出现乱码现象。一般的解决办法是…

打包SpringBoot 项目为本地应用

使用工具&#xff1a;exe4j、Inno Setup Compiler 步骤&#xff1a; 1&#xff0c;将dll包放入项目根路径下&#xff1b; 2&#xff0c;idea 使用Maven打jar包&#xff1b; 3&#xff0c;使用exe4j 工具进行打包&#xff1b; 打开工具首页不动&#xff08;直接 next&#xff…

leetcode_828_统计子串中的唯一字符

题意&#xff1a;所有子串中单个字符出现的次数和 问题转化&#xff1a;对于串中的每个字符&#xff0c;只包含其一次的所有子串的个数和 关于求只包含某位置字符一次的子串个数 class Solution { public:int uniqueLetterString(string s) {/* ...A...A...A...*/int n s.size…

第二十二章 解读pycocotools的API,目标检测mAP的计算COCO的评价指标(工具)

Pycocotools介绍 为使用户更好地使用 COCO数据集, COCO 提供了各种 API。COCO是一个大型的图像数据集&#xff0c;用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi&#xff0c;这些api有助于在COCO中加载、解析和可视化注释。 …

【Skynet 入门实战练习】实现网关服务 | 用户代理 | RPC 协议 | 客户端

文章目录 前言网关服务RPC 协议看门狗服务代理服务客户端逻辑梳理 前言 上两章学习了如何搭建一个项目&#xff0c;简单实现了几个基础模块。本章节会实现基本的客户端与服务端的通信&#xff0c;包括网关&#xff08;gate&#xff09;、看门狗&#xff08;watchdog&#xff0…

不适合当老师怎么转岗

作为一名老师&#xff0c;你需要耐心、热情、知识储备丰富&#xff0c;还要有一定的演讲技巧。但有时候&#xff0c;即使具备了这些条件&#xff0c;你仍然可能觉得自己的个性或能力并不适合这个职业。那么&#xff0c;该如何转岗呢&#xff1f;别担心&#xff0c;我们为你提供…

玉渊谭天对电影色彩分析的“蚊香图”复现-python

视频教程链接&#xff1a;https://www.bilibili.com/video/BV1Lu4y1t7FG/ 最终的实现效果如下&#xff1a; 前几天刷抖音刷到了玉渊谭天对于电影抽取画面制作“蚊香图”&#xff0c;相关视频片段如下。 这种制作”蚊香图“的特效当时有点触动到到我&#xff0c;根据色彩来分…

深度学习技巧应用30-深度学习中的GPU的基本架构原理与应用技巧

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用30-深度学习中的GPU的基本架构原理与应用技巧,GPU是一种专门用于处理大量并行操作的硬件设备,它的架构设计主要是为了图形渲染。然而,由于其并行处理能力,现在广泛应用于深度学习、科学计算等领域。主要的GPU制造商…

autojs-练手-简单的视频号点赞(初阶版)

注释很详细&#xff0c;直接上代码&#xff08;简单的练手实践&#xff0c;仅供参考&#xff09; //设置点赞次数 var num50; //等待权限授予 auto.waitFor(); //进入点赞流程 while(num!0) {//先向下滑一个视频scrollDown();//使用auto.js找到点赞控件的id&#xff08;每个人不…

《软件方法》2023版第1章:1.1 利润=需求-设计,1.2 ABCD工作流

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第1章 建模和UML 牵着你走进傍晚的风里&#xff0c;看见万家灯火下面平凡的秘密。 《情歌唱晚》&#xff1b;词&#xff1a;黄群&#xff0c;曲&#xff1a;黄群&#xff0c;唱&#…

复数的几何意义

1、复平面&#xff0c;复数的其它表示法 (1)几何表示法 直角平面坐标&#xff1a; 复平面 实轴&#xff0c;虚轴 (2)向量表示法 向量 模&#xff1a; 复数加减法可用向量的三角形法则或者平行四边形法则 (3)结论 (两边之和大于第三边) ((两边之差大于第三边)) *辐角&am…