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.…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...