在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格式并以话题的形式发布出去。 下面列举一些雷达的基本概念: 点云帧:雷达驱动每次向外发送的一…...
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现 1. 为什么需要关注硬件配置 去年冬天,当我第一次尝试在本地部署OpenClaw对接百川2-13B模型时,我的旧显卡GTX 1660 Ti直接崩溃了。那次经历让我深刻认识到——选择合适的硬件对…...
老牌CMS的隐痛:从DedeCMS漏洞看开源系统会员模块的安全设计误区
DedeCMS会员模块漏洞剖析:开源系统安全设计的深层反思 当一款拥有百万级安装量的老牌CMS系统曝出前台任意密码修改漏洞时,我们看到的不仅是一个具体的技术缺陷,更是开源项目在安全架构设计上的系统性隐忧。2018年那场影响广泛的DedeCMS漏洞事…...
IPD实战指南:CBB模块化设计如何加速产品创新与资源整合
1. CBB模块化设计的本质与价值 第一次接触CBB这个概念时,我正负责一款智能家居产品的研发。当时团队为了赶进度,每个新产品都从零开始设计电路板,结果发现80%的功能模块都是重复的。这种低效的开发方式让我开始思考:能不能像搭积木…...
别再死记硬背了!用Python和SymPy库5分钟可视化理解泰勒公式的逼近过程
用Python动态可视化泰勒公式:5行代码理解多项式逼近本质 数学公式的抽象性常常成为学习者的障碍,尤其是泰勒公式这种涉及无限逼近概念的内容。传统的静态图示和理论推导虽然严谨,却难以直观展示"以直代曲"的动态过程。本文将用Pyth…...
Spring Boot 与 Serverless 集成最佳实践
Spring Boot 与 Serverless 集成最佳实践 引言 大家好,今天想和大家聊聊 Spring Boot 与 Serverless 的集成。Serverless 是一种云原生的计算模型,它允许开发者专注于代码开发,而不需要管理服务器基础设施。在 Spring Boot 应用中,…...
CREST:如何用5分钟开启分子构象探索之旅?
CREST:如何用5分钟开启分子构象探索之旅? 【免费下载链接】crest Conformer-Rotamer Ensemble Sampling Tool based on the xtb Semiempirical Extended Tight-Binding Program Package 项目地址: https://gitcode.com/gh_mirrors/crest/crest 在…...
KMS_VL_ALL_AIO激活工具完全指南:从问题诊断到长效管理
KMS_VL_ALL_AIO激活工具完全指南:从问题诊断到长效管理 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 如何诊断Windows/Office激活失败的核心原因? 1.1 激活失败的三大…...
智慧生鲜配送:揭秘生鲜配送商城APP功能版块设计
在数字化消费浪潮中,生鲜配送商城APP成为居民采购食材的重要渠道。其功能版块设计聚焦用户需求,通过智能化、便捷化的操作体验,打造高效生鲜购物场景。以下揭秘其核心功能玩法,解析如何实现“从指尖到餐桌”的流畅服务。一、首页&…...
告别PCtoLCD2002!这款单片机调试助手如何用3步搞定OLED汉字显示?
3步解锁OLED汉字显示:新一代嵌入式开发神器实战指南 在嵌入式开发领域,OLED屏幕的汉字显示一直是让开发者头疼的难题。传统方案如PCtoLCD2002等取模软件不仅操作繁琐,生成的代码还需要大量手工调整。如今,一款名为单片机多功能调试…...
PowerBuilder老系统维护指南:PB12.5连接现代数据库(如MySQL 8.0)的避坑实操
PowerBuilder老系统维护实战:PB12.5连接MySQL 8.0的七个关键步骤 当技术栈的代际差异超过十年,每一次数据库连接尝试都可能演变成一场跨越时空的调试马拉松。那些在2006年运行良好的PB12.5应用,今天面对MySQL 8.0的SSL加密要求和UTF8MB4字符集…...
