Go微服务入门
微服务架构已成为构建现代分布式系统的事实标准。Go语言(Golang)凭借其轻量级goroutine、高性能和部署简便性,非常适合实现微服务。本文将从头到尾解析Go微服务架构,从概念到实际实现,并附带代码示例。
Go提供内置的并发支持、快速启动和小型二进制文件——所有这些对于微服务都至关重要。我们将探讨如何设计服务、实现REST API、添加中间件以及为容器化准备应用程序。
Go微服务架构
1. 项目结构
正确的代码组织是维护微服务的基础。推荐的结构如下:
myservice/├── cmd/│ └── server/│ └── main.go # 入口点├── internal/│ ├── handler/ # HTTP处理器│ ├── service/ # 业务逻辑│ ├── repository/ # 数据操作│ └── middleware/ # 中间件├── pkg/│ └── models/ # 通用数据模型├── config/│ └── config.go # 配置├── go.mod└── Dockerfile这种结构遵循Clean Architecture原则:handler → service → repository。这样可以轻松独立测试每一层。
2. 配置与启动
我们从使用标准库net/http的简单HTTP服务器开始:
// cmd/server/main.gopackage main
import ( "fmt" "log" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, `{"status": "ok"}`) })
log.Printf("Server starting on :%s", port) log.Fatal(http.ListenAndServe(":"+port, nil))}这是一个最小的微服务。对于生产环境,请使用支持中间件的路由器,例如gorilla/mux或chi。
微服务的实际实现
3. 使用gorilla/mux的REST API
安装gorilla/mux并为"用户"实体实现CRUD:
// go.modmodule github.com/youruser/userservice
go 1.21
require github.com/gorilla/mux v1.8.1// internal/handler/user.gopackage handler
import ( "encoding/json" "net/http" "github.com/gorilla/mux")
type User struct { ID string `json:"id"` Name string `json:"name"` Age int `json:"age"`}
var users = []User{ {ID: "1", Name: "Alice", Age: 30},}
func GetUsers(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(users)}
func CreateUser(w http.ResponseWriter, r *http.Request) { var newUser User if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } users = append(users, newUser) w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newUser)}// cmd/server/main.go (续)package main
import ( "log" "net/http" "github.com/gorilla/mux" "yourproject/internal/handler")
func main() { r := mux.NewRouter() r.HandleFunc("/users", handler.GetUsers).Methods("GET") r.HandleFunc("/users", handler.CreateUser).Methods("POST")
log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", r))}4. 中间件:日志记录与身份验证
中间件是微服务不可或缺的一部分。