golang restful 架構之 go-swagger

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

restful 是這些年的高頻詞彙了,各大互連網公司也都紛紛推出了自己的 restful api,其實 restful 和 thrift,grpc 類似,就是一種協議,但是這種協議有點特殊的就是使用 http 介面,返回的對象一般是 json 格式,這樣有個好處,就是可以供前端的 js 直接調用,使用非常方便,但 http 本身並不是一個高效的協議,後端的內部通訊還是使用 grpc 或者 thrift 可以獲得更高的效能

其實如果只是要用 http 返回 json 本身並不是一件很難的事情,不用任何架構,golang 本身也能很方便做到,但是當你有很多 api 的時候,這些 api 的維護和管理就會變得很複雜,你自己都無法記住這些 api 應該填什麼參數,返回什麼,當然你可以花很多時間去維護一份介面文檔,這樣不僅耗時而且很難保證文檔的即時性,準確性以及一致性

swagger 有一整套規範來定義一個介面檔案,類似於 thrift 和 proto 檔案,定義了服務的請求內容和返回內容,同樣也有工具可以產生各種不同語言的架構代碼,在 golang 裡面我們使用 go-swagger 這個工具,這個工具還提供了額外的功能,可以可視化顯示這個介面,方便閱讀

下面通過一個例子來簡單介紹一下這個架構的使用,還是之前的點贊評論系統:https://github.com/hatlonely/...

go-swagger 使用方法

api 定義檔案

首先需要寫一個 api 定義檔案,這裡我只展示其中一個介面 countlike,請求中帶有某篇文章,返回點贊的次數

paths:  /countlike:    get:      tags:        - like      summary: 有多少贊      description: ''      operationId: countLike      consumes:        - application/json      produces:        - application/json      parameters:        - name: title          in: query          description: 文章標題          required: true          type: string      responses:        '200':          description: 成功          schema:            $ref: '#/definitions/CountLikeModel'        '500':          description: 內部錯誤          schema:            $ref: '#/definitions/ErrorModel'definitions:  CountLikeModel:    type: object    properties:      count:        type: integer      title:        type: string        example: golang json 效能分析  ErrorModel:    type: object    properties:      message:        type: string        example: error message      code:        type: integer        example: 400

這個是 yaml 文法,有點像去掉了括弧的 json

這裡完整地定義了要求方法、請求參數、正常返回介面、異常返回結果,有了這個檔案只需要執行下面命令就能產生架構代碼了

swagger generate server -f api/comment_like/comment_like.yaml

還可以下面這個命令可視化查看這個介面檔案

swagger serve api/comment_like/comment_like.yaml

這個命令依賴 swagger 工具,可以通過下面命令擷取

Mac

brew tap go-swagger/go-swaggerbrew install go-swagger

Linux

go get -u github.com/go-swagger/go-swagger/cmd/swaggerexport PATH=$GOPATH/bin:$PATH

執行完了之後,你發現多了幾個檔案夾,其中 cmd 目錄裡麵包含 main 函數,是整個程式的入口,restapi 檔案夾下麵包含協議相關代碼,其中 configure_xxx.go 是需要特別關注的,你需要在這個檔案裡面實現你具體的商務邏輯

現在你就其實已經可以運行程式了,go run cmd/comment-like-server/main.go,在瀏覽器裡面訪問一下你的 api,會返回一個錯誤資訊,告訴你 api 還沒有實現,下面就來實現一下吧

商務邏輯實現

api.LikeCountLikeHandler = like.CountLikeHandlerFunc(func(params like.CountLikeParams) middleware.Responder {    count, err := comment_like.CountLike(params.Title)    if err != nil {        return like.NewCountLikeInternalServerError().WithPayload(&models.ErrorModel{            Code: http.StatusInternalServerError,            Message: err.Error(),        })    }    return like.NewCountLikeOK().WithPayload(&models.CountLikeModel{        Count: count,        Title: params.Title,    })})

你只需要在這些 handler 裡面實現自己的商務邏輯即可,這裡對協議的封裝非常好,除了商務邏輯以及打包返回,沒有多餘的邏輯

再次運行,現在返回已經正常了

統一處理

如果你對請求有一些操作需要統一處理,比如輸出統一的日誌之類的,可以重寫這個函數,也在 configure_xxx.go 這個檔案中

func setupGlobalMiddleware(handler http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Access-Control-Allow-Origin", "*")        handler.ServeHTTP(w, r)    })}

這裡我統一設定了一下頭部,解決跨域訪問問題

參考連結

  • go-swagger 官方文檔:https://goswagger.io
  • go-swagger github:https://github.com/go-swagger...
  • OpenApi 2.0:https://github.com/OAI/OpenAP...
轉載請註明出處
本文連結:http://hatlonely.github.io/20...
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.