在Spring Cloud中使用Gateway 网关
我们在上述文章中介绍了相关Spring Cloud的五大核心组件,现在我们来了解一下关于Spring Cloud的网关,关于使用网关,我们同时也需要知道他在一个架构中起到的作用,并且,我们需要知道网关具体的相关功能,本篇将带你了解gateway网关。
概述
网关也称作gateway,是一个在系统架构中起到中介的作用的组件,主要位于客户端和后端服务之间,负责接收来自客户端的请求,并将其转发到相应的后端服务。
我们在Spring Cloud中通常会有多个独立的服务提供不同的功能,这个时候,我们知道每个服务都有自己调用的API接口,并且客户端需要和多个服务直接进行交互,那么我们会导致在客户端需要处理多个服务的地址,认证,负载均衡等情况,这个时候,我们引入网关就可以简化客户端的操作,并且客户单只需要和网关进行交互,并且网关负责将相关请求转发到相应的服务。

在Spring Cloud中使用Gateway
首先我们先引入相关依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
之后我们在Spring Cloud中项目配置文件中配置相关路由规则:
spring:cloud:gateway:routes:- id: example_routeuri: http://example.com # 转发的目标URLpredicates:- Path=/example/** # 匹配的请求路径
看上述配置,我这边使用的是example进行的,通过配置一个路由规则,将匹配到以/example开头的相关请求转发到你指定的URL中去,也可以使用localhost:88,具体随便你定,如果你又云服务有配置了相关地址,那就直接指向你的域名服务器吧!
之后我们在启动类中添加相关注解:
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
在运行使用Spring Cloud应用程序,Gateway网关中将会根据配置的相关路由规则进行转发,当我们通过url地址访问的时候,比如我采用localhost:88/example/test去访问端口号的时候,如果我们配置了相关路由规则,那么他就转发到我们指向的http://example.com/example/test上去了。
注意
路由转发规则是指根据请求的路径、参数、请求头等信息,将请求转发到相应的后端服务的规则。常见的路由转发规则包括以下几种:
基于路径的路由规则:根据请求的路径将请求转发到相应的后端服务。例如,将以/api/user开头的请求转发到用户服务,将以/api/order开头的请求转发到订单服务。
import spark.*;public class Main {public static void main(String[] args) {Spark.get("/api/user", (req, res) -> {// 转发到用户服务return forwardToUserService(req);});}private static String forwardToUserService(Request req) {// 实现转发逻辑return "Forwarded to User Service";}
}
或者:
spring:mvc:servlet:path: /api/usercloud:gateway:routes:- id: user-serviceuri: http://user-servicepredicates:- Path=/api/user/**
基于请求头的路由规则:根据请求头中的信息将请求转发到相应的后端服务。例如,将请求头中包含X-Service-Name: user的请求转发到用户服务,将请求头中包含X-Service-Name: order的请求转发到订单服务。
import spark.*;public class Main {public static void main(String[] args) {Spark.before((req, res) -> {if (req.headers("X-Service-Name").equals("user")) {// 转发到用户服务forwardToUserService(req, res);}});}private static void forwardToUserService(Request req, Response res) {// 实现转发逻辑res.body("Forwarded to User Service");}
}
或者:
spring:cloud:gateway:routes:- id: user-serviceuri: http://user-servicepredicates:- Header=X-Service-Name,user
基于请求参数的路由规则:根据请求参数中的信息将请求转发到相应的后端服务。例如,将请求参数中包含service=user的请求转发到用户服务,将请求参数中包含service=order的请求转发到订单服务。
import spark.*;public class Main {public static void main(String[] args) {Spark.get("/api", (req, res) -> {if (req.queryParams("service").equals("user")) {// 转发到用户服务return forwardToUserService(req);} else {// 其他逻辑return "Other Service";}});}private static String forwardToUserService(Request req) {// 实现转发逻辑return "Forwarded to User Service";}
}
或者:
spring:cloud:gateway:routes:- id: user-serviceuri: http://user-servicepredicates:- Query=service,user
基于请求方法的路由规则:根据请求的方法(GET、POST、PUT、DELETE等)将请求转发到相应的后端服务。例如,将GET请求转发到查询服务,将POST请求转发到写入服务。
import spark.*;public class Main {public static void main(String[] args) {Spark.get("/api/query", (req, res) -> {// 转发到查询服务return forwardToQueryService(req);});}private static String forwardToQueryService(Request req) {// 实现转发逻辑return "Forwarded to Query Service";}
}
或者
spring:cloud:gateway:routes:- id: query-serviceuri: http://query-servicepredicates:- Method=GET
基于请求体的路由规则:根据请求体中的信息将请求转发到相应的后端服务。例如,将请求体中包含{“type”: “user”}的请求转发到用户服务,将请求体中包含{“type”: “order”}的请求转发到订单服务。
import spark.*;public class Main {public static void main(String[] args) {Spark.post("/api", (req, res) -> {if (req.body().contains("{\"type\": \"user\"}")) {// 转发到用户服务return forwardToUserService(req);} else {// 其他逻辑return "Other Service";}});}private static String forwardToUserService(Request req) {// 实现转发逻辑return "Forwarded to User Service";}
}
或者
spring:cloud:gateway:routes:- id: user-serviceuri: http://user-servicepredicates:- ReadBody=truefilters:- ModifyRequestBody=application/json, # 进行请求体的修改SetRequestBody={ "type": "user" }
基于组合条件的路由规则:根据多个条件的组合将请求转发到相应的后端服务。例如,将以/api/user开头且请求头中包含X-Service-Version: v1的请求转发到用户服务的v1版本,将以/api/user开头且请求头中包含X-Service-Version: v2的请求转发到用户服务的v2版本。
import spark.*;public class Main {public static void main(String[] args) {Spark.before((req, res) -> {if (req.headers("X-Service-Name").equals("user")) {if (req.queryParams("id") != null) {// 转发到用户详情服务forwardToUserDetailService(req, res);} else {// 转发到用户列表服务forwardToUserListService(req, res);}}});}private static void forwardToUserDetailService(Request req, Response res) {// 实现转发逻辑res.body("Forwarded to User Detail Service");}private static void forwardToUserListService(Request req, Response res) {// 实现转发逻辑res.body("Forwarded to User List Service");}
}
或者:
spring:cloud:gateway:routes:- id: user-serviceuri: http://user-servicepredicates:- Header=X-Service-Name,user- Query=idfilters:- RewritePath=/api/user/(?<id>.*), /api/user/{id}
补充
网关的主要作用:
-
路由转发:根据请求的路径或其他条件,将请求转发到相应的后端服务。
-
负载均衡:在转发请求时,可以根据负载均衡算法将请求分发到多个后端服务实例,以实现负载均衡。
-
安全认证:可以对请求进行身份验证和授权,确保只有合法的请求能够访问后端服务。
-
请求过滤:可以对请求进行过滤,例如根据请求的特征进行访问控制、请求日志记录等。
-
缓存:可以对请求的响应进行缓存,提高系统性能和响应速度。
-
监控和日志记录:可以对请求进行监控和日志记录,方便系统运维和故障排查。
相关文章:
在Spring Cloud中使用Gateway 网关
我们在上述文章中介绍了相关Spring Cloud的五大核心组件,现在我们来了解一下关于Spring Cloud的网关,关于使用网关,我们同时也需要知道他在一个架构中起到的作用,并且,我们需要知道网关具体的相关功能,本篇…...
【Python】配置环境变量
Python配置Windows系统环境变量 打开电脑属性 ——> 高级系统设置 ——> 高级 ——> 环境变量 Python安装目录 D:\Program Files\Python39 winR打开运行,输入cmd打开命令窗口 python -V...
使用.Net nanoFramework 驱动ESP32的OLED显示屏
本文介绍如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始,逐步深入,让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者,这篇文章都会对你有所帮助。 1. 硬件准备 1.1 ESP32开发板 这里我们…...
0基础学习VR全景平台篇第134篇:720VR全景,云台调整节点
相机、云台和脚架全套设备组装完成后需要进行调校才能开始拍摄。这一节,我们将主要介绍云台调整的两个内容:对中心靶、调三点一线。(后附调校原理) 云台部件名称 一、调节准备 (一)对于安装好的云台 1.检…...
扫地机器人地图与用户终端的同步
以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/APaJheSbgTW3jNssWsp5Ng 地图数据来源于机器人算法模块,一般通过SLAM算法完成建图的过程。 建图过程中,基础数据涉及到各…...
使用机器学习进行语法错误检测/纠正
@francescofranco_39234 一、说明 一般的学习,特别是深度学习,促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天,我们将研究另一个流行的用途:我们将使用Gramformer构建一个用于机器学习语法错误检测和纠正的管道。 阅读本文…...
从0到1快速入门ETLCloud
一、ETLCloud的介绍 ETL是将业务系统的数据经过抽取(Extract)、清洗转换(Transform)之后加载(Load)到数据仓库的过程,目的是将企业中的分散、凌乱、标准不统一的数据整合到一起,为企…...
QT上位机开发(会员管理软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们学习了ini文件的解析办法,通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外,另外一种经常出…...
线性代数笔记3 1.1
学习视频: 2.2 矩阵运算(二)_哔哩哔哩_bilibili 包括内容: p10矩阵运算(二) p11特殊矩阵 p12逆矩阵(一) p13逆矩阵(二)...
2023年12月编程语言排行榜
TIOBE Index for December 2023 December Headline: C# on its way to become programming language of the year 2023 2023年12月的TIOBE指数:12月头条:c#将成为2023年最佳编程语言 Yes, I know, we have been here before. At the end of 2022, it looked like …...
Redis VS Memcached:选择哪个更适合您的应用?
目录 1、前言 2、概念简介 2.1 Redis 2.2 Memcached 3、数据模型 4、持久性 5、分布式能力 6、性能和扩展性 7、如何选择适合您引用的缓存系统 8、结语 1、前言 Redis和Memcached都是常见的内存缓存系统,用于提升应用程序的性能和可扩展性。它们都具有高…...
【HarmonyOS开发】共享包HAR和HSP的创建和使用以及三方库的发布
OpenHarmony提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。 HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C库、资源和配置文件&…...
安装 Node.js、npm
安装 nodejs 安装Node.js的最简单的方法是通过软件包管理器。 Node.js官网:https://nodejs.org/en/download/ cd /usr/local/src/wget -c https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz xz -d node-v18.16.0-linux-x64.tar.xz tar -xf node…...
解决报错:找不到显卡
今天做实验碰到一个问题:torch找不到显卡: 打开任务管理器,独显直接没了,一度以为是要去修电脑了,突然想到上次做实验爆显存,屏蔽了gpu用cpu训练: import os os.environ["CUDA_DEVICE_OR…...
如何使用Node.js快速创建本地HTTP服务器并实现公网访问服务端
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【社交网络分析】课程考试复盘 + 相关资料补充
【社交网络分析】考试后复盘 相关资料补充 写在最前面论述1.描述Logistic回归模型构造损失函数的主要思想。它是如何把线性回归预测模型转化为二分类模型的。Logistic回归模型构造损失函数的主要思想Logistic回归如何将线性回归预测模型转化为二分类模型 2.社交网络分析中面临…...
算法——队列+宽搜(BFS)
队列这种数据结构大都服务于一个算法——宽搜(BFS)。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等 N叉数的层序遍历 N叉树的层序遍历 题目解析 给定一个 N 叉树,返回其节点值的_层序遍历_。(即从左到右&#…...
前端八股文(CSS篇)二
目录 1.css中可继承与不可继承属性有哪些 2.link和import的区别 3.transition和animation的区别 4.margin和padding的使用场景 5.::before和:after的双冒号和单冒号有什么区别? 6.display:inline-block什么时候会显示间隙 7…...
系统架构设计师笔记
第1章计算机组成与体系结构 1.1.1计算机硬件的组成 (1)控制器。控制器是分析和执行指令的部件,也是统一指挥并控制计算机各部件协调工作的中心部件,所依据的是机器指令。控制器的组成包含如下。 ①程序计数器PC:存储下…...
Livox-Mid-360 固态激光雷达ROS格式数据分析
前言: Livox-Mid-360 官方采用livox_ros_driver2ROS功能包发布ROS格式的数据,livox_ros_driver2可以把Livox原始雷达数据转化成ROS格式并以话题的形式发布出去。 下面列举一些雷达的基本概念: 点云帧:雷达驱动每次向外发送的一…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
