精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Option模式和對接層簡化和管理Go項目的外部API

開發 項目管理
如果項目中每次調用API都是像下面這段代碼一樣用原生 http 庫中的方法, 先 new 出一個Request對象,再按照需要一個個設置上面的配置項,最后再發起請求,當然是沒有問題,完全能實現功能。

在項目開發實現功能需求的過程中不可避免的要與外部第三方系統進行交互,這些交互大部分是通過請求API接口來完成的。

前幾節提到但一直沒帶大家用代碼過一遍的Lib層就是負責寫第三方對接邏輯的,通過把跟第三方對接的邏輯限制在Lib層里,讓項目的其他部分不需要關注第三方的邏輯,從而達到每部分都職責分明,這樣項目的代碼多起來后才不會變得臃腫和雜亂。

不過在演示Lib層的使用前我們需要先一起給項目封裝一個好用的HTTP請求工具。

圖片圖片

用Go 實現一個好用的 HTTP 請求工具

Go自帶了的http庫就能發起API調用,為啥我們還要做這個封裝呢?其實主要有以下幾個目的:

  • 簡化 HTTP 請求的發起
  • 利用Option模式用命名參數的方式進行請求的多選項設置
  • header 頭中自動攜帶trace信息,方便內部的二方服務一起做好鏈路追蹤
  • 慢請求的日志記錄
  • 非 200 響應錯誤統一處理

我們一個個來說,首先在項目中發起HTTP請求調用API的時候不同的情況會有不同的設置:

  • Method GET 或者 是POST
  • POST 請求要設置請求Body
  • 超時時間是否要單獨設置
  • Header 頭是否要攜帶的信息
  • 特殊情況下還可能有其他更多的請求設置

如果項目中每次調用API都是像下面這段代碼一樣用原生 http 庫中的方法, 先 new 出一個Request對象,再按照需要一個個設置上面的配置項,最后再發起請求,當然是沒有問題,完全能實現功能。

req, err := http.NewRequest(method, url, bytes.NewReader(reqOpts.data))
req.WithContext(ctx)
req.Header.Add("Content-Type", "application/json")

client := &http.Client{Timeout: 5 * time.Second}
resp, err := client.Do(req)

但就是每次都得寫這一堆代碼,在多人開發的項目中一定會把這些代碼粘來粘去,除此之外像請求日志記錄、請求頭設置追蹤信息等通用操作的代碼每次也都得寫一遍,增加很多冗余不說,一旦忘記了這些后面出問題想排查原因也不好排查。

所以我們必須要封裝一個統一的 HTTP 請求工具方法,把一些通用的基礎工作在工具中都做好避免每次都要記得去手寫那些代碼,從而減少編碼中不必要的精力浪費。

那么要封裝HTTP請求工具就遇到一個問題,我們并不是每次發請求都需要設置這么多參數,那你的工具方法應該怎么設置參數呢?設置少了遇到不滿足的情況還得重新再寫一個多參數版本的工具方法,那誰能保證類似需要加參數的情況會不會再有呢?

而且參數設置的多了,每次使用時用不到的參數也得給傳一個零值才能調用,一旦調用時參數順序傳錯了還會有問題,屬于自己給自己寫BUG的一種常見情況。

用Option模式讓Go支持命名參數

考慮到這些情況后,根據這些痛點,我們利用Golang func 的可變參數特性,結合 Option 模式的設計,讓我們的工具方法支持可變且具名的參數,即擁有下面的兩個能力

  • 用到哪些設置了,調用時再傳那些參數,不需要讓用不到的設置占用參數位置。
  • 利用Option模式讓參數變成具有名稱的參數,不再限定參數的順序。

首先我們在 common/util 下創建 httptool 目錄,其中新增httptool.go 文件。

我們用Option模式是為了設置請求的選項,所以我們在 httptool.go 中先定義一個用于保存請求選項的結構體。

type requestOption struct {
 ctx     context.Context
 timeout time.Duration
 data    []byte
 headers map[string]string
}

func defaultRequestOptions() *requestOption {
 return &requestOption{
  ctx:     context.Background(),
  timeout: 5 * time.Second,
  data:    nil,
  headers: map[string]string{},
 }
}

這個里面的字段可以根據自己的需要再增加。然后我們定義出Option的通用行為:

type Option interface {
 apply(option *requestOption) error
}

type optionFunc func(option *requestOption) error

func (f optionFunc) apply(opts *requestOption) error {
 return f(opts)
}

我們看下面這幾個請求配置選項對應的Option 函數,這里我不寫注釋光看每個函數的名字你們也能看出來他們都是用來設置什么的。

func WithContext(ctx context.Context) Option {
 return optionFunc(func(opts *requestOption) (err error) {
  opts.ctx = ctx
  return
 })
}

func WithTimeout(timeout time.Duration) Option {
 return optionFunc(func(opts *requestOption) (err error) {
  opts.timeout, err = timeout, nil
  return
 })
}

func WithHeaders(headers map[string]string) Option {
 return optionFunc(func(opts *requestOption) (err error) {
  for k, v := range headers {
   opts.headers[k] = v
  }
  return
 })
}

func WithData(data []byte) Option {
 return optionFunc(func(opts *requestOption) (err error) {
  opts.data, err = data, nil
  return
 })
}

optionFunc 把這些 func(opts *requestOption) (err error) 類型函數都轉換成了自己的類型,讓他們成為了Option接口的實現,擁有了apply方法, apply方法的邏輯就是直接調用這些被轉換的函數。

這樣在我們的請求工具方法中,就可以迭代可變參數的實際參數,然后一個個地去調用他們的 apply 方法來構造最終的請求選項, 像下面這樣。

func Request(method string, url string, options ...Option) (httpStatusCode int, respBody []byte, err error) {
 start := time.Now()
 reqOpts := defaultRequestOptions() // 默認的請求選項
 for _, opt := range options {      // 在reqOpts上應用通過options設置的選項
  err = opt.apply(reqOpts)
  if err != nil {
   return
  }
 }
    ...
}

上面這個Request方法就是我們的工具提供的函數,method、url 因為是必填的就不必再整成Option參數了,其他關于請求的設置都可以通過在調用是使用WithXXX()一系列的函數傳參進來。

Request("POST", url, WithTimeout(timeout), WithHeaders(headers), WithData(data))

日志和追蹤頭信息

我們在發起請求的第一個參數都是 context.Context 類型的上下文參數, 這個意圖是為了讓你調用時把請求上下文 gin.Context 傳遞進來,我們好從其中取到一開始種進去的追蹤信息,然后設置到要發起的請求的Header中去。

func Request(method string, url string, options ...Option) (httpStatusCode int, respBody []byte, err error) {
    
    ......
    // 在Header中添加追蹤信息 把內部服務串起來
 traceId, spanId, _ := util.GetTraceInfoFromCtx(reqOpts.ctx)
 reqOpts.headers["traceid"] = traceId
 reqOpts.headers["spanid"] = spanId
 if len(reqOpts.headers) != 0 { // 設置請求頭
  for key, value := range reqOpts.headers {
   req.Header.Add(key, value)
  }
 }
    ......
}

同時因為有了ctx 信息,我們使用項目自己的Logger門面進行日志記錄的時候也會把請求的追蹤信息一并寫到日志信息中去,通過trace、span 信息也能查到項目的一個接口在執行過程中內部發起了哪些API調用?以及得到了什么結果?

func Request(method string, url string, options ...Option) (httpStatusCode int, respBody []byte, err error) {
    
    ......
    // 發起請求
 client := &http.Client{Timeout: reqOpts.timeout}
 resp, err := client.Do(req)
 if err != nil {
  return
 }
 defer resp.Body.Close()
 // 記錄請求日志
 dur := time.Since(start).Seconds()
 if dur >= 3 { // 超過 3s 返回, 記一條 Warn 日志
  log.Warn("HTTP_REQUEST_SLOW_LOG", "method", method, "url", url, "body", reqOpts.data, "reply", respBody, "err", err, "dur/ms", dur)
 } else {
  log.Debug("HTTP_REQUEST_DEBUG_LOG", "method", method, "url", url, "body", reqOpts.data, "reply", respBody, "err", err, "dur/ms", dur)
 }
}

連接池的設置

服務間接口調用,維持穩定數量的長連接,對性能非常有幫助,這就需要我們在Go 的 http Client的連接池特性,該特性需要在創建Client時用 http.Transport 進行設置。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2025-03-07 09:01:14

商品模塊接口項目

2012-02-07 09:52:43

項目管理

2024-11-04 09:02:51

Go項目接口

2022-09-01 10:49:54

物聯網MNO

2025-06-13 08:34:38

2023-10-30 18:59:38

REST API開發

2022-10-09 08:48:13

配置化建造者參數

2025-03-26 00:03:00

Go設計模式

2025-02-06 08:54:45

gockGoHTTP

2024-11-13 09:13:45

2024-01-22 12:46:00

KubernetesAPI接口

2024-10-28 09:04:38

Go項目客戶端

2024-03-12 09:39:23

項目指南

2013-08-14 14:36:07

開源項目

2018-06-29 10:34:40

區塊鏈數字貨幣比特幣

2014-04-23 13:45:40

iOS項目目錄結構開發流程

2022-08-09 12:27:37

API集成微服務

2012-08-29 17:04:36

項目項目管理產品

2025-02-26 09:03:24

2014-04-25 10:13:00

Go語言并發模式
點贊
收藏

51CTO技術棧公眾號

亚州精品天堂中文字幕| 色噜噜狠狠成人中文综合| 99久久精品无码一区二区毛片 | 欧美激情国内偷拍| 懂色av粉嫩av蜜乳av| jizzjizz少妇亚洲水多| 18欧美乱大交hd1984| 国产精品一区二区免费| 日韩中文字幕高清| 欧美天天在线| 亚洲天堂视频在线观看| 永久免费看片在线观看| 不卡av播放| 亚洲蜜臀av乱码久久精品| 久久久精彩视频| 99er热精品视频| 久久综合九色| 国产+成+人+亚洲欧洲| 亚洲天堂av中文字幕| 超碰在线成人| 欧美日韩视频不卡| 国精产品一区一区三区视频| av午夜在线| a美女胸又www黄视频久久| 国产精品精品视频| 日产电影一区二区三区| 婷婷综合亚洲| 国产亚洲欧美aaaa| 亚洲欧美在线不卡| 中文在线综合| 3d动漫精品啪啪1区2区免费| 亚洲熟妇av一区二区三区| 免费影视亚洲| 亚洲猫色日本管| 日本精品一区二区三区视频| 视频污在线观看| 国产精品99久| 亚洲free性xxxx护士白浆| 中文字幕一区二区免费| 久久午夜av| 97在线看免费观看视频在线观看| 午夜国产福利一区二区| 欧美亚洲高清| 亚洲色图25p| 少妇毛片一区二区三区| 老牛影视av一区二区在线观看| 日韩三级在线观看| 久久久久久久久久毛片| 亚洲欧洲日韩精品在线| 欧美性videosxxxxx| 免费在线观看日韩视频| 综合毛片免费视频| 岛国av一区二区三区| 欧美午夜小视频| 草美女在线观看| 亚洲午夜在线电影| 久久av高潮av| 国产啊啊啊视频在线观看| 亚洲精品免费在线观看| 一本一道久久a久久精品综合| 岛国最新视频免费在线观看| 国产日韩欧美制服另类| 日本一区免费观看| 风间由美一区| 国产精品乱人伦| 中文字幕一区二区三区四区五区六区 | 91国在线观看| 天天干在线影院| 巨大黑人极品videos精品| 欧美人动与zoxxxx乱| 中文字幕亚洲影院| 欧美激情精品| 精品va天堂亚洲国产| 五十路六十路七十路熟婆| 日韩大尺度在线观看| 亚洲欧美制服中文字幕| 一二三四在线观看视频| 亚洲午夜精品一区 二区 三区| 久久综合国产精品台湾中文娱乐网| 免费中文字幕在线| 亚洲人体偷拍| 国产精品久久久亚洲| 亚洲图片小说视频| 高清不卡在线观看| 欧美一区二区福利| www免费视频观看在线| 亚洲成人手机在线| 日本爱爱免费视频| 日韩一区二区三区精品| 日韩av综合网| 天堂а√在线中文在线鲁大师| 午夜片欧美伦| 欧美亚洲视频在线观看| 影音先锋国产在线| 成人免费三级在线| 性欧美精品一区二区三区在线播放| 免费黄色网页在线观看| 亚洲大片精品永久免费| 亚洲人辣妹窥探嘘嘘| 一区二区三区四区高清视频| 亚洲色图国产精品| 久久免费小视频| 日韩精品亚洲专区| av在线亚洲男人的天堂| 国产1区2区3区在线| 一区二区三区久久久| 黄色国产小视频| 中文字幕亚洲在线观看| 中文字幕精品一区二区精品| 久久久久97国产| 全国精品久久少妇| 精品国产一区二区三区久久久久久| 国产精品视频一区二区久久| 亚洲午夜精品一区二区三区他趣| 亚洲福利精品视频| 欧洲vs亚洲vs国产| 欧美xxxx做受欧美| 中文字幕在线2018| 久久综合av免费| 国产免费xxx| 91精品国产66| 国产视频久久久久| 国产精选第一页| 国产一区二区三区在线观看精品 | 亚洲国产精品一区二区www在线 | 亚洲精品色婷婷福利天堂| 小早川怜子一区二区的演员表| 亚洲欧美日韩综合国产aⅴ| 99精彩视频| 国产在线观看a视频| 色婷婷精品久久二区二区蜜臀av| 免费黄色a级片| 中文在线日韩| 成人黄色午夜影院| 免费在线你懂的| 欧美色大人视频| 美女爆乳18禁www久久久久久| 在线观看一区视频| 国产精品播放| 性欧美videos高清hd4k| 538在线一区二区精品国产| 五月天婷婷丁香网| 日韩 欧美一区二区三区| 鲁鲁狠狠狠7777一区二区| 成人三级高清视频在线看| 精品日韩一区二区| 久久久久久久久精| 不卡欧美aaaaa| av网站手机在线观看| 波多野结衣在线一区二区| 欧美国产日韩一区二区三区| 亚洲av无码一区二区三区性色| 亚洲精选视频免费看| 超碰中文字幕在线观看| 一二三区不卡| 7777精品久久久大香线蕉小说| 爆操欧美美女| 欧美va亚洲va国产综合| 久久成人国产精品入口| 成人97人人超碰人人99| 黄色国产一级视频| 日韩最新在线| 茄子视频成人在线| 国产鲁鲁视频在线观看免费| 欧美日韩中文国产| 国产麻豆视频在线观看| 懂色av一区二区三区免费看| 伊人成色综合网| 免费欧美激情| 国产区精品在线观看| 黄在线免费看| 亚洲国产精品va在线| 国产69精品久久久久久久久久| 久久久午夜电影| 香蕉视频禁止18| 你懂的视频一区二区| 国产久一道中文一区| 欧美极度另类| 久久在线观看视频| 日韩一级片免费看| 91久久精品一区二区二区| 日日噜噜夜夜狠狠久久波多野| 懂色av中文一区二区三区| 99热成人精品热久久66| 99久精品视频在线观看视频| 99三级在线| 日韩新的三级电影| 毛片精品免费在线观看| 天堂a√中文在线| 欧美日韩dvd在线观看| 国产一级在线视频| 中文无字幕一区二区三区| 小日子的在线观看免费第8集| 国产视频亚洲| 欧美aaa在线观看| 欧美尿孔扩张虐视频| 国产视频福利一区| 99thz桃花论族在线播放| 中文字幕亚洲第一| 人人妻人人澡人人爽久久av| 欧美熟乱第一页| 精品少妇一二三区| 国产精品久久久久久久久免费相片 | 国产精品成人免费观看| 久久综合九色综合欧美98| 日韩视频在线观看一区二区三区| 国产精品免费看| 2021国产视频| 色琪琪久久se色| 好看的日韩精品视频在线| 四虎国产精品永久在线国在线 | 妺妺窝人体色www聚色窝仙踪| 久久蜜桃一区二区| 精品国产乱码久久久久夜深人妻| 美女视频黄 久久| 欧美色图色综合| 女人色偷偷aa久久天堂 | 亚洲欧美综合国产精品一区| 鲁鲁狠狠狠7777一区二区| 天堂久久av| 成人性生交xxxxx网站| 另类专区亚洲| 97久久精品在线| 亚洲精品白浆| 日韩一区二区三区xxxx| 久久电影视频| 精品无人国产偷自产在线| 韩国av永久免费| 91精品国产综合久久久久久漫画| 精品无码一区二区三区的天堂| 亚洲国产日韩精品| 免费一级a毛片夜夜看 | 国产成人自拍网| 一区二区三区四区毛片| 蜜臀91精品一区二区三区| 十八禁视频网站在线观看| 亚洲日本国产| 日日摸日日碰夜夜爽无码| 国内久久视频| 男人添女荫道口喷水视频| 欧美日韩午夜| 伊人久久在线观看| 国内精品亚洲| 青青青在线视频播放| 亚洲国产二区| 国产真人做爰毛片视频直播| 激情文学一区| 黄色片网址在线观看| 亚洲精选成人| 欧美女人性生活视频| 久久亚洲风情| 999精品视频在线| 男男视频亚洲欧美| 中文字幕一区久久| 国产成人在线观看免费网站| 亚洲国产欧美日韩在线| 成人精品鲁一区一区二区| 亚洲婷婷在线观看| 久久在线观看免费| 伊人网在线视频观看| 国产欧美一区二区三区在线老狼| 国产传媒国产传媒| 1区2区3区国产精品| 曰本女人与公拘交酡| 亚洲mv在线观看| 黄色片免费观看视频| 日本高清成人免费播放| 在线观看免费观看在线| 日韩精品一区在线| 西西人体44www大胆无码| 亚洲女人天堂网| 在线日本视频| 久久99热精品这里久久精品| 黄色污网站在线观看| 国产精品久久999| 美国十次综合久久| 国精产品一区二区| 日韩激情图片| 欧美日韩午夜爽爽| 国产日韩欧美高清免费| www欧美激情| 国产精品中文字幕欧美| 菠萝菠萝蜜网站| 国产精品久久久久久户外露出| 99视频只有精品| 婷婷久久综合九色综合绿巨人| 销魂美女一区二区| 欧美一区二区性放荡片| 五月婷在线视频| 精品国产一区二区三区在线观看| 国产精品偷拍| 国产精品视频内| 高清精品xnxxcom| 色综合电影网| 18成人免费观看视频| 国产原创精品在线| 91丨九色丨尤物| 综合五月激情网| 一本久久综合亚洲鲁鲁五月天| 91在线观看喷潮| 精品亚洲一区二区三区在线观看 | 日韩一区在线看| 国产精品国产三级国产专区52| 欧美欧美午夜aⅴ在线观看| 精品人妻一区二区三区含羞草| 亚洲欧美激情在线视频| 成人影院www在线观看| 国产精品91久久| 国产乱人伦精品一区| 性欧美18一19内谢| 久久只有精品| 97人妻天天摸天天爽天天| 亚洲综合精品自拍| 一级黄色片视频| 亚洲香蕉av在线一区二区三区| 51精品在线| 亚洲伊人久久综合| 国产精品99视频| 爆乳熟妇一区二区三区霸乳| 91亚洲精品久久久蜜桃| 69av视频在线| 欧美精品色综合| 国产系列在线观看| 青青草精品毛片| 精品中国亚洲| 国产精品久久久久久久乖乖| 加勒比av一区二区| 女教师淫辱の教室蜜臀av软件| 色综合亚洲欧洲| 色中色在线视频| 91精品国产色综合久久不卡98口 | 欧美亚洲日本在线| 欧美高清视频一二三区| h视频在线免费| 国产精品爱久久久久久久| 亚洲综合小说图片| 午夜精品久久久久久久无码| 成人h精品动漫一区二区三区| 免费人成年激情视频在线观看| 日韩一区二区精品| 丝袜在线观看| 成人看片在线| 黄色国产精品| 91成人在线观看喷潮蘑菇| 亚洲综合一区二区三区| 性色av蜜臀av| 欧美日韩国产成人在线观看| 色妞ww精品视频7777| 黄色成人在线免费观看| 国产成人av资源| 久久免费小视频| 亚洲精品国产福利| xxxxxx欧美| 亚洲国产精品视频一区| 看电视剧不卡顿的网站| 亚洲视频重口味| 日韩美女在线视频| 欧美xxx黑人xxx水蜜桃| 国产亚洲第一区| 午夜亚洲视频| 中文字幕黄色网址| 欧美一区二区精品久久911| 欧美videosex性极品hd| 国产一区二区三区av在线| 亚洲欧美日韩视频二区| 在线观看日本黄色| 欧美一区二区三区在线| 免费不卡av| 欧美凹凸一区二区三区视频| 日本欧美一区二区三区| 国产美女久久久久久| 亚洲第一精品久久忘忧草社区| 欧美天堂视频| 伊人久久大香线蕉成人综合网| 国产激情一区二区三区| 日本中文字幕免费| 在线看欧美日韩| 97久久超碰| 久久九九国产视频| 亚洲色图20p| 日本一区二区三区在线观看视频| 国产精品极品美女粉嫩高清在线| 香蕉视频国产精品| a天堂视频在线观看| 欧美三级乱人伦电影| 欧美xxxx免费虐| 日本一区二区不卡高清更新| 国内不卡的二区三区中文字幕| 日韩成人免费观看| 中文字幕在线看视频国产欧美在线看完整| 警花av一区二区三区| koreanbj精品视频一区| 综合久久久久综合| 少妇激情av一区二区| 亚洲www永久成人夜色| 校园春色综合网| 午夜爱爱毛片xxxx视频免费看| 日韩av一区在线| 国产一区二区三区国产精品| 熟女性饥渴一区二区三区|