微服务必须从初始化就具备注册发现、健康检查、结构化日志等能力,而非仅写业务逻辑;需用go 1.21+、viper配置、zap日志、gin/grpc框架及标准目录结构,并通过docker compose实现多服务联调。

别从 go mod init 就开始写业务逻辑——微服务不是单体应用的放大版,它一启动就得能注册、能被发现、能健康检查、能打结构化日志。否则你写的不是微服务,是带 HTTP 接口的单体进程。
Go 版本与 GOPROXY 必须提前锁死
用系统包管理器装的 go(比如 Ubuntu 的 1.18 或 CentOS 的 1.16)直接淘汰。微服务依赖泛型、embed、稳定的 module 校验机制,这些在 Go 1.21+ 才真正可用。
- 去 https://www.php.cn/link/81836b7cd16991abb7febfd7832927fd 下载
go1.21.6.linux-amd64.tar.gz(或对应平台版本),解压到/usr/local/go - 把
/usr/local/go/bin加进$PATH,别漏掉source ~/.zshrc或source ~/.bashrc - 执行
go env -w GOPROXY=https://goproxy.cn,direct——没这句,go mod download在国内基本卡死 - 验证:
go version输出必须是go version go1.21.6 linux/amd64(或更高)
项目结构不能靠“感觉”,得按 Standard Layout 初始化
空文件夹里扔一个 main.go 是最常见也最危险的起点。微服务一旦上线,目录混乱会直接拖慢排查速度、阻碍 CI/CD 集成。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 用域名前缀初始化模块:
go mod init yourcompany.com/order-svc,避免未来包名冲突 - 强制建立以下骨架目录:
cmd/(只放main.go)、internal/(纯业务,不导出)、pkg/(跨服务复用工具)、api/(.proto文件)、configs/(app.yaml)、migrations/ -
cmd/order-svc/main.go里只做三件事:加载viper配置、初始化zap日志、调用grpc.NewServer()或gin.Default()启动 - 业务逻辑全塞进
internal/service/和internal/handler/,禁止跨层引用(比如handler直接 importmodel)
HTTP/gRPC + Viper + Zap 是最小可行组合,缺一不可
没配置中心、没结构化日志、没健康检查端点的服务,在 Kubernetes 里等于裸奔。K8s 的 liveness/readiness probe 会直接杀掉它。
- HTTP 层用
gin而不是原生net/http:后者写中间件太啰嗦,gin的Use()和GET()能快速暴露/healthz和/metrics - 配置必须用
viper:支持configs/app.yaml+ 环境变量覆盖(如APP_ENV=prod),开发时开viper.WatchConfig()实现热重载 - 日志必须用
zap:zap.NewProduction()输出 JSON,字段含level、ts、caller、trace_id;别用log.Printf,它没法对接 Loki 或 ELK - gRPC 接口定义放在
api/order/v1/order.proto,用buf build生成 Go stub,别手写protoc命令——参数错一个就编译不过
Docker Compose 是本地联调唯一现实路径
单个服务跑通不算数,微服务要的是多进程协作。硬编码 localhost:5432 连 PostgreSQL?上线后 DNS 解析失败,服务直接挂。
- 每个服务写独立
Dockerfile:多阶段构建,FROM golang:alpine AS builder编译,FROM alpine:latest运行,镜像体积压到 15MB 以内 -
docker-compose.yml至少包含四块:order-svc、postgres、redis、consul(或etcd)——服务启动前先等consulready - 服务内数据库连接地址写成
postgres://postgres:password@postgres:5432/order?sslmode=disable,用容器名当 host,不是localhost - 启动命令加
depends_on+ 自定义 healthcheck:curl -f http://localhost:8080/healthz || exit 1,避免服务抢在 DB 就绪前启动
最容易被跳过的其实是配置加载顺序和日志上下文透传——viper 读不到 configs/app.yaml 时默认静默失败;zap 的 With() 字段没贯穿请求链路,排查时根本定位不到哪次调用出的问题。这些细节不手动验证一遍,线上第一个 500 错误就会卡住你两小时。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










