7. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--路由
路由是API网关的核心功能,对系统性能和可靠性至关重要。路由通过定义规则,将客户端请求准确地转发到相应的后端服务,确保请求能够正确处理,简化了微服务架构中的服务调用逻辑。有效的路由配置能够提高系统的灵活性和可维护性。
一、路由配置
1.1 路由基础
在Ocelot中,路由是将上游客户端请求映射到下游服务的一种机制。通过配置路由,Ocelot可以根据特定的规则,将客户端的请求转发到相应的后端服务。路由的定义是Ocelot的核心功能之一,它确保了请求能够被正确处理和响应。
-
路由的基本组成部分
一个Ocelot路由通常由以下几个关键部分组成:- 上游路径模板(Upstream Path Template):这是客户端请求的路径。Ocelot根据这个路径匹配客户端的请求,并决定是否进行路由。例如,
/users表示所有请求https://gateway.com/users的客户端请求将被匹配。- 下游路径模板(Downstream Path Template):这是后端服务的路径。Ocelot将客户端请求转发到这个路径。例如,
/api/users表示请求将被转发到http://backend.com/api/users。 - 下游主机和端口(Downstream Host And Ports):这是后端服务的主机名和端口号。Ocelot将请求转发到指定的主机和端口。例如,
Host: "localhost", Port: 5001表示请求将被转发到localhost:5001。 - 上游HTTP方法(Upstream Http Method):指定允许的HTTP方法(如GET、POST等)。Ocelot会根据请求的方法匹配路由规则。例如,
["GET"]表示只允许GET请求匹配该路由。
- 下游路径模板(Downstream Path Template):这是后端服务的路径。Ocelot将客户端请求转发到这个路径。例如,
- 上游路径模板(Upstream Path Template):这是客户端请求的路径。Ocelot根据这个路径匹配客户端的请求,并决定是否进行路由。例如,
-
路由参数的使用
Ocelot支持在路径中使用参数,从而实现动态路由。路径参数使用大括号{}包裹,例如,/users/{userId}可以匹配/users/123或/users/abc,其中userId为路径参数。
1.2 上游路径与下游路径
在Ocelot中,上游路径(Upstream Path)和下游路径(Downstream Path)是定义路由规则的两个重要组成部分。它们在API网关的请求转发过程中起着关键作用。了解这两个概念有助于更好地配置和使用Ocelot。
- 上游路径(Upstream Path)
上游路径是指客户端发送请求时使用的路径,是Ocelot用于匹配和识别请求的关键字段。上游路径通常与客户端应用程序的URL结构相关联,通过定义上游路径,Ocelot可以确定哪些请求应该被路由到特定的后端服务。
上游路径使用UpstreamPathTemplate字段进行配置。它支持路径参数和静态路径。路径参数使用大括号{}包裹,表示可以匹配动态值。例如:
这个配置表示上游路径可以匹配诸如"UpstreamPathTemplate": "/users/{userId}"/users/123或/users/abc等请求,其中userId是动态值。这种动态路径匹配使得Ocelot能够处理多种复杂的请求场景。 - 下游路径(Downstream Path)
下游路径是指Ocelot将请求转发到后端服务时使用的路径。它定义了实际服务端点的路径结构。Ocelot通过下游路径将上游请求映射到具体的后端服务,实现请求的转发和处理。
下游路径使用DownstreamPathTemplate字段进行配置。与上游路径类似,它也支持路径参数和静态路径。路径参数可以与上游路径中的参数对应,以便在请求转发时传递动态值。例如:
这个配置表示Ocelot会将请求转发到后端服务的"DownstreamPathTemplate": "/api/products/{productId}"/api/products/{productId}路径,其中productId是从上游路径中提取的动态值。 - 上游路径与下游路径的关系
上游路径和下游路径之间的关系是通过路径参数进行映射的。当Ocelot接收到一个上游请求时,它会根据上游路径模板进行匹配,并提取路径参数的值。然后,这些参数值将被用于构建下游路径,从而实现请求的转发。
1.3 路由参数的使用
路由参数是路径模板中的占位符,用于匹配和提取请求路径中的动态部分。路径参数使用大括号{}包裹,如{parameterName}。在Ocelot中,路由参数可以出现在上游路径模板和下游路径模板中,用于实现动态路由和请求转发。
Ocelot也支持在路径模板中使用多个路由参数。例如:
"UpstreamPathTemplate": "/users/{userId}/orders/{orderId}"
"DownstreamPathTemplate": "/api/users/{userId}/orders/{orderId}"
这个配置表示,上游路径可以匹配诸如/users/123/orders/456的请求,并将userId和orderId参数值传递到下游路径中。
-
可选路由参数
在某些情况下,路径参数可能是可选的,Ocelot支持使用问号?表示可选参数。例如:"UpstreamPathTemplate": "/products/{productId?}"这个配置表示,上游路径可以匹配
/products和/products/123的请求,其中productId是可选参数。 -
包含默认值的路由参数
Ocelot还支持为路由参数指定默认值。例如:"UpstreamPathTemplate": "/orders/{orderId=defaultOrderId}"这个配置表示,如果请求路径中没有提供
orderId参数,将使用默认值defaultOrderId。 -
正则表达式路由参数
为了更精确地匹配路径参数,Ocelot支持在路径参数中使用正则表达式。例如:"UpstreamPathTemplate": "/products/{productId:regex(^\\d+$)}"这个配置表示,
productId参数必须是一个或多个数字,否则请求将不匹配该路径模板。 -
动态API版本控制
路由参数可以用于实现动态的API版本控制。例如:"UpstreamPathTemplate": "/api/v{version}/products/{productId}" "DownstreamPathTemplate": "/api/v{version}/products/{productId}"这个配置表示,上游路径可以匹配诸如
/api/v1/products/123和/api/v2/products/456的请求,并将version和productId参数值传递到下游路径中,实现不同版本API的路由。 -
多语言支持
路由参数还可以用于实现多语言支持。例如:"UpstreamPathTemplate": "/{lang}/products/{productId}" "DownstreamPathTemplate": "/api/{lang}/products/{productId}"这个配置表示,上游路径可以匹配诸如
/en/products/123和/fr/products/456的请求,并将lang和productId参数值传递到下游路径中,实现不同语言的请求路由。
1.4 示例配置解析
以下是常见的路由配置示例:
{"Routes": [{"DownstreamPathTemplate": "/api/v{version}/products/{productId?}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 7000}],"UpstreamPathTemplate": "/{lang}/v{version}/products/{productId:regex(^\\d+$)=defaultProductId}","UpstreamHttpMethod": [ "GET" ]}],"GlobalConfiguration": {"BaseUrl": "https://api.example.com"}
}
在这个配置中,Routes节点包含了一个路由配置,定义了从上游请求到下游服务的映射规则。DownstreamPathTemplate字段定义了下游服务的路径模板,其中{version}表示API版本参数,{productId?}表示可选的路径参数,如果未提供productId则下游路径为/api/v{version}/products。DownstreamScheme字段定义了下游服务使用的协议,在这个示例中,下游服务使用HTTP协议。DownstreamHostAndPorts字段定义了下游服务的主机名和端口号,下游请求将会被转发到指定的主机和端口,在这个示例中,下游服务运行在localhost的7000端口。
UpstreamPathTemplate字段定义了上游请求的路径模板,其中{lang}表示语言参数,{version}表示API版本参数,{productId:regex(^\\d+$)=defaultProductId}表示路径参数,必须是数字,如果未提供则使用默认值defaultProductId。例如,请求路径/en/v1/products/123将会匹配这个模板,并将参数值传递到下游路径中。
UpstreamHttpMethod字段定义了允许的上游HTTP方法,在这个示例中,路由只允许GET方法的请求。GlobalConfiguration节点包含了全局配置,适用于所有路由,其中,BaseUrl字段定义了API网关的基础URL,客户端将通过这个URL访问API网关,在这个示例中,API网关运行在https://api.example.com。
假设客户端发送一个GET请求到https://api.example.com/en/v1/products/123,Ocelot将会执行以下操作:首先,根据UpstreamPathTemplate和UpstreamHttpMethod匹配上游请求路径和方法,然后提取路径参数version的值v1,lang的值en,productId的值123。接着根据DownstreamPathTemplate构建下游请求路径/api/v1/products/123,再根据DownstreamScheme、DownstreamHostAndPorts构建下游请求URLhttp://localhost:7000/api/v1/products/123,最后将上游请求转发到下游服务,并返回下游服务的响应给客户端。通过这种方式,Ocelot实现了请求的灵活路由和转发,确保客户端请求能够被正确处理和响应。高级服务路由配置极大地增强了API网关的功能性和灵活性,理解和掌握这些配置方法,是高效使用Ocelot的关键。
二、总结
路由是API网关的核心功能,通过定义规则将客户端请求准确地转发到相应的后端服务,确保请求的正确处理,简化了微服务架构中的服务调用逻辑。Ocelot中的路由配置包括上游路径模板和下游路径模板,并支持路径参数、可选参数、默认值、正则表达式、动态API版本控制和多语言支持等高级功能,提升了系统的灵活性和可维护性。
相关文章:
7. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Ocelot 网关--路由
路由是API网关的核心功能,对系统性能和可靠性至关重要。路由通过定义规则,将客户端请求准确地转发到相应的后端服务,确保请求能够正确处理,简化了微服务架构中的服务调用逻辑。有效的路由配置能够提高系统的灵活性和可维护性。 一…...
【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵
GESP二级模拟题,多层循环、分支语句练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题,多层循环、分…...
监督学习——基于线性回归的波士顿房价预测:理论、实践与评估
基于线性回归的波士顿房价预测:理论、实践与评估 文章目录 基于线性回归的波士顿房价预测:理论、实践与评估一、引言二、线性回归基础理论2.1 线性回归原理2.2 线性回归在房价预测中的应用逻辑三、波士顿房价数据集介绍3.1 数据集概述3.2 特征说明3.3 目标变量四、波士顿房价…...
Selenium 调用模型接口实现功能测试
要使用 Selenium 调用模型接口实现功能测试,可按以下步骤进行: 1. 环境准备 安装 Selenium:使用 pip install selenium 安装 Selenium 库。安装浏览器驱动:根据使用的浏览器(如 Chrome、Firefox 等)下载对应的驱动,并将其添加到系统的环境变量中。例如,Chrome 浏览器需…...
回调函数的用法
回调函数的基本用法 回调函数是一种被作为参数传递给另一个函数的函数,接收回调函数作为参数的函数在合适的时候会调用这个回调函数。回调函数为代码提供了更高的灵活性和可扩展性,下面为你详细介绍回调函数的基本用法。 基本概念 回调函数的核心在于函…...
springboot实现文件上传到华为云的obs
一、前言 有时在项目中需要使用一些存储系统来存储文件,那么当项目要接入obs作为存储系统时,就会利用obs来进行文件的上传下载,具体实现如下。 二、如何通过obs实现文件的上传下载? 1.添加相关的obs的maven依赖。 <dependency…...
南京布局产业园剖析:成都树莓集团的战略逻辑
在数字产业飞速发展的当下,成都树莓集团在南京布局产业园,这一举措蕴含着深刻的战略考量,是基于对市场环境、产业趋势以及自身发展需求的综合研判。 一、政策利好与发展机遇 南京作为长三角地区的重要城市,在数字经济发展方面享有…...
C++ QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法
C QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法 记录一下 qmake .pro文件的配置 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compil…...
【算法】哈希表详解
【算法】哈希表详解 1. 哈希表的基本概念2. 哈希表的优缺点3. 哈希表的实现方法4. 哈希表的应用场景5. 哈希表的性能优化6. 哈希表 vs 其他数据结构7. 总结 哈希表(Hash Table) 是一种高效的数据结构,用于存储键值对(Key-Value Pa…...
【红队利器】单文件一键结束火绒6.0
关于我们 4SecNet 团队专注于网络安全攻防研究,目前团队成员分布在国内多家顶级安全厂商的核心部门,包括安全研究领域、攻防实验室等,汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…...
Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏
Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署star-battle网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问star-battle网页小游戏五、总…...
【EB-06】SystemCreator dbc转arxml
SystemCreator dbc转arxml 1. SystemCreator 意义2. SystemCreator使用方法2.1 实现步骤2.2 参考官方文档方法1. SystemCreator 意义 EB Tresos 对dbc直接导入的支持不是很完善,dbc也不是AUTOSAR标准的数据库文件,EB建议所有通信矩阵通过ARXML交互比较合理(AUTOSAR定义的)…...
(0)阿里云大模型ACP-考试回忆
这两天通过了阿里云大模型ACP考试,由于之前在网上没有找到真题,导致第一次考试没有过,后面又重新学习了一遍文档才顺利通过考试,这两次考试内容感觉考试题目90%内容是覆盖的,后面准备分享一下每一章的考题,…...
按键精灵鹰眼中控:ios多设备管理工具
在当今数字化时代,高效管理多设备已成为许多企业和个人的迫切需求。无论是游戏多开、自动化测试,还是电商运营,如何同时操作多台设备并确保精准执行,一直是一个难题。现在,按键精灵的鹰眼群控功能为您提供了完美的解决…...
__对于初学者的CCS 汉化
IDE:Code Composer Studio 20.0.2 CCS安装后默认是英文,目前最新的20版其Help工具栏是没有安装软件包的选项。不过,想要汉化还有更简单的方法 安装插件 在左边找到扩展,然后在框内搜索Chinese,可以找到两个语言插件&am…...
JavaScript 系列之:Ajax、Promise、Axios
前言 同步:会阻塞。同步代码按照编写的顺序逐行依次执行,只有当前的任务完成后,才会执行下一个任务。 异步:异步代码不会阻塞后续代码的执行。当遇到异步操作时,JavaScript 会将该操作放入任务队列中,继续…...
Vidma Ver.2.14.0 高级版
Vidma Ver.2.14.0 高级版 Vidma 是一款易于使用的视频编辑器,提供多种音乐和流行视频效果选择,让您的视频在社交媒体上脱颖而出。您可以通过添加 swooshing 文本、流行效果、复古滤镜、精美贴纸、平滑过渡等等,轻松地从您的宝贵时刻创建有意…...
Redis Lua Script 溢出漏洞(CVE-2024-31449)
目录 漏洞描述 目前受影响的Redis版本: 安全版本 解决建议 升级Redis版本 查看旧redis版本信息 备份Redis数据 1.查看目前redis的key 2.备份数据 3.查看备份文件地址 4.将旧Redis安装目录备份 安装新版本Redis 1.下载redis安装包 2.安装redis 3.启动…...
【Mysql】我在广州学Mysql 系列—— 性能优化相关例题
ℹ️大家好,我是练小杰,时间过得真快,还有2天,2025年2月份就结束了!!😆 本文是针对Mysql数据库中有关性能优化的相关示例,通过本文的学习可以深入了解性能优化的各类命令!…...
java23种设计模式-中介者模式
中介者模式(Mediator Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
