项目结构

Vine 提供命令行工具创建项目,其中包括了开发过程中需要的工具链和部署内容。

单服务

单服务目录结构使用以下命令创建:

mkdir $PATH/src/foo
vine init
vine new service foo

生成目录结构:

├── Makefile
├── README.md
├── api  // ------ 维护 grpc 接口
│   └── service
│       └── foo
│           └── v1
│               ├── foo.pb.go
│               ├── foo.pb.validator.go
│               ├── foo.pb.vine.go
│               └── foo.proto
├── cmd         // ------ 项目入口
│   └── main.go
├── deploy    // ------- 部署相关工具
│   ├── Dockerfile
│   ├── foo.ini
│   └── foo.service
├── go.mod
├── go.sum
├── pkg  // 服务内部代码
│   ├── app.go  // -------- 构造和组合各层代码,提供给 cmd/main.go
│   ├── service  // ---------- 业务层,维护业务代码
│   │   └── foo.go
│   ├── internal  // --------- 内部层,底层通用代码
│   │   └── storage  // ------- 数据库 storage,数据交互
│   │       └── storage.go
│   ├── server   // ---------- 接口层,提供对外的 gRPC 接口 
│   │   └── foo.go
│   └── internal
└── vine.toml   // -------- vine 项目的描述文件

多服务

当一个项目中有多个微服务时,我们推荐代码在一个目录中维护,使用以下命令创建

mkdir -p $GOPATH/src/cluster
cd $GOPATH/src/cluster

vine init --cluster
vine new service helloworld

生成以下目录结构:

├── Makefile
├── README.md
├── api
│   └── service
│       └── helloworld
│           └── v1
│               └── helloworld.proto
├── cmd
│   └── helloworld
│       └── main.go
├── deploy
│   ├── config
│   │   └── helloworld.ini
│   ├── docker
│   │   └── helloworld
│   │       └── Dockerfile
│   └── systemd
│       └── helloworld.service
├── go.mod
├── pkg   
│   ├── helloworld // -------- 多服务是,pkg 每个目录代码一个服务
│   │   ├── app.go
│   │   ├── service
│   │   │   └── helloworld.go
│   │   ├── internal
│   │   │   └── storage
│   │   │       └── storage.go
│   │   └── server
│   │       └── helloworld.go
└── vine.toml

vine.toml

vine.tomlVine 项目的描述文件,当一个目录底下存在该文件时,会被识别为 Vine 项目。

vine.toml 存在两种格式,single 和 cluster。

single

[package]               # [package] 描述项目的公共信息 
kind = "single"         # 项目类型 single 和 cluster
namespace = "go.vine"   # 统一的命名空间

[pkg]      # single 项目详细信息
name = "foo"  # 项目名称
alias = "go.vine.service.foo" # 服务名称
type = "service"    # 服务类型 service, gateway
version = "latest"  # 服务版本
main = "cmd/main.go" # 服务入口文件
dir = "github.com/lack-io/foo"  # 服务核心代码目录
output = ""  # 编译成二进制文件的存放目录
flags = [
	"-a", "-installsuffix", "cgo", "-ldflags \"-s -w\"",  # 编译参数, 支持shell命令作为值 "name=$(echo hello)"
]

[[proto]]    # *.proto 文件信息
name = "foo" # proto 文件名称
pb = "github.com/lack-io/foo/api/service/foo/v1/foo.proto" # proto 文件路径
type = "service" # proto 类型 service 和 api; service 表示 gRPC 服务,api 表示领域模型
group = "foo" # proto 分组
version = "v1" # proto 版本
plugins = ["gogo", "vine", "validator"] # 执行 protoc 命令时携带的插件,可选 gogo、vine、validator、deepcopy、dao

cluster

[package]
kind = "cluster"
namespace = "go.vine"

[[mod]]  # 每个 mod 表示一个服务
name = "helloworld"
alias = "go.vine.service.helloworld"
type = "service"
version = "latest"
main = "cmd/helloworld/main.go"
dir = "github.com/lack-io/foo/helloworld"
output = ""
flags = [
	"-a", "-installsuffix", "cgo", "-ldflags \"-s -w\"", 
]

[[proto]]
name = "helloworld"
pb = "github.com/lack-io/foo/api/service/helloworld/v1/helloworld.proto"
type = "service"
group = "helloworld"
version = "v1"
plugins = ["gogo", "vine", "validator"]

最后修改 December 29, 2022: project (a1c4912)