Cấu trúc dự án chi tiết
.
├── cmd/ # Điểm vào ứng dụng
│ └── api/ # API server
│ └── main.go # File main khởi động ứng dụng
├── global/ # Biến toàn cục và cấu trúc cấu hình
│ └── global.go # Định nghĩa các biến và cấu trúc toàn cục
├── internal/ # Mã nguồn nội bộ
│ ├── controllers/ # Xử lý request và response
│ │ └── user_controller.go # Controller xử lý các request liên quan đến user
│ ├── initialize/ # Khởi tạo các thành phần của ứng dụng
│ │ ├── loadconfig.go # Đọc cấu hình từ file .env
│ │ ├── logger.go # Khởi tạo logger
│ │ ├── mysql.go # Khởi tạo kết nối MySQL
│ │ └── run.go # Điểm khởi động chính của ứng dụng
│ ├── models/ # Định nghĩa các model dữ liệu
│ │ └── user.go # Model User
│ ├── repositories/ # Tương tác với cơ sở dữ liệu
│ │ └── user_repository.go # Repository xử lý dữ liệu user
│ ├── routers/ # Định nghĩa các router
│ │ ├── router_group.go # Nhóm các router
│ │ └── user/ # Router liên quan đến user
│ │ ├── router_group.go # Nhóm các router user
│ │ └── user_router.go # Định nghĩa các endpoint user
│ ├── services/ # Xử lý logic nghiệp vụ
│ │ └── user_service.go # Service xử lý logic liên quan đến user
│ └── wire/ # Dependency injection với Google Wire
│ ├── injector.go # Định nghĩa các injector
│ ├── wire.go # Định nghĩa các provider
│ └── wire_gen.go # File được tạo tự động bởi Wire
├── logs/ # Thư mục chứa log
├── .air.toml # Cấu hình cho Air (hot-reload)
├── .env # Biến môi trường
├── Dockerfile # Cấu hình Docker cho môi trường production
├── Dockerfile.dev # Cấu hình Docker cho môi trường phát triển
├── Makefile # Các lệnh make
└── docker-compose.yml, docker-compose.dev.yml # Cấu hình Docker Compose
Quy tắc đặt tên file
Dự án tuân theo các quy tắc đặt tên file sau để đảm bảo tính nhất quán:
-
Sử dụng dấu gạch dưới (_) để phân tách các từ trong tên file, ví dụ:
user_controller.go
,user_repository.go
. -
Tên file mô tả rõ chức năng của file đó:
- Controllers:
<entity>_controller.go
(ví dụ:user_controller.go
) - Services:
<entity>_service.go
(ví dụ:user_service.go
) - Repositories:
<entity>_repository.go
(ví dụ:user_repository.go
) - Routers:
<entity>_router.go
(ví dụ:user_router.go
) - Models:
<entity>.go
(ví dụ:user.go
)
- Controllers:
-
File khởi tạo và cấu hình sử dụng tên mô tả chức năng:
loadconfig.go
: Đọc cấu hìnhlogger.go
: Khởi tạo loggermysql.go
: Khởi tạo kết nối MySQLrun.go
: Điểm khởi động ứng dụng
-
File Wire tuân theo quy ước của Google Wire:
wire.go
: Định nghĩa các providerinjector.go
: Định nghĩa các injectorwire_gen.go
: File được tạo tự động bởi Wire
Kiến trúc ứng dụng
Ứng dụng được tổ chức theo kiến trúc phân lớp:
- Controllers: Xử lý request và response, gọi các service để thực hiện logic nghiệp vụ.
- Services: Chứa logic nghiệp vụ, gọi các repository để tương tác với dữ liệu.
- Repositories: Tương tác trực tiếp với cơ sở dữ liệu, thực hiện các thao tác CRUD.
- Models: Định nghĩa cấu trúc dữ liệu.
- Routers: Định nghĩa các endpoint API và kết nối với controllers.
- Wire: Quản lý dependency injection, kết nối các thành phần lại với nhau.
Dependency Injection với Google Wire
Dự án sử dụng Google Wire để quản lý dependency injection. Các thành phần chính:
- Provider: Định nghĩa cách tạo các dependency (trong
wire.go
). - Injector: Định nghĩa cách kết nối các dependency (trong
injector.go
). - Wire Gen: File được tạo tự động bởi Wire, chứa code khởi tạo dependency (trong
wire_gen.go
).
Để cập nhật file wire_gen.go
sau khi thay đổi các provider hoặc injector:
cd internal/wire
go run github.com/google/wire/cmd/wire
Môi trường phát triển (Development)
Phương pháp 1: Sử dụng Docker Compose cho toàn bộ stack
Phương pháp này sử dụng Docker Compose để chạy cả ứng dụng Go và MySQL, với hot-reload được hỗ trợ bởi Air.
# Khởi động môi trường phát triển
docker-compose -f docker-compose.dev.yml up -d
# Xem logs
docker-compose -f docker-compose.dev.yml logs -f
# Dừng môi trường phát triển
docker-compose -f docker-compose.dev.yml down
Phương pháp 2: Chạy ứng dụng Go trực tiếp, MySQL trong Docker
# Khởi động MySQL trong Docker
make docker-run
# Chạy ứng dụng với hot-reload
make watch
# Hoặc chạy ứng dụng thông thường
make run
# Dừng MySQL
make docker-down
Môi trường sản xuất (Production)
Phương pháp 1: Sử dụng Docker Compose
# Khởi động môi trường sản xuất
docker-compose up -d
# Xem logs
docker-compose logs -f
# Dừng môi trường sản xuất
docker-compose down
Description
Languages
Go
94.1%
Makefile
4.5%
Shell
1.4%