Terminus(Olares)RabbitMQ 中间件集成实战:用 OlaresManifest.yaml 声明式接入消息队列

发布时间:2026/10/14 17:36:17

Terminus(Olares)RabbitMQ 中间件集成实战:用 OlaresManifest.yaml 声明式接入消息队列 云原生后端运维【免费下载链接】TerminusOpen-Source Personal Cloud OS for Always-On Agents项目地址https://gitcode.com/gh_mirrors/terminus2/Terminus点击查看免费下载本篇技术指南基于 Terminus 仓库中 RabbitMQ 集成文档 展开讲解如何在 Olares 上安装 RabbitMQ 服务、通过OlaresManifest.yaml声明式申请 RabbitMQ 用户与 vhost并把系统注入的.Values.rabbitmq.*值映射为容器环境变量。读完本篇你将掌握完整的接入步骤、RabbitMQ values 参考表并能从源码层面理解 Olares 是如何在部署时生成MiddlewareRequest、注入连接凭据并校验服务就绪状态的。前置条件与安装 RabbitMQ 服务在声明集成之前必须先让集群中实际存在一个可用的 RabbitMQ 实例。Olares 以 Market 应用的形式提供 RabbitMQ 服务安装方式如下从 Launchpad 打开 Market搜索 RabbitMQ。点击Get再点击Install等待安装完成。安装完成后该服务及其连接详情会出现在 Control Hub 的 Middleware 列表中。为什么这一步是硬性前置条件从源码结构看Olares 在应用部署前会校验所声明的中间件是否就绪validate.go 中当OlaresManifest.yaml声明了middleware.rabbitmq时平台会读取名为rabbitmq-middleware-rabbitmq的ApplicationManager资源只有其status.state为running才放行。若 RabbitMQ 服务未安装或仍在安装中依赖它的应用无法完成部署——这与 中间件总览 中集成是声明式的、由 Olares 在部署时处理的描述一致。此外若需要在安装后查看队列、交换机等资源可参考 查看与访问 RabbitMQ 数据 一文使用 RabbitMQ Dashboard 进行图形化管理。配置OlaresManifest.yaml在OlaresManifest.yaml的middleware下添加rabbitmq配置段username字段指定你期望的 RabbitMQ 用户名。vhosts字段申请一个或多个虚拟主机vhost每个 vhost 以name声明该名称将作为.Values.rabbitmq.vhosts中的 key。完整示例middleware: rabbitmq: username: rabbitmquser vhosts: - name: aaa源码视角这段声明最终变成了什么OlaresManifest.yaml中的middleware.rabbitmq对应 Go 类型RabbitMQConfig含Username、Password、VHosts等字段该类型定义在共享 manifest 包中并被 app-service 直接别名引用见 middleware_types.goRabbitMQConfig manifest.RabbitMQConfig VHost manifest.VHost部署时middleware.go 中的Apply函数处理middleware.RabbitMQ ! nil分支关键逻辑有三点用户名是拼装出来的最终注册到 RabbitMQ 的用户名并非你写的rabbitmquser原值而是按下述格式拼装的复合名用于在共享服务中隔离不同应用username : fmt.Sprintf(%s-%s-%s, middleware.RabbitMQ.Username, ownerName, appName)即manifest中username-属主名-应用名。你注入到环境变量的.Values.rabbitmq.username是拼装后的最终用户名应用无需关心拼装规则直接使用注入值即可。密码支持两种来源在 middleware.go 的 process 函数 中若password为空平台会先调用CreateOrUpdateSecret创建 Secret并在渲染MiddlewareRequest时改用secretKeyRef引用若直接给出password则明文写入请求对象。对应的 YAML 模板见 middleware_request_tpl.goconst rabbitmqRequest apiVersion: apr.bytetrade.io/v1alpha1 kind: MiddlewareRequest metadata: name: {{ .AppName }}-rabbitmq namespace: {{ .Namespace }} spec: app: {{ .AppName }} appNamespace: {{ .AppNamespace }} middleware: rabbitmq rabbitmq: vhosts: {{- range $k, $v : .Middleware.VHosts }} - name: {{ $v.Name }} {{- end }} password: {{- if not (eq .Middleware.Password ) }} value: {{ .Middleware.Password }} {{- else }} valueFrom: secretKeyRef: name: {{ .AppName }}-{{ .Namespace }}-rabbitmq-password key: password {{- end }} user: {{ .Middleware.Username }} 请求是幂等提交的genRabbitMQRequest渲染模板后由CreateOrUpdateMiddlewareRequest在集群中创建或更新该MiddlewareRequest资源middleware.go因此重复部署不会重复申请资源。模板渲染入口在 middleware_request_tpl.go 的 genRabbitMQRequest它把App、AppNamespace、Namespace和RabbitMQConfig含VHosts列表组装为渲染数据。平台侧注入流程从 MiddlewareRequest 到.Values.rabbitmq.*提交MiddlewareRequest后app-service 通过 HTTP 向中间件服务查询最终凭据。middleware.go 中getMiddlewareRequest函数向http://middleware-service.os-platform/middleware/v1/request/info发起 POST 请求携带App、AppNamespace、Namespace、Middleware: rabbitmq并对 404/429/5xx 做最多 3 次重试。请求体与响应结构同样定义在该文件type MiddlewareRequestResp struct { MiddlewareRequestInfo Host string json:host Port int32 json:port Vhosts map[string]string json:vhosts // ... }查询成功后结果被写入 Helm 渲染上下文vals[rabbitmq] map[string]interface{}{ host: resp.Host, port: resp.Port, username: resp.UserName, password: resp.Password, vhosts: resp.Vhosts, }这些 key 与你后续在部署 YAML 中引用的.Values.rabbitmq.*一一对应。Olares 的 Helm 渲染器也会为 chart 预置兜底结构values.go 中默认提供rabbitmq: map[string]interface{}{vhosts: map[string]interface{}{}}保证未声明 vhost 时模板渲染不会因缺失 key 而失败。将注入值映射为环境变量在你的部署 YAMLchart 模板中把.Values.rabbitmq.*映射到应用需要的环境变量。RabbitMQ 对应的完整映射示例如下containers: - name: my-app # For RabbitMQ, the corresponding values are as follows env: - name: RABBITMQ_HOST value: {{ .Values.rabbitmq.host }} - name: RABBITMQ_PORT value: {{ .Values.rabbitmq.port }} - name: RABBITMQ_USER value: {{ .Values.rabbitmq.username }} - name: RABBITMQ_PASSWORD value: {{ .Values.rabbitmq.password }} # Vhost # The vhost name configured in OlaresManifest (e.g., aaa) - name: RABBITMQ_VHOST value: {{ .Values.rabbitmq.vhosts.aaa }}几点说明RABBITMQ_HOST/RABBITMQ_PORT/RABBITMQ_USER/RABBITMQ_PASSWORD直接取自注入值的同名字段无需任何加工。vhost 是MapString,String结构key 就是你在OlaresManifest.yaml的vhosts[].name中声明的名称示例中为aaa。因此模板里写作.Values.rabbitmq.vhosts.aaa声明多个 vhost 时按各自 name 取对应 key。模板语法是 Helm/Go template 形式最终渲染发生在 Helm 部署阶段运行容器只看到渲染后的具体值。构造 RabbitMQ 连接 URI环境变量就绪后应用代码中读取它们并拼接 AMQP 连接串即可。原文档给出的 Go 示例// Read environment variables user : os.Getenv(RABBITMQ_USER) password : os.Getenv(RABBITMQ_PASSWORD) vhost : os.Getenv(RABBITMQ_VHOST) host : os.Getenv(RABBITMQ_HOST) portMQ : os.Getenv(RABBITMQ_PORT) // Construct AMQP connection string // Format: amqp://user:passwordhost:port/vhost url : fmt.Sprintf(amqp://%s:%s%s:%s/%s, user, password, host, portMQ, vhost)该格式为标准 AMQP URIamqp://user:passwordhost:port/vhost任何语言的 AMQP 客户端如amqp091-go、pika都可以直接以该 URL 建连。注意vhost位于 URI 路径段而不是 query 参数这也是 RabbitMQ 多租户隔离的基本单元——每个 vhost 下的队列、交换机、用户权限相互独立。RabbitMQ values 参考表RabbitMQ values 是部署时注入到values.yaml的预定义运行时值由系统管理、用户不可编辑ValueTypeDescription.Values.rabbitmq.hostStringRabbitMQ host.Values.rabbitmq.portNumberRabbitMQ port.Values.rabbitmq.usernameStringRabbitMQ username.Values.rabbitmq.passwordStringRabbitMQ password.Values.rabbitmq.vhostsMapString,StringRequested vhosts, keyed by vhost name. For example, a request formyvhostis available at.Values.rabbitmq.vhosts.myvhost.从源码结构看该表与 middleware.go 中写入 vals 的 map 完全一致host、port、username、password、vhosts五个字段即全部注入内容vhosts为按名称取值的 map。小结与延伸阅读集成 RabbitMQ 只需三步Market 安装 RabbitMQ 服务 → 在OlaresManifest.yaml声明middleware.rabbitmqusernamevhosts→ 在部署 YAML 中把.Values.rabbitmq.*映射为环境变量应用内按amqp://user:passwordhost:port/vhost建连。平台侧的MiddlewareRequest创建、凭据查询与注入均由 app-service 在部署时自动完成且以ApplicationManager的 running 状态作为就绪门禁开发者无需手写任何连接配置。更多中间件集成指南PostgreSQL、Redis、MongoDB、MinIO 等见 Olares 中间件总览访问与排查 RabbitMQ 资源见 查看与访问 RabbitMQ 数据。赞分享云原生后端运维【免费下载链接】TerminusOpen-Source Personal Cloud OS for Always-On Agents项目地址https://gitcode.com/gh_mirrors/terminus2/Terminus点击查看免费下载相关推荐TerminusOlaresPostgreSQL 中间件集成指南从 OlaresManifest.yaml 声明到应用连接信息注入TerminusOlaresPostgreSQL 中间件集成指南从 OlaresManifest.yaml 声明到应用连接信息注入 在 Terminus云原生后端运维Terminus 中集成 MariaDB 中间件通过 OlaresManifest.yaml 声明式接入应用数据库Terminus 中集成 MariaDB 中间件通过 OlaresManifest.yaml 声明式接入应用数据库 本文基于 Terminus 仓库中的官方文云原生后端运维在 OlaresTerminus中声明式接入 MinIO从 OlaresManifest.yaml 到容器环境变量映射在 OlaresTerminus中声明式接入 MinIO从 OlaresManifest.yaml 到容器环境变量映射 本篇基于 Terminus 仓库的云原生后端运维创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/14 17:36:17

九轴姿态解算实战:C语言实现Mahony互补滤波与四元数融合

简介:九轴姿态解算源代码是一套面向嵌入式开发、无人机及机器人等场景的C语言实现,融合加速度计、磁力计与陀螺仪数据,用于实时估计物体的横滚、俯仰与偏航角。资源包含4个文件,全部为2个C源文件和2个头文件,压缩包仅5…

2026/10/14 17:31:07

QSV硬编硬解参数实战:基于Intel Media SDK的转码优化与避坑指南

1. 为什么整理这份 QSV 参数清单 说到 Intel 硬编硬解,业内开口就是 QSV。这套以 Intel 核显和独立显卡上的专用媒体单元为核心的 SDK,能把 H.264 / HEVC 的编解码、分辨率缩放、色彩转换、降噪等重活从 CPU 上搬走,转码场景里比软编省电得多…

2026/10/14 23:00:49

AI论文高效筛选实战指南:信号词矩阵与三阶验证法

1. 这不是论文搬运工,而是一份“可执行”的AI研究导航图你点开arXiv首页,面对每天新增的300篇AI方向论文,第一反应是什么?是立刻点开标题看摘要,还是下意识滑到页面底部找“Submitted on”时间戳,再默默关掉…

2026/10/14 23:00:49

Scrapy爬虫实战:以百度搜索页为例的入门项目解析

1. 为什么拿百度搜索页当Scrapy入门练手:需求边界与预期管理 1.1 这个项目到底在爬什么 Scrapy 爬虫框架,新手接触它时最大的问题不是不知道它有多强,而是不知道用它做的第一个项目该长什么样。我见过不少人捧着一本爬虫书,把目录…

2026/10/14 23:00:49

参数越多越容易过拟合?Double Descent如何颠覆你的模型容量直觉

1. 经典机器学习里那个“常识”是怎么来的——从Bias-Variance到过拟合直觉不知道你有没有一种感觉:深度学习领域里流传着太多“反直觉”的结论,而其中最反直觉、也最常被拿出来讨论的,就是大模型明明参数多到能把训练集倒背如流,…

2026/10/14 23:00:49

2026论文降重工具实测盘点:从查重原理到AI改写正确用法

“2026权威盘点”这标题起得有点大,我其实不是权威,就是个被论文折磨过、也帮不少人改过论文的过来人。但我可以保证,下面写的每一句,都来自这几年跟查重系统、降重工具实打实搏斗出来的经验。2026年了,查重系统的算法…

2026/10/14 23:00:49

seaborn热力图实战:从入门到参数调优与案例详解

第一次真正意识到热力图的价值,是在处理一份几十列的业务报表的时候。表格里密密麻麻全是数字,我盯着相关性系数来回看,眼睛都快失焦了,还是说不清哪些变量之间有关联。后来用 seaborn.heatmap 把相关性矩阵画成一张图&#xff0c…

2026/10/14 22:55:28

Scikit-learn入门实践:鸢尾花分类模型构建全流程

1. 项目概述与思路拆解1.1 为什么用Scikit-learn开启机器学习我不止一次在社区里看到有人提问:学机器学习到底应该从框架开始,还是从数学推导开始?我的答案一直很明确——先跑通一个完整的模型,再回头补理论。Scikit-learn就是最适…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑