5、🧱 微服务里的硬汉 Go:打造你的第一个 RESTful 服务

95 阅读3分钟

Go 没有花哨的语法糖,却能一拳一个微服务;
它不是天赋型选手,而是纯靠基本功干翻全场的硬汉。


🍖 一、为什么 Go 是微服务的香饽饽?

  • ✅ 编译快:go build 几秒搞定,适合 CI/CD 快速打包上线
  • ✅ 部署简:生成单个二进制文件,打包进 Docker 不费劲
  • ✅ 占用小:天生适合容器化环境(K8s 下的优秀公民)
  • ✅ 性能强:比 Node.js、Python 等高一个量级
  • ✅ 并发强:自带协程 + channel,不需要三方库也能高并发

用一句话总结:

Go = “从来没加过班的高效后端选手”。


🧰 二、快速构建一个 Go RESTful 服务

我们用 Go 官方标准库 net/http(没错,不需要框架)快速写一个:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func userHandler(w http.ResponseWriter, r *http.Request) {
    user := User{ID: 1, Name: "Tom"}
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

func main() {
    http.HandleFunc("/user", userHandler)
    fmt.Println("服务器已启动,监听端口 8080")
    http.ListenAndServe(":8080", nil)
}

访问 http://localhost:8080/user,你会看到:

{
  "id": 1,
  "name": "Tom"
}

🎯 三、结构化项目目录(别再 all in main.go 了)

真实项目建议拆分结构:

myapp/
├── main.go
├── handler/
│   └── user.go
├── router/
│   └── router.go
├── model/
│   └── user.go
├── service/
│   └── user.go

没有架构的 Go 项目,就像没有键盘的游戏玩家:能玩但别指望上分。


🔥 四、换个更舒服的写法:Gin 框架登场!

Gin 是 Go 最流行的 Web 框架,性能强、API 简洁、开发体验好。

安装:

go get -u github.com/gin-gonic/gin

示例代码:

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "pong"})
    })

    r.Run(":8080")
}

输出:

访问 localhost:8080/ping{"message": "pong"}

为什么选 Gin?

特性说明
极快比 net/http 快 40%(底层复用了高性能路由)
中间件支持强日志、限流、鉴权等都能 plug & play
参数处理方便支持路径参数、query 参数、body 解析等

🧱 五、添加更多路由:GET / POST / PUT / DELETE

r.GET("/user/:id", getUser)
r.POST("/user", createUser)
r.PUT("/user/:id", updateUser)
r.DELETE("/user/:id", deleteUser)

这些路由和 RESTful 规范天然匹配,后续对接前端 / API 网关非常舒服。


🔐 六、别忘了中间件(Middleware)

func Logger() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
        c.Next()
        latency := time.Since(t)
        log.Printf("耗时:%v", latency)
    }
}

加入中间件:

r.Use(Logger())

可拦截请求、鉴权、日志记录、统一异常处理。


🚀 七、部署到 Docker + K8s?

这是 Go 的拿手好戏!最简单 Dockerfile:

FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o app

FROM alpine:latest
COPY --from=builder /app/app /app
CMD ["/app"]

执行:

docker build -t myapp .
docker run -p 8080:8080 myapp

配合 K8s 可用 Deployment + Service 实现高可用自动扩容部署。


✅ 总结

能力Go 的表现
REST API简单高效,标准库或 Gin 框架皆可
并发能力天生强,支持协程请求
构建部署单文件构建、容器友好、CI/CD 快
项目结构支持模块化、架构清晰

🎬 下一篇预告

下一篇我们要深入一个让许多 Go 工程师头痛的地方——依赖管理与版本地狱,看一看 Go Modules 和 vendor 的那些“地下恋情”。