成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

gRPC 中的錯誤處理:構(gòu)建更健壯、更可靠的微服務!

開發(fā) 前端
gRPC 提供了靈活的錯誤處理機制,允許你以結(jié)構(gòu)化的方式傳遞錯誤信息,幫助你構(gòu)建更健壯、更可靠的微服務。通過正確使用 status.Status? 和 status.WithDetails 方法,你可以確保你的錯誤信息清晰易懂,并能被客戶端輕松理解和處理。

gRPC 在設計上鼓勵將錯誤處理作為服務的一部分,而不是將其隱藏在消息體中。每個 gRPC 服務天生就擁有一個錯誤返回值,作為專門的錯誤傳輸通道。所有 gRPC 中的錯誤返回值應該要么是 nil,要么是 由 status.Status 生成的錯誤。這樣可以確保調(diào)用方可以輕松識別錯誤。

1. 基本用法

簡單地返回 Go 錯誤并不能被下游客戶端識別。正確的做法是:

  • 調(diào)用 status.New 方法并傳入合適的錯誤代碼以生成 status.Status 對象。
  • 調(diào)用 status.Err 方法生成調(diào)用方可以識別的錯誤,然后返回。
st := status.New(codes.NotFound, "some description")  
err := st.Err()

傳入的錯誤代碼類型為 codes.Code。或者,你可以使用 status.Error 方法,它可以避免手動轉(zhuǎn)換。

err := status.Error(codes.NotFound, "some description")

2. 高級用法

上述錯誤有一個限制:codes.Code 定義的錯誤代碼只涵蓋了某些場景,無法全面表達業(yè)務中遇到的各種錯誤場景。

gRPC 提供了一種機制來補充錯誤中的信息:status.WithDetails 方法。

客戶端可以通過將錯誤轉(zhuǎn)換回 status.Status 并使用 status.Details 方法直接獲取內(nèi)容。

status.Details 返回一個切片,它是 interface{} 的切片。但是,Go 會自動執(zhí)行類型轉(zhuǎn)換,允許通過斷言直接使用。

服務器端示例

  • 生成 status.Status 對象
  • 填充額外的錯誤信息
func ErrorWithDetails() error {  
    st := status.Newf(codes.Internal, fmt.Sprintf("something went wrong: %v", "api.Getter"))  
    v := &errdetails.PreconditionFailure_Violation{ //errDetails  
       Type:        "test",  
       Subject:     "12",  
       Description: "32",  
    }  
    br := &errdetails.PreconditionFailure{}  
    br.Violations = append(br.Violations, v)  
    st, _ = st.WithDetails(br)  
    return st.Err()  
}

客戶端端示例

  • 在 RPC 錯誤后解析錯誤信息
  • 通過斷言直接獲取錯誤詳細信息
resp, err := odinApp.CreatePlan(cli.StaffId.AssetId, gentRatePlanMeta(cli.StaffId))  
  
  if status.Code(err) != codes.InvalidArgument {  
    logger.Error("create plan error:%v", err)  
  } else {  
    for _, d := range status.Convert(err).Details() {  
      //   
      switch info := d.(type) {  
      case *errdetails.QuotaFailure:  
        logger.Info("Quota failure: %s", info)  
      case *errdetails.PreconditionFailure:  
        detail := d.(*errdetails.PreconditionFailure).Violations  
        for _, v1 := range detail {  
          logger.Info(fmt.Sprintf("details: %+v", v1))  
        }  
      case *errdetails.ResourceInfo:  
        logger.Info("ResourceInfo: %s", info)  
  
      case *errdetails.BadRequest:  
        logger.Info("ResourceInfo: %s", info)  
  
      default:  
        logger.Info("Unexpected type: %s", info)  
      }  
    }  
  }  
  logger.Infof("create plan success,resp=%v", resp)

原理

這些錯誤是如何傳遞給調(diào)用方客戶端的呢?它們被放置在元數(shù)據(jù)中,然后在 HTTP 頭部中。元數(shù)據(jù)以鍵值對的形式存在。在錯誤傳輸中,鍵是一個固定值:grpc-status-details-bin。值由 proto 編碼,并且是二進制安全的。大多數(shù)語言都實現(xiàn)了這種機制。

圖片圖片

注意

gRPC 對響應頭有限制,最大為 8K,因此錯誤不能太大。

參考

  • Protocol Buffers Tutorial[1]
  • errdetails[2]

總結(jié)

gRPC 提供了靈活的錯誤處理機制,允許你以結(jié)構(gòu)化的方式傳遞錯誤信息,幫助你構(gòu)建更健壯、更可靠的微服務。通過正確使用 status.Status 和 status.WithDetails 方法,你可以確保你的錯誤信息清晰易懂,并能被客戶端輕松理解和處理。

參考資料

[1] Protocol Buffers Tutorial: https://protobuf.dev/getting-started/gotutorial/

[2] errdetails: https://pkg.go.dev/google.golang.org/genproto/googleapis/rpc/errdetails

責任編輯:武曉燕 來源: 源自開發(fā)者
相關推薦

2015-05-04 14:12:43

2018-12-03 08:00:00

微服務gRPC

2013-05-07 10:11:28

2022-10-17 00:14:55

微服務稅mock代理服務

2018-05-14 17:16:57

BSI云計算標準

2023-12-26 22:05:53

并發(fā)代碼goroutines

2021-04-14 07:08:14

Nodejs錯誤處理

2016-09-07 20:28:17

MySQL存儲數(shù)據(jù)庫

2023-09-19 23:30:25

單元測試代碼

2025-02-10 09:49:00

2014-11-17 10:05:12

Go語言

2023-08-31 08:50:46

Scrapy網(wǎng)絡爬取

2021-04-29 09:02:44

語言Go 處理

2023-10-28 16:30:19

Golang開發(fā)

2022-06-07 08:19:30

gRPCBallerina微服務

2024-09-23 08:10:00

.NET開發(fā)

2021-08-11 13:54:19

微服務系統(tǒng)架構(gòu)開發(fā)者

2023-10-26 12:05:14

Golang開發(fā)

2020-04-26 19:12:29

shell腳本Linux

2024-10-10 08:34:34

事務外包模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 影音av| www.五月婷婷.com | 狠狠综合网 | 欧美一级在线观看 | 成人在线中文字幕 | 欧美电影免费观看 | 日韩成人在线播放 | 免费毛片网站在线观看 | 亚洲精品一区二区三区丝袜 | 国产精品美女一区二区 | 亚洲一区二区三区免费在线观看 | 精品国产乱码久久久久久88av | 国产精品mv在线观看 | 国产福利91精品一区二区三区 | 欧美日韩国产三级 | 国内精品久久精品 | 免费观看av | 久久av一区 | 午夜tv免费观看 | 羞羞免费网站 | 夜夜久久 | 精品一区二区三区在线观看国产 | 国产做爰| 黄色成人av | 久久久国产一区二区三区 | 欧美一级黄视频 | 综合久久综合久久 | 成人在线精品视频 | 在线播放中文字幕 | 日韩一区二区在线视频 | 91人人澡人人爽 | 国产精品久久久久久久久久了 | 在线播放中文字幕 | 视频一区二区三区四区五区 | 狠狠草视频| 久久久性色精品国产免费观看 | 亚洲成人自拍 | 久久精彩视频 | 日韩欧美一二三区 | 久久精品日产第一区二区三区 | 日韩精品免费视频 |