开源Registry项目Harbor源代码结构解析

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

上周我们介绍了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负责收集其他容器的日志并进行日志轮转。

各个容器之间的关系如下图所示:
123008_8pL6_2688330.jpg

源码结构

以下所述主要为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进行注册,这样当不同的用户请求到达的时候,不同的控制器逻辑就会被触发。主要处理流程如下图所示:
123023_MLTh_2688330.jpg当获取项目列表时会发送请求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
123038_XynF_2688330.jpg


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php curl 关闭tcp连接,BASH CURL:顺序运行时,请勿关闭请求之间的连接

我正在尝试编写一个BASH命令,该命令使用CURL将GET请求发送到两个不同的网页,但使用相同的连接.对我来说,就像向登录页面发送GET请求以向服务器进行身份验证,然后第二个请求模仿自动重定向到主页,这将发生在Web浏览器中(通过元刷新标记).我需要链接请求,因为主页的内容(由服务器…

苹果怎么关闭系统自动更新_你经过我的同意了吗?论手机系统自动更新

说起手机系统的更新&#xff0c;相信大致是有两个党派&#xff0c;一个是有出必追&#xff0c;第一时间更新到最新系统&#xff0c;体验新特性&#xff0c;修复已知BUG&#xff0c;二就是保守派&#xff0c;认为买来时自带的系统版本即是最好用的&#xff0c;不喜升级&#xff…

mysql手动安装配置,mysql8.0.11 winx64手动安装配置教程

首先跟大家唠一唠家常&#xff0c;随着MySQL迅速的更新&#xff0c;MySQL突飞猛进已经更新到了8.0版本&#xff0c;那么它和我们之前用的5.X版本有什么明显的区别那?首先给大家看下MySQL5.X自带表的查询速度之后献上MySQL8.0的自带表的查询速度一样的数据结果显而易见&#xf…

苹果照片未删却不见了_iPhone手机照片不见的解决方法

遇到iPhone手机中的照片不见了这种问题&#xff0c;相信大家都很着急&#xff01;不过着急也没用&#xff0c;照片也不会自己回来&#xff0c;SO!跟着清弦瞧瞧下面几种iPhone手机照片不见的解决方法吧&#xff01;一、ios系统BUG&#xff1a;iPhone系统有时会出现一些BUG&#…

windows azure虚拟机创建——快速创建,库模板创建

在 Windows Azure 上创建新虚拟机是一件非常轻松的事情。只需使用浏览器访问 Windows Azure 管理门户&#xff0c;选择左侧的“虚拟机”选项卡&#xff0c;然后单击底部命令栏中的“新 建”按钮。这里我们有两种方式可以选择&#xff1a;快速创建创建虚拟机或者从库中选择模板来…

python 编程快速上手,Python编程快速上手

**部分 Python编程基础**章 Python基础1.1 在交互式环境中输入表达式1.2 整型、浮点型和字符串数据类型1.3 字符串连接和复制1.4 在变量中保存值1.4.1 赋值语句1.4.2 变量名1.5 **个程序1.6 程序剖析1.6.1 注释1.6.2 print()函数1.6.3 input()函数1.6.4 打印用户的…

苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读…

php 期望参数1为资源,PHP:mysql_fetch_array()期望参数1是资源,布尔给定

Possible Duplicate:07000我会在我的网站上的标题中显示,并且不会出现这种错误,我也不知道如何解决这个问题.谁能帮我&#xff1f;这是add_answer.php文件&#xff1a;include("mysql_forum_test.php"); // Get value of id that sent from hidden field$id$_POST[id…

python利用什么来写模块-Python模块的制作方法实例分析

本文实例讲述了Python模块的制作方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1 目的 利用setup.py将框架安装到python环境中&#xff0c;作为第三方模块来调用&#xff0c; 2 第一步&#xff1a;完成setup.py的编写 以下代码相当于一个模板&#xff0c;只用更…

IntelliJ IDEA中文乱码解决办法

1. 预热 刚刚接触IntelliJ IDEA几天&#xff0c;在易用性方面的确比Eclipse好很多&#xff0c;比较智能&#xff0c;各种插件、工具都已经集成&#xff0c;和Mac OS X类似——开箱即用&#xff0c;并且在试用了之后在开源中国三折&#xff08;后悔2折的时候没有下手&#xff09…

怎么导出oracle库,【DG】怎么从Oracle备库导出数据

1、使用exp导出2、使用expdp导出若使用exp导出&#xff0c;则可以直接在备库执行导出动作。exp lhr/lhr buffer409600000 file/tmp/lhr.dmp log/tmp/lhr.log ownerlhrimp lhr/lhr buffer409600000 file/tmp/lhr.dmp log/tmp/lhrimp.log fully使用expdp导出先决条件&#xff1a;…

css background 一半_CSS小技巧

点击上方蓝字 关注我们左右布局将内部的子元素加浮动&#xff0c;父元素清除浮动即可。代码&#xff1a;DOCTYPE html><html><head><title>testtitle><style type"text/css"> .big{ width: 300px; heig…

rsoft透射谱_基于Rsoft软件光纤光栅的仿真模拟

​光纤光栅无论在光纤传感领域还是光纤激光器方面被大量研究&#xff0c;那么如何在没有进行实体实验的情况下来进行光纤光栅的模拟呢&#xff0c;本案例主要利用光波导Rsoft仿真软件对光纤光栅进行模拟分析研究。相信这种方法很实用哦。仿真优点&#xff1a;操作简便&#xff…

oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT

之前都是网上看过整理的&#xff0c;今天看到local_listener竟然一点印象都没有&#xff0c;太恐怖&#xff0c;索性再好好整理一下&#xff0c;避免再次忘记。一&#xff0e;什么是注册注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名&#xf…

背景图页面缩小会变形_社团招新迎新海报背景图第321期

○ ○ ○免费图片素材置顶提示&#xff1a;文件将通过某度网盘提取&#xff0c;请先将素材保存到自己网盘后再下载。虽然设置了链接长期有效&#xff0c;但是什么事情都不能绝对&#xff0c;至少现在就出现过好几次链接被取消的情况。页面底部有个留言的窗口&#xff0c;大家有…

ug10许可证错误一8_面对排污许可证后监督检查,企业应做好哪些准备?

排污许可证不是发完就了事&#xff0c;当证后监督检查来临时&#xff0c;你会怎么办&#xff1f;胸有成竹还是胆战心惊&#xff1f;不要以为网上申领许可证so easy&#xff0c;填填表&#xff0c;传传资料&#xff0c;就能蒙混过关&#xff1f;不可能的&#xff0c;一旦查出问题…

语言中的petchar运用_还在担心你家孩子发音、语言问题?12个表现、3个预防是重点...

#清风计划#儿童语言发育迟缓在早期有时很难发现&#xff0c;而一旦耽误2-6岁的“黄金恢复期”再想提高理解与表达就困难重重了。那么如何判定我们的宝宝是否语言发育迟缓呢&#xff1f;下面我们先来看下正常孩子的语言发展轨迹。0-6岁正常儿童的语言发展特征0 至 6个月对声音会…

php面试php数组变ahp,关于PHP字符串的一道面试题

我们来看一段简单的代码&#xff1a;$str php;$str[name] array(dogstart);var_dump($str);认真思索下&#xff0c;上面的代码会输出什么&#xff1f;如果你已经有答案了&#xff0c;那么就可以关闭这遍文章了&#xff0c;否则咱们一步一步的来看看最终会输出什么。基础回顾在…

7 libjpeg使用

一、交叉编译libjepg编译 tar xzf libjpeg-turbo-1.2.1.tar.gz ./configure –help ./configure --prefix/work/project/first_project/13libjepg/libjpeg-turbo-1.2.1/tmp/ --hostarm-linux make make install 二、交叉编译jepg2rgb.c arm-linux-gcc -o jpg2rgb jpg2rgb.c …

oracle快速排序法,经典算法系列之快速排序算法

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。在平均状况下&#xff0c;排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较&#xff0c;但这种状况并不常见。事实上&#xff0c;快速排序通常明显比其他Ο(n log n) 算法更快&am…