Golang应用架构设计指南
Golang应用架构设计指南 大家好。过去几周我一直在学习Golang(主要使用Go playground),但现在我开始思考如何正确构建或组织一个Go应用程序。我阅读了许多关于这个主题的帖子,目前使用的是以下结构:
project_directory
|--bin
|--pkg
`--src
`--github.com
我的GOPATH设置为"project_directory"。这意味着在github.com/下的每个文件夹基本上都是一个代码库,因此在GitHub上进行版本控制。我来自Java领域,所以很难理解我的项目目录本身不在版本控制之下的概念。
考虑到这一点,我进行了一些谷歌搜索,了解了带有go.mod文件的Go模块,这将允许我这样构建应用程序(如果我对所读内容理解正确的话):
project_directory
|--go.mod
`--src
|--module1
`--module2
我的理解是,这将允许我将带有’go.mod’文件的项目目录以及空的src目录置于版本控制之下。src目录为空是因为Go会从go.mod文件中获取模块。
这就是我的理解,再次强调,我来自Java/Maven领域,所以可能完全偏离了轨道。
我知道应用程序结构没有统一的标准,我看到了很多似乎很受欢迎的建议。所以我的问题(终于)是:
- 由于尚未正式推出,我应该继续使用GOPATH方法,还是可以安全地使用go.mod方法?
- 关于使用go.mod的方式,对于最终将成为Docker镜像的应用程序,你们认为是否有更合适的结构方式。
感谢大家的帮助
更多关于Golang应用架构设计指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我所说的"docker镜像"是指我会拥有类似这样的结构: 项目目录 |-- go.mod |-- Dockerfile |-- Makefile `-- src
但你提供的链接很有参考价值。我想这是我的问题,因为我阅读的博客比官方文档要多。
更多关于Golang应用架构设计指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好,
我也是个Java开发者(而且母语是法语),也许我们更能理解彼此 😊
实际上,GOPATH并不是指向你的项目目录,而是指向你的工作空间,你将在该空间下放置项目。可以把它想象成你的Eclipse工作空间。请仔细阅读这份关于GOPATH的优秀文档:https://golang.org/doc/code.html。
在你提到的第二部分中,你展示的布局中的go.mod文件将适用于你的两个模块。但我想你可能需要在每个模块目录中分别设置一个特定的go.mod文件。
你还应该注意,在获取依赖项时,GOPATH模式不允许你在go get命令中指定版本,而支持模块的模式可以:https://golang.org/cmd/go/#hdr-Module_aware_go_get
当你提到Docker镜像的布局时,是指使用Docker镜像进行构建吗?
Go模块现在是Go语言依赖管理的标准方式,自Go 1.11引入后,在Go 1.16中已成为默认选项。GOPATH方式已不再推荐用于新项目开发。
以下是基于Go模块的推荐项目结构:
// go.mod
module github.com/username/projectname
go 1.21
require (
github.com/some/dependency v1.2.3
)
项目目录结构示例:
project_directory/
├── go.mod
├── go.sum
├── cmd/
│ ├── api/
│ │ └── main.go
│ └── cli/
│ └── main.go
├── internal/
│ ├── handlers/
│ │ └── user.go
│ ├── models/
│ │ └── user.go
│ └── services/
│ └── user_service.go
├── pkg/
│ ├── database/
│ │ └── postgres.go
│ └── utils/
│ └── validation.go
├── api/
│ └── swagger.yaml
├── configs/
│ └── config.yaml
├── deployments/
│ ├── Dockerfile
│ └── docker-compose.yml
└── README.md
针对Docker部署的示例Dockerfile:
# Dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/bin/api ./cmd/api
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/bin/api .
COPY configs/config.yaml ./configs/
EXPOSE 8080
CMD ["./api"]
主要目录说明:
cmd/:包含应用程序的入口点(main包)internal/:私有应用程序代码,其他项目无法导入pkg/:可供外部导入的公共库代码configs/:配置文件deployments/:部署相关文件
构建和运行命令:
# 初始化模块(如果尚未初始化)
go mod init github.com/username/projectname
# 构建
go build -o bin/api ./cmd/api
# 运行测试
go test ./...
# 整理依赖
go mod tidy
这种结构支持多二进制文件部署(在cmd/下有多个子目录),便于容器化,并且遵循Go社区广泛采用的布局约定。


