GitLab Workhorse
GitLab Workhorse 是 GitLab 的智能反向代理,旨在处理资源密集型和长时间运行的请求。
它位于 Puma 之前,拦截所有发往和来自 GitLab Rails 的 HTTP 请求。
Rails 将请求委托给 Workhorse,Workhorse 负责处理资源密集型的 HTTP 请求,例如文件下载和上传、HTTP 上的 git 推送/拉取以及 HTTP 上的 git 归档下载,从而优化资源利用并提高请求处理效率。
在 GitLab 架构中的角色
Workhorse 前面可以有其他反向代理服务器,但只支持 NGINX。
从源码安装 GitLab 时,也可以使用其他反向代理(如 Apache),但这不受支持。
在许多 GitLab 实例中,例如 gitlab.com,NGINX 前面会有像 CloudFlare 这样的 CDN。
每个 Rails 控制器和其他处理 HTTP 请求并返回 HTTP 响应的代码都通过 GitLab Workhorse 进行代理。 Workhorse 与其他反向代理不同,它与 GitLab Rails 紧密耦合,而大多数反向代理更为通用。 必要时,Workhorse 会修改 HTTP 头部,GitLab Rails 依赖这些头部来高效地卸载工作。
功能和操作
请求处理
- Workhorse 主要作为传入请求的传递实体,将它们转发给 Rails 进行处理。 本质上,它对大多数请求进行最少的干预,从而保持简化的请求处理管道。
- 对于特定类型的请求,特别是那些资源密集型或需要专门处理的请求(例如大文件上传),Workhorse 扮演更积极的角色。 收到 Rails 的指令后,Workhorse 执行专门的任务,例如直接与 Gitaly 交互或从 Rails 卸载文件上传处理。
专门任务处理
- Workhorse 能够根据 Rails 的响应拦截某些请求并执行预定义操作。 这包括与 Gitaly 交互、管理大型数据 blob 以及根据需要更改请求处理逻辑。
- Workhorse 可以高效地管理文件上传。 它可以劫持文件上传过程,执行 Rails 指定的必要操作(例如临时存储文件或将其上传到对象存储),并在完成后更新 Rails。
与 Rails API 的集成
Workhorse 充当 Rails API 的代理,特别是在需要与容器注册表服务交互的场景中。 这种设置通过作为反向代理来展示 Workhorse 处理高负载服务的方式,从而最小化对 Rails 的直接负载。
架构考虑
扩展功能
- 保持简洁:在扩展 Workhorse 的功能以包括直接处理特定服务(例如容器注册表)时,保持其简洁性和效率至关重要。 Workhorse 不应包含复杂的控制逻辑,而应专注于执行 Rails 指定的任务。
- 服务实现和数据迁移:在 Workhorse 中实现新功能需要仔细考虑数据迁移策略和服务连续性。
数据管理和运营完整性
- Workhorse 的架构支持高效的数据管理策略,包括垃圾收集和数据迁移。 Workhorse 的角色是支持高性能操作,而不直接涉及复杂的数据操作或控制逻辑,这些仍然是 Rails 的职责范围。
- 对于需要后台处理或长时间运行的任务的操作,建议使用独立的服务或 Sidekiq 作业队列,由 Workhorse 和 Rails 协调管理任务执行和数据完整性。
Workhorse 位于 Rails 单体仓库的子文件夹中,位于 gitlab-org/gitlab/workhorse。
学习资源
- Workhorse 文档(本页)
- 视频:GitLab Workhorse 深入解析:依赖代理
- Workhorse 如何与依赖代理协作
- 依赖代理的 Workhorse 概述
- Workhorse 架构讨论
安装 Workhorse
安装 GitLab Workhorse 需要 Go 1.18 或更高版本 和 GNU Make。
要安装到 /usr/local/bin,请运行 make install。
make install要安装到 /foo/bin,请设置 PREFIX 变量。
make install PREFIX=/foo在某些操作系统上,例如 FreeBSD,你可能需要使用 gmake 而不是 make。
注意:某些功能依赖于构建标签,请务必查看 Workhorse 配置 以启用它们。
运行时依赖
Workhorse 使用 ExifTool 来移除上传图片中的 EXIF 数据(可能包含敏感信息)。如果你安装了 GitLab:
- 使用 Linux 包安装,你就准备好了。
如果你使用的是 CentOS Minimal,可能需要安装
perl包:yum install perl。 - 从源码安装,确保安装了
exiftool:
# Debian/Ubuntu
sudo apt-get install libimage-exiftool-perl
# RHEL/CentOS
sudo yum install perl-Image-ExifTool测试你的代码
使用以下命令运行测试:
make clean testGitLab Workhorse 中的每个功能都应该有一个集成测试,验证该功能在正确的请求上"启动"并且不影响其他请求。最好也有针对特定行为的包级测试,但在开发过程中,高级集成测试应具有最高优先级。
如果一个功能只被集成测试覆盖,也是可以的。