The Go-CLICKHOUSE project is a dynamic, open-source Golang 💻 repository that serves as a modern blueprint for building scalable, clean, and production-ready web services 🚀. It showcases best practices in architecture by strictly adhering to Clean Architecture 🏗️ and domain-centric modularity, organizing code into distinct layers (controllers, services, and repositories) to ensure the application is highly maintainable ✅ and easily testable 🧪 as it grows.
- Dependency Management: Uses Uber FX ✨ for robust dependency injection and graceful application lifecycle management.
- Web Framework: Leverages the Gin framework 🌐 for a high-performance HTTP layer.
- Data Access: Utilizes SQLC 💾 for type-safe interaction with the database.
- Performance: Integrates a Redis-backed cache layer 🧠 for speed and efficiency.
- Communication: Includes a gRPC server ⚡ to demonstrate high-performance microservice communication.
- Core Module: Features a fully functional Product Management Module 📦 with complete CRUD (Create, Read, Update, Delete) functionality.
This repository is an evolving guide to advanced Go development. All architectural decisions and feature implementations are thoroughly documented through a series of dedicated articles on Medium. By following this project, you can learn essential advanced Go idioms, master the use of DTOs (Data Transfer Objects) 💼, and implement professional-grade backend systems 💡.
medium.com/list/gosimple-b350f5c3bdb6
go run cmd/server/main.go
http://127.0.0.1:4000/swagger/index.html#/
swag init --parseDependency --parseInternal -g cmd/server/main.go
docker compose up -d
sqlc generate
go test ./test/server_test.go
docker run --name sonarqube \
-p 9000:9000 \
sonarqube:latest
go test -coverpkg=./... -coverprofile=coverage.out ./test
go test -v ./test | grep FAIL
go test ./... -json > report.json
go tool cover -func=coverage.out
sonar-scanner \
-Dsonar.projectKey=go-clickhouse \
-Dsonar.sources=. \
-Dsonar.host.url=http://127.0.0.1:9000 \
-Dsonar.token=sqp_XXXX
export SONAR_HOST_URL=http://your-sonarqube-server.com
export SONAR_TOKEN=your-sonar-token-here
chmod o+x ./data chmod o+x ./data/flags
docker compose up
go run cmd/server/main.go
protoc -I. --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative --grpc-gateway_out=. --grpc-gateway_opt=paths=source_relative api/proto/product/v1/product.proto
go get google.golang.org/grpc
go get -tool github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway
go get -tool github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2
go get -tool google.golang.org/protobuf/cmd/protoc-gen-go
go get -tool google.golang.org/grpc/cmd/protoc-gen-go-grpc
docker build -t go-clickhouse:latest .
docker run -p 4000:4000 go-clickhouse:latest
docker run -p 4000:4000 --env-file .env go-clickhouse:latest
curl -X POST "http://localhost:8123" \
-u default:pass \
--data-binary "CREATE TABLE IF NOT EXISTS products (
id Int32,
name String,
description String,
price Int64
) ENGINE = MergeTree()
ORDER BY (id)"
curl -X POST "http://localhost:8123" \
-u default:pass \
--data-binary "INSERT INTO products FORMAT Values
(1, 'Laptop', 'High‑performance laptop', 129900),
(2, 'Mouse', 'Wireless optical mouse', 2999),
(3, 'Keyboard', 'Mechanical keyboard', 8999)"
curl -X POST "http://localhost:8123" \
-u default:pass \
--data-binary "DROP TABLE IF EXISTS products"