Client
dubbo-kubernetes 的命令行工具 dubboctl 用于构建项目、打包成镜像、推送至 registry、部署 kubernetes 等。
而 dubboctl 的核心在于 Client,表示 dubboctl 客户端,执行 dubboctl 的各种操作。Client 定义在 app/dubboctl/internal/dubbo/client.go 文件中,其结构如下。其中,Client 包含了 builder、pusher、deployer 等组件,用于打包镜像、推送、部署工作。
1 | type Client struct { |
初始化函数
New 用于初始化一个 Client,该函数根据配置 options 配置 Client,并且初始化 repository 和 template 管理器。
1 | // New client for function management. |
dubboctl 使用的默认初始化函数
在 dubboctl 使用 Client 时,又封装了一个默认的初始化函数 NewClient,用于提供完整功能的 Client,包括配置:
- 默认的本地 repository 地址,dubbo.WithRepositoriesPath。
- Builder 镜像构造器,dubbo.WithBuilder。
- Pusher 用于将镜像推送至 registry,dubbo.WithPusher。
- Deployer 用于部署应用至 kubernetes,dubbo.WithDeployer。
1 | func NewClient(options ...dubbo.Option) (*dubbo.Client, func()) { |
三层结构
在 dubboctl 创建应用时,支持自定义应用模版。而在 dubboctl 中有三层结构的概念,分别是 repository,runtime,template。
其中,repository 指的是一个仓库(可以是本地的或是远程的 git 仓库),而 runtime 指的是使用的编程语言,template 为创建应用的具体模版。
如默认仓库 default 的结构如下,有两种 runtime 分别是 go 和 java,而每一种 runtime 中又指定了一个名为 common 的模版。
Repository Runtime Template 之间都是一对多的关系,一个 Repository 下有多个 Runtime,一个 Runtime 下有多个 Template。
Repository
Repository 被定义为存放 template 的仓库,这个仓库可以是本地的,也可以是远程的。至于 repository 是本地的还是远程的,取决于 uri,根据 uri 构造不同类型的文件系统,如上一篇文章所述,dubbo-kubernetes 抽象出了多种不同的文件系统。
若 uri 以 file:// 为协议头,则表示这是一个本地仓库。
若 uri 为 git 远程地址,则表示这是一个远程 git repository。
在 repository 的根目录下可以保存一个 manifes.yaml,用于保存 repository 的配置信息 repositoryConfig,包括名字、版本号(这个目前没有用到)、template 存放地址(默认在仓库的根目录下)。
1 | // Repository represents a collection of runtimes, each containing templates. |
Client 不直接操作 Repository,而是通过 Repository 管理器 Repositories 操作仓库。
Runtime
Runtime 表示不同的语言,在 Repository 中维护了 Runtime 切片,在 Runtime 中维护了 Template 切片。
1 | // Runtime is a division of templates within a repository of templates for a |
在 Repository 中,读取 repositoryConfig.TempatesPath(默认为 Repository 根目录)下的所有子文件夹,每一个子文件夹的名称就是一个 Runtime:
1 | // repositoryRuntimes returns runtimes defined in this repository's filesystem. |
Template
Template 表示某个应用模版,在创建应用时,最终的操作就是将模版复制到指定的文件夹下。template 维护了一个 filesystem.Filesystem,表示以当前模版为根目录的文件系统。
在创建模版时,遍历 repositoryConfig.TemplatesPath/RuntimeName 下的每一个文件夹,文件夹的名字作为模版名字,使用 subFS 作为模版文件系统的实现:
1
2
3
4
5
6
7 // Template, defaulted to values inherited from the runtime
t := template{
name: fi.Name(),
repository: repoName,
runtime: runtimeName,
fs: filesystem.NewSubFS(path.Join(runtimePath, fi.Name()), fs),
}
1 | // Template is a function project template. |
写入
在写入时,使用了 maskingFS,用于屏蔽当前模版下的 manifest 文件(虽然现在 manifest 没有什么用,并没有起到配置 template 的作用)。
1 | func (t template) Write(ctx context.Context, f *Dubbo) error { |