企業(yè)項(xiàng)目遷移go-zero的方法教程

這篇文章主要介紹“企業(yè)項(xiàng)目遷移go-zero的方法教程”,在日常操作中,相信很多人在企業(yè)項(xiàng)目遷移go-zero的方法教程問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”企業(yè)項(xiàng)目遷移go-zero的方法教程”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、綏德網(wǎng)站維護(hù)、網(wǎng)站推廣。

gateway service

gateway 中我做了一些自定義,在端請(qǐng)求我們后臺(tái)接口情況下,雖然多數(shù)情況是不需要關(guān)心錯(cuò)誤碼的,但是避免不了要某些場(chǎng)景還是需要根據(jù)固定錯(cuò)誤碼去做特殊處理,我自己定義了一個(gè)錯(cuò)誤類,這個(gè)錯(cuò)誤類只在 gateway 中使用:

err.go:

package xerr

import "fmt"

type CodeError struct {
   errCode int
   errMsg  string
}

// 屬性
func (e *CodeError) GetErrCode() int {
   return e.errCode
}

func (e *CodeError) GetErrMsg() string {
   return e.errMsg
}

func (e *CodeError) Error() string {
   return fmt.Sprintf("ErrCode:%d,ErrMsg:%s", e.errCode, e.errMsg)
}

func New(errCode int, errMsg string) *CodeError {
   return &CodeError{errCode: errCode, errMsg: errMsg}
}

func NewErrCode(errCode int) *CodeError {
   return &CodeError{errCode: errCode, errMsg: MapErrMsg(errCode)}
}

func NewErrMsg(errMsg string) *CodeError {
   return &CodeError{errCode: BAD_REUQEST_ERROR, errMsg: errMsg}
}

errmsg.go

package xerr

var message map[int]string

func init()  {
   message = make(map[int]string)
   message[OK] = "SUCCESS"
   message[BAD_REUQEST_ERROR] = "服務(wù)器繁忙,請(qǐng)稍后再試"
   message[REUQES_PARAM_ERROR] = "參數(shù)錯(cuò)誤"
   message[USER_NOT_FOUND] = "用戶不存在"
}

func MapErrMsg(errcode int) string {
   if msg, ok := message[errcode]; ok {
      return msg
   } else {
      return "服務(wù)器繁忙,請(qǐng)稍后再試"
   }
}

errcode.go

package xerr

// 成功返回
const OK = 200

// 全局錯(cuò)誤碼
// 前3位代表業(yè)務(wù),后三位代表具體功能
const BAD_REUQEST_ERROR = 100001
const REUQES_PARAM_ERROR = 100002

// 用戶模塊
const USER_NOT_FOUND = 200001

我將三個(gè)文件統(tǒng)一放在 lib/xerr 目錄

企業(yè)項(xiàng)目遷移go-zero的方法教程

有了錯(cuò)誤碼還不行,還要定義統(tǒng)一返回http的結(jié)果,goctl 生成的默認(rèn)的是挺好的,但是沒(méi)法符合我這種返回自定義錯(cuò)誤碼需求,于是我自己有寫(xiě)了一個(gè)統(tǒng)一返回結(jié)果的文件:

httpresult:

package xhttp

import (
   "fishtwo/lib/xerr"
   "fmt"
   "github.com/tal-tech/go-zero/core/logx"
   "github.com/tal-tech/go-zero/rest/httpx"
   "google.golang.org/grpc/status"
   "net/http"
   "github.com/pkg/errors"
)

// http方法
func HttpResult(r *http.Request,w http.ResponseWriter,resp interface{},err error)  {
   if err == nil {
      // 成功返回
      r:= Success(resp)
      httpx.WriteJson(w, http.StatusOK, r)
   } else {
      // 錯(cuò)誤返回
      errcode := xerr.BAD_REUQEST_ERROR
      errmsg := "服務(wù)器繁忙,請(qǐng)稍后再試"
      if e,ok := err.(*xerr.CodeError);ok{
         // 自定義CodeError
         errcode = e.GetErrCode()
         errmsg = e.GetErrMsg()
      } else {
         originErr := errors.Cause(err) // err類型
         if gstatus, ok := status.FromError(originErr);ok{
            // grpc err錯(cuò)誤
            errmsg = gstatus.Message()
         }
      }
      logx.WithContext(r.Context()).Error("【GATEWAY-SRV-ERR】 : %+v ",err)

      httpx.WriteJson(w, http.StatusBadRequest, Error(errcode,errmsg))
   }
}

// http參數(shù)錯(cuò)誤返回
func ParamErrorResult(r *http.Request,w http.ResponseWriter,err error)  {
   errMsg := fmt.Sprintf("%s ,%s", xerr.MapErrMsg(xerr.REUQES_PARAM_ERROR), err.Error())
   httpx.WriteJson(w, http.StatusBadRequest, Error(xerr.REUQES_PARAM_ERROR,errMsg))
}

responsebean

package xhttp

type (
   NullJson struct {}

   ResponseSuccessBean struct {
      Code int         `json:"code"`
      Msg  string      `json:"msg"`
      Data interface{} `json:"data"`
   }
)

func Success(data interface{}) *ResponseSuccessBean {
   return &ResponseSuccessBean{200, "OK", data}
}


type ResponseErrorBean struct {
   Code int         `json:"code"`
   Msg  string      `json:"msg"`
}

func Error(errCode int,errMsg string) *ResponseErrorBean {
   return &ResponseErrorBean{errCode, errMsg}
}

放在 lib/xhttp下

企業(yè)項(xiàng)目遷移go-zero的方法教程

然后改造了internal/handler/下通過(guò)goctl生成的代碼:

企業(yè)項(xiàng)目遷移go-zero的方法教程

當(dāng)然你會(huì)說(shuō),每次生成完都要手動(dòng)去改,好麻煩!

當(dāng)當(dāng)當(dāng)當(dāng)~~~ goctltemplate 來(lái)咯 https://www.yuque.com/tal-tech/go-zero/mkpuit

然后修改 ~/.goctl/api/handler.tpl:

package handler

import (
	 "net/http"

	 {{.ImportPackages}}
)

func {{.HandlerName}}(ctx *svc.ServiceContext) http.HandlerFunc {
   return func(w http.ResponseWriter, r *http.Request) {
      {{if .HasRequest}}var req types.{{.RequestType}}
      if err := httpx.Parse(r, &req); err != nil {
         xhttp.ParamErrorResult(r,w,err)
         return
      }{{end}}

      l := logic.New{{.LogicType}}(r.Context(), ctx)
      resp, err := l.Login(req)
      xhttp.HttpResult(r,w,resp,err)
   }
}

在重新生成看看,是不是就 beautiful 了,哈哈

然后在說(shuō)我們的 gateway log,如果眼神好的用戶,在上面的 httpresult.go 中已經(jīng)看到了 log 的身影:

企業(yè)項(xiàng)目遷移go-zero的方法教程

是的是的,這樣處理就可以啦,這樣只要有錯(cuò)誤就會(huì)打印日志了,go-zero 已經(jīng)把 trace-id 帶進(jìn)去了,啥?trace-id 不知道是啥?嗯,其實(shí)就是把一次請(qǐng)求通過(guò)此 id 串聯(lián)起來(lái),比如你 user-api 調(diào)用 user->srv 或者其他 srv,那要把他們這一次請(qǐng)求都串聯(lián)起來(lái),需要一個(gè)唯一標(biāo)識(shí)別,這個(gè) id 就是做這個(gè),做鏈路追蹤有很多,比如 jaeger、zipkin

RPC service

企業(yè)項(xiàng)目遷移go-zero的方法教程

modelrpc 服務(wù)中,官方文檔推薦是將 model 放在 services 目錄下,與每個(gè) rpc 服務(wù)一層,但是個(gè)人感覺(jué)每個(gè) model 對(duì)應(yīng)一張表,一張表只能由一個(gè)服務(wù)去控制,哪個(gè)服務(wù)控制這張表就哪個(gè)服務(wù)擁有控制這個(gè) model 權(quán)利,其他服務(wù)想訪問(wèn)就要通過(guò) grpc,這是個(gè)人的想法,所以我把每個(gè)服務(wù)自己管控的 model 放在了 internal

enum:另外我在服務(wù)下加了 enum 枚舉目錄,因?yàn)槠渌?rpc 服務(wù)或者 api 服務(wù)會(huì)調(diào)用這個(gè)枚舉去比對(duì),我就放在 internal 外部

企業(yè)項(xiàng)目遷移go-zero的方法教程

到此,關(guān)于“企業(yè)項(xiàng)目遷移go-zero的方法教程”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

分享標(biāo)題:企業(yè)項(xiàng)目遷移go-zero的方法教程
本文網(wǎng)址:http://muchs.cn/article18/jpdhgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT企業(yè)建站、外貿(mào)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、用戶體驗(yàn)、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)