Go 語言基于 Go kit 開發 Web 項目
1.介紹
我們在上一篇文章「??Golang 微服務工具包 Go kit??」介紹了 Go 語言工具包 Go kit,本文我們介紹怎么基于 Go kit 開發 Web 項目。在閱讀上篇文章后,我們已經知道 Go kit 服務分為三層,分別是 transport、endpoint 和 service。
其中,service 層定義業務接口并實現接口方法。
endpoint 層接收請求參數并返回響應結果,需要注意的是,在 endpoint 層,給業務接口方法構建 endpoint.Endpoint。
因為 endpoint.Endpoint 是函數類型,封裝一層,方便我們使用 endpoint 裝飾器,給 endpoint.Endpoint 添加功能,例如日志、限流、負載均衡、鏈路追蹤等。
endpoint 層使用構建的 endpoint.Endpoint 調用 service 層接口的方法處理請求。
transport 層對外提供調用接口(http 或 rpc)。
2.基于 Go kit 開發 Web 項目
我們基于 Go kit 開發一個用戶中心項目,主要包含注冊和登錄的功能。
目錄結構如下:
.
├── endpoint # 接收請求,構建 endpoint.Endpoint 調用 service 層的接口方法,處理請求參數,返回響應結果給 transport 層
│ └── user.go
├── go.mod
├── go.sum
├── main.go
├── service # 定義業務接口并實現接口方法
│ └── user.go
└── transport # 對外提供調用接口(http 或 rpc)
└── http.go
- service 包定義服務(user 服務)的接口,并實現接口方法。
...
type IUser interface {
Register(ctx context.Context, req *RegisterRequest) (*User, error)
Login(ctx context.Context, email, password string) (*User, error)
}
...
- endpoint 包為接口方法構建 endpoint.Endpoint,將請求參數轉換為接口方法可以處理的參數,并將返回的響應結果封裝為對應的 response 結構體,返回給 transport 包。
...
type RegisterRequest struct {
UserName string
Email string
Password string
}
type RegisterResponse struct {
User *service.User
}
func MakeRegisterEndpoint(iUser service.IUser) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(*RegisterRequest)
user, err := iUser.Register(ctx, &service.RegisterRequest{
UserName: req.UserName,
Email: req.Email,
Password: req.Password,
})
return &RegisterResponse{User: user}, err
}
}
...
- transport 包把構建的 endpoint.Endpoint 提供給調用方。
...
func NewHttpHandler(ctx context.Context, endpoints *endpoint.Endpoints) http.Handler {
r := http.NewServeMux()
r.Handle("/register", kitHttp.NewServer(endpoints.RegisterEndpoint, decRegisterRequest, encResponse))
return r
}
...
- 在 main 函數中,創建 service、endpoint 和 transport,并啟動 Web 服務器。
func main() {
ctx := context.Background()
userService := service.NewUserService()
endpoints := &endpoint.Endpoints{
RegisterEndpoint: endpoint.MakeRegisterEndpoint(userService),
LoginEndpoint: endpoint.MakeLoginEndpoint(userService),
}
r := transport.NewHttpHandler(ctx, endpoints)
err := http.ListenAndServe(":8080", r)
if err != nil {
log.Fatal(err)
return
}
}
- 使用 go run 命令啟動,并使用 cURL 調用 http 接口。
go run main.go
curl -X POST http://localhost:8080/register \
-d 'email=gopher@88.com&password=123456&username=gopher'
3.總結
本文我們通過一個簡單的用戶中心項目,介紹如何基于 Go kit 開發 Web 項目,為了方便讀者朋友們理解代碼,項目代碼中未使用其他組件,感興趣的讀者朋友可以嘗試完善,例如添加操作數據庫的代碼。