在 CentOS 上用 Golang 构建微服务架构
一 环境准备与 Go 安装
- 更新系统并安装基础工具
- sudo yum update -y && sudo yum install -y wget git unzip gcc gcc-c++ make
- 安装 Go(两种常用方式,二选一)
- YUM 安装:sudo yum install -y golang
- 官方包安装:
- wget https://golang.org/dl/go1.22.5.linux-amd64.tar.gz
- sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
- 配置环境变量(写入 /etc/profile.d/golang.sh)
- export GOROOT=/usr/local/go
- export GOPATH=$HOME/go
- export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
- 生效:source /etc/profile.d/golang.sh
- 验证:go version 应输出版本号(如:go1.22.5)
二 微服务框架选型与通信方式
- 常用框架与定位(按场景选择)
- 工程化与一体化:go-zero(自带 API/RPC、代码生成、工程实践)
- 云原生与多语言互通:gRPC-Go + Protobuf(HTTP/2 + 二进制编码)
- 高性能 RPC:Kitex(字节跳动开源,自研网络库 Netpoll)
- 插件化生态:Go-Micro(可插拔组件,服务发现/负载均衡等)
- 企业互通:Dubbo-go(与 Java Dubbo 生态互通)
- 服务发现与配置
- 常用组件:etcd / Consul;也可结合 Kubernetes 原生服务发现
- 建议组合
- 新项目优先:go-zero 或 gRPC-Go + Kitex/Go-Micro
- 与 Java 体系互通:Dubbo-go
三 示例一 快速 HTTP 服务与 Systemd 部署
- 最小 HTTP 服务 main.go
- package main
import (
“log”
“net/http”
“os”
)
func main() {
port := os.Getenv(“PORT”)
if port == “” { port = “8080” }
http.HandleFunc(“/ping”, func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(
{"message":"pong"}))
})
log.Printf(“Listening on :%s”, port)
log.Fatal(http.ListenAndServe(“:”+port, nil))
}
- 构建与运行
- 本地或交叉编译(在 CentOS 上可直接构建)
- CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app main.go
- 上传至服务器后赋权运行
- chmod +x app && nohup ./app > app.log 2>&1 &
- 使用 Systemd 托管(/etc/systemd/system/app.service)
- [Unit]
- Description=Go App
- After=network.target
- [Service]
- User=appuser
- Group=appgroup
- ExecStart=/opt/app/app
- Restart=always
- Environment=PORT=8080
- [Install]
- WantedBy=multi-user.target
- 启动与开机自启
- sudo systemctl daemon-reload
- sudo systemctl start app && sudo systemctl enable app
- sudo systemctl status app
- sudo journalctl -u app -f
- 防火墙放行端口
- sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
- sudo firewall-cmd --reload
四 示例二 gRPC + Docker 容器化与多服务编排
- 目录结构
- user-rpc/ 与 user-api/(分别实现 gRPC 与对外 HTTP 聚合)
- 多阶段 Dockerfile(user-rpc/Dockerfile,示例)
- FROM golang:1.22 AS build-env
WORKDIR /app
COPY . .
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/user-rpc .
- FROM alpine:latest
WORKDIR /app
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=build-env /app/user-rpc /app/user-rpc
CMD [“/app/user-rpc”]
- 构建与运行
- docker build -t user-rpc:latest ./user-rpc
- docker run -d --name user-rpc -p 50051:50051 user-rpc:latest
- 使用 docker-compose 编排多服务(docker-compose.yml 片段)
- version: “3.8”
services:
etcd:
image: bitnami/etcd:latest
environment:
- TZ=Asia/Shanghai
- ALLOW_NONE_AUTHENTICATION=yes
ports: [“2379:2379”]
networks: [“center_net”]
restart: always
user-rpc:
build: ./user-rpc
ports: [“50051:50051”]
environment:
- ETCD_ENDPOINTS=etcd:2379
depends_on: [“etcd”]
networks: [“center_net”]
restart: always
user-api:
build: ./user-api
ports: [“8080:8080”]
environment:
- RPC_ADDR=user-rpc:50051
depends_on: [“user-rpc”]
networks: [“center_net”]
restart: always
networks:
center_net: {}
- 说明
- 服务发现可用 etcd;如需消息队列/数据库,可在 compose 中增加 Kafka/Zookeeper/MySQL/Redis 等服务依赖。
五 生产级实践清单
- 构建与交付
- 使用多阶段构建与 CGO_ENABLED=0 生成静态二进制,减小镜像体积并提升可移植性
- 镜像基础建议:alpine(更小)或 debian(glibc 兼容更好)
- 配置与密钥
- 使用 Viper 管理 JSON/YAML/Env 配置,结合 KMS/Secrets 管理敏感信息
- 可观测性
- 日志结构化(JSON),接入 ELK 或 Loki
- 指标与链路追踪:Prometheus + Grafana,以及 Jaeger/Zipkin
- 服务治理
- 服务发现:etcd/Consul;网关:Nginx/Envoy/Kong
- 熔断/限流/重试:在框架或网关层统一实现
- 部署与弹性
- 容器化后使用 Kubernetes 进行部署、滚动升级、健康检查与自动扩缩容
- 安全
- 最小权限运行(非 root),镜像漏洞扫描,开启 TLS/mTLS 通信
以上流程覆盖了在 CentOS 上从 Go 环境到微服务框架选型、服务编写、容器化与编排部署的关键环节,并提供了可直接复用的示例与落地实践要点。