2019独角兽企业重金招聘Python工程师标准>>>

上周我们介绍了Harbor开源企业级容器Registry的架构,获得了社区很多朋友的反馈和建议,再次一并感谢,希望和大家一起,共同建设一个优秀的开源项目。本文请Harbor项目工程师尹文开介绍源码结构,帮助开发和运维人员理解代码的工作原理。

Harbor项目概览

容器应用的开发和运行离不开可靠的镜像管理。从安全和效率等方面考虑,在企业私有环境内部署的Registry服务是非常必要的。Harbor(https://github.com/vmware/harbor)是由VMware中国研发团队为企业用户设计的Registry Server开源项目,包括了权限管理(RBAC)、图形管理界面、LDAP/AD集成、审计、自我注册、HA等企业必需的功能,同时针对中国用户的特点,原生支持中文,并计划实现镜像复制(roadmap)等功能。

本文主要介绍Harbor项目的源码结构,帮助开发和运维人员理解其工作原理。

主要组件

Harbor系统由五个容器组成:Proxy、Core Services(包含UI, tokenservice和webhook)、Database、Registry和Log Collector。

Proxy提供反向代理服务,用户的不同请求由Proxy分发到后端的UI或者Registry。Harbor中使用的是官方的nginx镜像。
Core Services是Harbor项目的核心组件,主要提供权限管理、审计、管理界面UI、token service以及可供其他系统调用的API等功能。
Database提供数据持久化服务,采用了官方的mysql镜像。
Registry是Docker官方的开源的Registry镜像,主要提供镜像的存储和分发功能。
Log Collector负责收集其他容器的日志并进行日志轮转。

各个容器之间的关系如下图所示:

源码结构

以下所述主要为Core Services组件的源码结构,通过根目录下的Dockerfile可以构建出Core Services的镜像。另外Deploy目录下的db和log分别对应Database和Log Collector的Dockerfile镜像构建文件,而Nginx和Registry则都是采用的官方镜像。

| -- api (Harbor提供的外部调用的API)
| -- auth (认证模块,目前提供两种方式:数据库和LDAP)
| -- db (数据库认证)
| -- ldap (LDAP认证)
| -- controllers (控制器相关代码)
| -- dao (数据持久层)
| -- Deploy (部署相关代码)
| -- db (构建Database镜像的源码)
| -- log (构建Log Collector镜像的源码)
| -- docker-compose.yml (运行Harbor的docker compose文件)
| -- docs (文档)
| -- log (log工具)
| -- models (数据库映射的模型代码)
| -- routers (路由相关代码)
| -- service (服务)
| -- notification.go (处理Registry发来的镜像上传或下载等事件)
| -- token.go (为Registry提供鉴权服务)
| -- static (js、css等文件)
| -- utils (工具类)
| -- vendor (依赖的第三方源码)
| -- views (html模版文件)
| -- Dockerfile (构建Core Services镜像的Dockerfile)
| -- main.go (入口函数)

源码分析

下面以获取项目列表和获取某个项目的详细信息为例来分析Harbor源码。

Harbor项目使用了go语言开发,WEB框架采用beego。main.go、routers目录和controllers目录分别对应了入口函数、路由函数目录和控制器函数目录。当Core Services启动时,routers目录下的相应函数会将各个控制器与其所对应的用户请求URL进行注册,这样当不同的用户请求到达的时候,不同的控制器逻辑就会被触发。主要处理流程如下图所示:
当获取项目列表时会发送请求http://hostname/api/projects/,该请求首先到达Nginx。Nginx的配置文件如下:

server {
listen 80;

location / {
proxy_passhttp://ui/;

}

location /v1/ {
return 404;
}

location /v2/ {
proxy_passhttp://registry/v2/;

}

location/service/ {
proxy_passhttp://ui/service/;

}
}

根据配置文件该请求会被转发到http://ui/,也即Core Services中的UI。根据UI中routers/router.go中定义的规则:

beego.Router( "/api/projects/?:id",&api.ProjectAPI{} )

可知该请求最终是由api包中的ProjectAPI的Get方法来处理的。ProjectAPI结构体的定义如下:

typeProjectAPI struct {
BaseAPI
userID int
projectID int64
}

在beego中,控制器处理用户请求的方法执行之前首先会执行Prepare()方法来进行一些准备或者校验操作,ProjectAPI定义的Prepare()方法如下:

func(p *ProjectAPI) Prepare() {
p.userID = p.ValidateUser()

}

Prepare()中调用BaseAPI中的ValidateUser方法检查用户的合法性,并将用户ID赋值给ProjectAPI的userID属性。之后执行Get方法来处理用户的请求:

func(p *ProjectAPI) Get() {
queryProject :=models.Project{UserID: p.userID}

projectList, err :=dao.QueryProject(queryProject)

for i := 0; i < len(projectList); i++{
if isProjectAdmin(p.userID,projectList[i].ProjectID) {
projectList[i].Togglable= true
}
}
p.Data["json"] = projectList
p.ServeJSON()
}

Get方法中调用dao包中的QueryProject()方法来获取项目列表,之后遍历列表判断该用户是否对此项目具有administrator的权限,最终返回项目列表的JSON数据,此次用户请求处理完毕。

当获取某个项目的详细信息时会发送请求http://hostname/registry/detail,该请求同样会经过Nginx和Router并最终到达其对应的Controller的处理方法如下:

func (idc *ItemDetailController) Get() {
//具体处理逻辑

idc.ForwardTo("page_title_item_details","item-detail")
}

具体的处理逻辑此处忽略。该方法的最后一步调用idc.ForwardTo(“page_title_item_details”,”item-detail”)定位对应的HTML模版文件。模版文件默认的存放目录为views,“item-detail”为模板文件名,因此该语句最终定位到views/item-detail.tpl的文件。经过数据填充最终生成对应的HTML文件并返回。

欢迎广大用户使用Harbor项目并反馈意见和建议,也欢迎加入我们贡献代码。如果您是Harbor的用户或开发者,请长按下面二维码加入Harbor开源项目群,以方便沟通。Github网址:
https://github.com/vmware/harbor

转载于:https://my.oschina.net/vmwareharbor/blog/656603

开源Registry项目Harbor源代码结构解析相关推荐

  1. 前端学习(2161):vuecli项目得目录结构解析

  2. CNCF 首个中国开源项目Harbor是如何炼成的?

    题图摄于加州蒙特雷 感谢 InfoQ 万佳 编辑的采访, 本文经授权转载,增加了配图. 相关信息:招聘云原生工程师 "天南地北侃技术,自娱自乐于互联网的缝隙中",这是公众号亨利笔记 ...

  3. A005-AS项目结构解析

    我们先来看1: 我们创建Application的时候,要求我们输入项目名称,1就是我们创建的项目,AndroidDevelopCourse是项目名称,在实际开发中,我们要为我们项目取一个能明确表达产品 ...

  4. 开源软件项目的定性和定量分析指标 ———— CHAOSS 指标解析

    点击蓝字关注我们 "科学管理在实质上要求任何一个具体机构或机构中的工人及管理人员进行一场全面的心理革命,没有这样的心理革命,科学管理就不存在."  ---- 泰勒 <科学管理 ...

  5. 张海宁:首个 CNCF 中国开源项目 Harbor 的修炼之道

    「WeOpen Talk」是腾源会全新上线的「对话开源」内容专栏,每周为读者呈现一期与尖峰开源人物的精彩对话内容.在「WeOpen Talk」栏目中,我们将深刻诠释开源先锋者们的开源精神.开源理念及其 ...

  6. java开源springboot项目_springBoot 搭建web项目(前后端分离,附项目源代码地址)...

    概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端分离,利用ajax交互. springBoot-example-ui 注意 ...

  7. C++开源代码项目汇总

    Google的C++开源代码项目 v8  -  V8 JavaScript Engine V8 是 Google 的开源 JavaScript 引擎. V8 采用 C++ 编写,可在谷歌浏览器(来自 ...

  8. 最新C#开源资源项目

    一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...

  9. github 开源android项目

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

最新文章

  1. spring+quartz定时任务配置---MethodInvokingJobDetailFactoryBean
  2. Google邮局可以实时开通了
  3. SUSE团队已将重心偏向GCC 7
  4. 服务器测试网址填写注意事项
  5. ExtJS4.2 menu鼠标移开隐藏
  6. JAVA连接Mysql事例
  7. 【英语学习】【English L06】U07 Jobs L4 What do you think of our service?
  8. mysql用户权限重置_mysql中重置密码与新用户权限分配的方法介绍
  9. Appium 基础教程
  10. 台式电脑怎么调分辨率_电脑屏幕分辨率调节方法
  11. python返回值return用法_Python中return函数返回值代码实例用法
  12. 运行期间动态切换Redis数据库
  13. C++ QT有道翻译 爬虫 分析 破解
  14. [我所知道的BIOS]-[Jumpless] 4
  15. 基于盲盒商城的飞机大战游戏
  16. 详细了解JS Map,它和传统对象有什么区别?
  17. piaget读法_罗读音【罗读音英语头条】- 罗读音知识点 - 中企动力
  18. 微信小程序 地图map组件 SDK 并 实现导航
  19. 我们有理由相信,中国将进入一个全面的刷脸支付新时代
  20. 浩方电竞平台显示登录服务器失败,浩方电竞平台安装步骤及常见问题

热门文章

  1. php改变iframe的src,js动态改变iframe的src属性
  2. 云南大学计算机网络期中考试刘春花,实验九基于CRC编码的检错程序的实现.doc...
  3. fpga初始化错误_FPGA低温启动失败
  4. oracle截取时间函数6,SQL 取日期部分函数
  5. android设置输入框输入字符限制,Android EditText限制输入字符的方法总结
  6. (扩展欧几里德算法)zzuoj 10402: C.机器人
  7. outlook反应慢的原因_保险管怎么区分慢熔和快熔?
  8. Linux基础(firewalld防火墙配置管理工具的图形用户界面)
  9. teamviewer类似软件_TeamViewer系统后台被黑客组织APT攻破,请注意防范
  10. python 类静态属性_如何从Python中的类中引用静态属性?