A High-performance、K-V Cloud Database.
-
/web
前端代码存放目录,主要用来存放 Web 静态资源,服务端模板和单页应用(SPAs)。后期考虑会实现slava的可视化页面。 -
/cmd
一个项目有很多组件,可以把组件 main 函数所在的文件夹统一放在/cmd 目录下。
每个组件的目录名应该跟你期望的可执行文件名是一致的。这里要保证 /cmd/<组件名> 目录下不要存放太多的代码,如果你认为代码可以导入并在其他项目中使用,那么它应该位于 /pkg 目录中。如果代码不是可重用的,或者你不希望其他人重用它,请将该代码放到 /internal 目录中。 -
/internal
存放私有应用和库代码。如果一些代码,你不希望在其他应用和库中被导入,可以将这部分代码放在/internal 目录下。在引入其它项目 internal 下的包时,Go 语言会在编译时报错An import of a path containing the element “internal” is disallowed if the importing code is outside the tree rooted at the parent of the "internal" directory.
可以通过 Go 语言本身的机制来约束其他项目 import 项目内部的包。/internal 目录建议包含如下目录:
- /internal/apiserver:该目录中存放真实的应用代码。这些应用的共享代码存放在/internal/pkg 目录下。
- /internal/pkg:存放项目内可共享,项目外不共享的包。这些包提供了比较基础、通用的功能,例如工具、错误码、用户验证等功能。 Tips:一开始将所有的共享代码存放在 /internal/pkg 目录下,当该共享代码做好了对外开发的准备后,再转存到/pkg目录下 /internal 目录大概分为 3 类子目录:
- /internal/pkg:内部共享包存放的目录。
- /internal/authzserver、/internal/apiserver、/internal/pump、/internal/iamctl:应用目录,里面包含应用程序的实现代码。
- /internal/iamctl:对于一些大型项目,可能还会需要一个客户端工具。
在每个应用程序内部,也会有一些目录结构,这些目录结构主要根据功能来划分:
- /internal/apiserver/api/v1:HTTP API 接口的具体实现,主要用来做 HTTP 请求的解包、参数校验、业务逻辑处理、返回。注意这里的业务逻辑处理应该是轻量级的,如果业务逻辑比较复杂,代码量比较多,建议放到
- /internal/apiserver/service 目录下。该源码文件主要用来串流程。
- /internal/apiserver/options:应用的 command flag。
- /internal/apiserver/config:根据命令行参数创建应用配置。
- /internal/apiserver/service:存放应用复杂业务处理代码。/internal/apiserver/store/mysql:一个应用可能要持久化的存储一些数据,这里主要存放跟数据库交互的代码,比如 Create、Update、Delete、Get、List 等。
/internal/pkg 目录存放项目内可共享的包,通常可以包含如下目录:
- /internal/pkg/code:项目业务 Code 码。
- /internal/pkg/validation:一些通用的验证函数。/internal/pkg/middleware:HTTP 处理链。
-
/pkg
/pkg 目录是 Go 语言项目中非常常见的目录,我们几乎能够在所有知名的开源项目(非框架)中找到它的身影,例如 Kubernetes、Prometheus、Moby、Knative 等。该目录中存放可以被外部应用使用的代码库,其他项目可以直接通过 import 导入这里的代码。所以,我们在将代码库放入该目录时一定要慎重。 -
/third_party
外部帮助工具,分支代码或其他第三方应用(例如 Swagger UI)。比如我们 fork 了一个第三方 go 包,并做了一些小的改动,我们可以放在目录 /third_party/forked 下。一方面可以很清楚的知道该包是 fork 第三方的,另一方面又能够方便地和 upstream 同步。 -
/test
用于存放其他外部测试应用和测试数据。/test 目录的构建方式比较灵活:对于大的项目,有一个数据子目录是有意义的。例如,如果需要 Go 忽略该目录中的内容,可以使用 /test/data 或 /test/testdata 目录。需要注意的是,Go 也会忽略以“.”或 “_” 开头的目录或文件。这样在命名测试数据目录方面,可以具有更大的灵活性。 -
/configs
这个目录用来配置文件模板或默认配置。 -
/deployment
用来存放 Iaas、PaaS 系统和容器编排部署配置和模板(Docker-Compose,Kubernetes/Helm,Mesos,Terraform,Bosh)。在一些项目,特别是用 Kubernetes 部署的项目中,这个目录可能命名为 deploy。为什么要将这类跟 Kubernetes 相关的目录放到目录结构中呢?主要是因为当前软件部署基本都在朝着容器化的部署方式去演进。 -
/docs
存放设计文档、开发文档和用户文档等(除了 godoc 生成的文档)。推荐存放以下几个子目录:
- /docs/devel/{en-US,zh-CN}:存放开发文档、hack 文档等。
- /docs/guide/{en-US,zh-CN}: 存放用户手册,安装、quickstart、产品文档等,分为中文文档和英文文档。
- /docs/images:存放图片文件。
- /api
/api 目录中存放的是当前项目对外提供的各种不同类型的 API 接口定义文件,其中可能包含类似 /api/protobuf-spec、/api/thrift-spec、/api/http-spec、openapi、swagger 的目录,这些目录包含了当前项目对外提供和依赖的所有 API 文件。例如,如下是 IAM 项目的 /api 目录:二级目录的主要作用,就是在一个项目同时提供了多种不同的访问方式时,可以分类存放。用这种方式可以避免潜在的冲突,也能让项目结构更加清晰。├── openapi/ │ └── README.md └── swagger/ ├── docs/ ├── README.md └── swagger.yaml
- commit message 必须以todo编号: message 的样式做记录
分支type:
feature - 新功能 feature
fix - 修复 bug
docs - 文档注释
style - 代码格式(不影响代码运行的变动)
refactor - 重构、优化(既不增加新功能,也不是修复bug)
perf - 性能优化
test - 增加测试
chore - 构建过程或辅助工具的变动
revert - 回退
build - 打包
- todo编号的命名规则是:分支type/版本号-***(三位数的编号),eg: feature:0-001
- 多个commit需要squash后再进行提交
- 合并分支commit和rebase结合使用
使用 rebase 和 merge 的基本原则:
- 下游分支更新上游分支内容的时候使用 rebase
- 上游分支合并下游分支内容的时候使用 merge
- 更新当前分支的内容时一定要使用 --rebase 参数
例如现有上游分支 master,基于 master 分支拉出来一个开发分支 dev,在 dev 上开发了一段时间后要把 master 分支提交的新内容更新到 dev 分支,此时切换到 dev 分支,使用 git rebase >master
等 dev 分支开发完成了之后,要合并到上游分支 master 上的时候,切换到 master 分支,使用 git merge dev
- Commit 信息规范:
0-002:summary
- fix the bug xxx
- xxx
- xxx
- 提交分支 feature/v0、test/v0(不要提交到main分支,由我来做最后的合并)
- 提交pr后需要拉一个1-1的会与我对齐你的进度以及讲解你的代码同时进行code review,同时需要提交一份你的测试报告(包括pr概述、测试用例、测试结果截图)。 测试报告模板
首先你需要 fork 本仓库到你自己的 github 仓库,点击右上角的 fork 按钮(切忌只fork main分支!)。
使用 git clone 命令将本仓库拷贝到你的本地文件,git clone 地址请点开项目上方的绿色 "code" 按钮查看。
在你的本地按照todo对代码进行修改、提交。
修改完后,是时候该上传你的改动到你 fork 来的远程仓库上了。你可以用 git bash,也可以使用 IDE 里的 git 来操作。对于 git 不熟的用户建议使用 IDE,IDE 也更方便写 commit 信息。
上传之后,点进你的仓库主页,会出现一个 "Contribute",点击它,选择 "Open pull request",选择好你仓库的分支和你想要在这里合并的分支后,点击 "Create pull request",之后填写你的 PR 标题和正文内容,就成功提交一个 PR 。接下来等待我的approve/feedback。
记得检查修改自己的 GitHub Public profile 里的 Name 和 Public email,位置在右上角头像的 Settings 里,因为大多数情况下我们会使用 squash merge 来合并 PRs,此时 squash merge 后产生的新提交作者信息会使用这个 GH 信息。
Todo codes | Issues | Contributors |
---|---|---|
docs:0-001 | 1. Readme update | Qinwen |
...... | ...... | ...... |
feature:0-019 | 1. LRU 2. LFU | |
feature:0-020 | 1. Geohash | |
feature:0-021 | 1. Clusters 2. Consistent Hashing |
|
feature:0-022 | 1. TCC | |
feature:0-023 | 1. TTL | |
...... | ...... | ...... |
feature:0-036 | 1. Quicklist | |
feature:0-037 | 1. Linkedlist |
Todo codes | Issues | Contributors |
---|---|---|
docs: 1-001 | 1. Readme update | Qinwen |
chore:1-002 | 1. Docker compose | |
feature:1-003 | 1. Generate Make file | |
feature:1-004 | 1. CI\CD | |
refactor:1-005 | 1. Go 1.17——>1.20 |