在现代 Web 开发中,创建一个高可用的 RESTful API 是一项基本任务。Go 语言以其高性能和简单性,成为构建后端服务的热门选择之一。结合 Gorilla Mux 路由库和 endless
包,我们可以实现一个支持平滑重启和高可用性的 API。
endless
包的优势在于支持平滑重启。当我们需要更新服务时,可以在不影响现有连接的情况下重启服务。
依赖包
go get -u github.com/gorilla/mux
go get -u github.com/fvbock/endless
代码
package main
import (
"encoding/json"
"fmt"
"net/http"
"github.com/gorilla/mux"
"github.com/fvbock/endless"
)
// 定义用户结构体
type User struct {
ID string `json:"id"`
Name string `json:"name"`
}
// 模拟数据存储
var users []User
// 处理获取所有用户的请求
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, "无法解析请求体", http.StatusBadRequest)
return
}
users = append(users, newUser)
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(newUser)
}
func main() {
// 初始化路由
router := mux.NewRouter()
// 设置路由
router.HandleFunc("/users", getUsers).Methods("GET")
router.HandleFunc("/users", createUser).Methods("POST")
// 启动 HTTP 服务器
fmt.Println("服务器正在运行,监听端口 8080...")
// 使用 endless 包创建服务器,支持平滑重启
endless.ListenAndServe(":8080", router)
}
用户结构体:定义了一个
User
结构体来表示用户的基本信息,包括 ID 和 Name。数据存储:使用切片
users
来模拟数据存储。处理函数:
getUsers
:处理 GET 请求,返回所有用户的 JSON 列表。createUser
:处理 POST 请求,接收用户数据并将其添加到切片中。服务器启动:使用
endless.ListenAndServe
启动服务器,该方法支持在服务器重启时保持当前连接,确保用户体验不受影响。