以下是针对 Nexus 3(通用制品库)和 Harbor(容器镜像制品库)的核心模块源码阅读指南,聚焦工程效能研发关注的「仓库管理、版本控制、权限隔离、CI/CD 集成」四大核心能力,帮你快速定位关键设计的实现位置,理解底层逻辑。
一、前置准备
1. 源码下载
| 制品库 | 源码仓库地址 | 技术栈 | 核心模块语言 |
|---|---|---|---|
| Nexus 3 | https://github.com/sonatype/nexus-public | Java + Groovy + OSGi | Java |
| Harbor | https://github.com/goharbor/harbor | Go + Vue.js + Docker | Go |
2. 本地运行(可选)
- Nexus 3:需 JDK 11+、Maven 3.6+,执行
mvn clean install -DskipTests编译,通过./nexus run启动; - Harbor:需 Go 1.20+、Docker Compose,执行
make compile编译,通过docker-compose up启动。
二、Nexus 3 核心模块源码阅读指南
Nexus 3 采用 OSGi 模块化架构,核心能力分散在 nexus-core、nexus-repository-* 等模块,重点关注以下路径:
| 核心能力 | 源码路径 | 关键类/配置 | 核心逻辑解读 |
|---|---|---|---|
| 仓库类型管理 | nexus-repository-core/src/main/java/org/sonatype/nexus/repository/ |
- Repository.java:仓库核心模型(定义本地/代理/聚合仓库)- RepositoryType.java:仓库类型枚举- GroupRepositoryImpl.java:聚合仓库实现 |
1. 聚合仓库通过 GroupFacet 聚合多个仓库的请求,按优先级转发拉取请求;2. 代理仓库通过 ProxyFacet 缓存公共仓库制品,实现「首次拉取缓存、后续直接返回」。 |
| 版本生命周期管理 | nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/ |
- MavenMetadataFacet.java:Maven 制品元数据(版本信息)管理- SnapshotHandler.java:快照版本自动覆盖逻辑- VersionPolicy.java:语义化版本校验规则 |
1. 快照版本通过 SNAPSHOT 后缀识别,上传时自动生成时间戳版本(如 1.0.0-20251224.080000-1);2. 版本淘汰通过 CleanupPolicy 配置,定时清理符合规则的旧版本。 |
| 权限隔离 | nexus-core/src/main/java/org/sonatype/nexus/security/ |
- RBACAuthorizationManager.java:RBAC 权限模型实现- RepositoryPermission.java:仓库级权限定义- TenantManager.java:多租户隔离逻辑 |
1. 权限粒度分为「仓库级(如仓库只读)」「操作级(如制品上传)」; 2. 多租户通过 TenantIdentity 隔离数据,租户ID 关联仓库所属组织。 |
| CI/CD 集成 | nexus-rest-api/src/main/java/org/sonatype/nexus/rest/ |
- RepositoryResource.java:仓库操作 REST API- ArtifactResource.java:制品上传/下载 API- EventBus.java:制品上传后触发事件(如通知 CI/CD 系统) |
1. CI 工具通过 REST API(/service/rest/v1/components)上传制品;2. 制品上传后触发 ArtifactCreatedEvent,可扩展对接部署流程。 |
| 存储层设计 | nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/ |
- BlobStore.java:存储抽象(支持文件系统/对象存储)- FileBlobStore.java:本地文件存储实现- S3BlobStore.java:S3 对象存储适配 |
1. 制品内容(Blob)与元数据分离存储,元数据存在数据库,Blob 存在文件/对象存储; 2. Blob 按 仓库ID/制品路径 哈希分目录存储,避免单目录文件过多。 |
快速阅读路径(优先级)
- 先看
Repository.java理解仓库核心模型 → 再看GroupRepositoryImpl.java理解聚合仓库逻辑; - 再看
MavenMetadataFacet.java掌握版本管理核心 → 最后看BlobStore.java理解存储底层。
三、Harbor 核心模块源码阅读指南
Harbor 聚焦容器镜像管理,核心逻辑在 server 模块(Go 编写),重点关注以下路径:
| 核心能力 | 源码路径 | 关键文件/函数 | 核心逻辑解读 |
|---|---|---|---|
| 镜像仓库管理 | server/core/api/repository.go server/core/service/repository.go |
- ListRepositories():仓库列表查询- CreateRepository():仓库创建- RepositoryController:仓库 HTTP 接口 |
1. 镜像仓库按 项目/镜像名 分层,支持私有/公有仓库;2. 代理仓库(Proxy Cache)通过 remote_url 配置,缓存拉取的外部镜像。 |
| 镜像版本(Tag)管理 | server/core/api/tag.go server/core/service/tag.go |
- ListTags():镜像 Tag 列表- DeleteTag():Tag 删除- RetentionPolicy:镜像清理策略 |
1. Tag 支持语义化版本/自定义标签,通过 digest 唯一标识镜像内容;2. 清理策略支持按「Tag 规则、镜像创建时间、下载次数」自动删除旧镜像。 |
| 权限与多租户 | server/core/auth/ server/core/service/permission.go |
- rbac.go:RBAC 权限模型- project.go:项目级隔离(租户)- CheckPermission():权限校验 |
1. 按「项目」隔离租户,项目内分「管理员/开发者/访客」角色; 2. 镜像拉取/推送权限绑定到项目角色,支持细粒度控制。 |
| CI/CD 集成 | server/core/api/artifact.go server/webhook/ |
- PushArtifact():镜像推送接口- webhook.go:镜像推送后触发 WebHook- event.go:事件通知(如镜像上传完成) |
1. Docker 客户端通过 Docker Registry API(/v2/)推送镜像;2. 镜像上传完成后触发 push 事件,WebHook 可对接 Kubernetes 部署。 |
| 存储层设计 | server/storage/ vendor/github.com/docker/distribution/registry/storage/ |
- storage_driver.go:存储驱动(支持本地/OSS/S3)- layer_store.go:镜像分层存储 |
1. 镜像采用分层存储(Layer),相同层复用,减少存储占用; 2. 存储驱动适配不同存储介质,元数据存在 PostgreSQL,镜像层存在对象存储。 |
快速阅读路径(优先级)
- 先看
repository.go理解镜像仓库模型 → 再看tag.go掌握 Tag 管理; - 再看
rbac.go理解权限隔离 → 最后看webhook.go掌握 CI/CD 联动逻辑。
四、阅读技巧(高效避坑)
- 先抓核心,跳过细节:优先看「接口定义、核心结构体、关键函数」,跳过日志、异常处理等辅助代码;
- 结合功能测试:边看源码边在本地部署制品库,操作「创建仓库、上传制品、删除版本」,对应跟踪源码执行流程;
- 聚焦工程效能场景:重点关注「API 设计、自动化集成、权限控制」,暂时跳过「前端 UI、监控告警」等非核心模块;
- 对比阅读:Nexus 侧重多类型制品,Harbor 侧重容器镜像,对比两者的「版本管理、存储设计」差异,理解不同场景的设计取舍。
五、常见问题定位(附源码路径)
| 问题场景 | Nexus 3 源码位置 | Harbor 源码位置 |
|---|---|---|
| 制品上传失败 | nexus-repository-core/src/main/java/.../UploadHandler.java |
server/core/api/artifact.go → PushArtifact() |
| 版本校验不通过 | nexus-repository-maven/src/main/java/.../VersionPolicy.java |
server/core/service/tag.go → ValidateTag() |
| 权限拒绝访问 | nexus-core/src/main/java/.../RBACAuthorizationManager.java |
server/core/auth/rbac.go → CheckPermission() |
| 大文件上传慢 | nexus-blobstore/src/main/java/.../ChunkedBlobStore.java |
server/storage/layer_store.go → UploadLayer() |
如果需要针对某一个具体能力(比如「聚合仓库的请求转发逻辑」「镜像分层存储实现」)做更深入的源码解读,可以告诉我,我会补充对应的代码片段和逻辑分析。