" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Go HTTP客戶端打造高性能服務(wù)

 更新時(shí)間:2021年12月09日 10:18:48   作者:kuteng  
大多數(shù)語言都有提供各自的 HTTP 客戶端,本文將動(dòng)手實(shí)踐如何使用Go語言發(fā)起HTTP請(qǐng)求,并討論其中有可能遇到的問題。具有一定的參考價(jià)值,感興趣的可以了解一下

HTTP(超文本傳輸協(xié)議)是一種用于客戶端和服務(wù)器之間傳輸數(shù)據(jù)的通信協(xié)議。如果想要訪問服務(wù)器資源,HTTP 請(qǐng)求是必不可少的。Go 語言里,net/http 包附帶了默認(rèn)配置,我們可以適當(dāng)調(diào)整便可以獲得高性能。

大多數(shù)語言都有提供各自的 HTTP 客戶端,文章接下來部分我們將動(dòng)手實(shí)踐如何使用 Go 語言發(fā)起 HTTP 請(qǐng)求,并討論其中有可能遇到的問題。

在做 Go 項(xiàng)目時(shí),我就意識(shí)到 HTTP 客戶端如果配置不正確可能會(huì)隨時(shí)導(dǎo)致服務(wù)器崩潰。

在使用 HTTP Client 時(shí),我觀察到一些問題并總結(jié)出相應(yīng)的解決方案,如下所示:

問題一:默認(rèn)的 HTTP Client

默認(rèn)情況下,net/http 包自帶的 HTTP 客戶端不帶超時(shí)時(shí)間。如果你使用的是默認(rèn)的客戶端 http.DefaultClient(),這個(gè)是不帶超時(shí)時(shí)間的。

假如你請(qǐng)求外部的 API 掛了,發(fā)出的請(qǐng)求沒響應(yīng)導(dǎo)致連接一直出于打開狀態(tài)。隨著請(qǐng)求數(shù)越來越多,連接數(shù)隨之增加,導(dǎo)致耗盡服務(wù)器的資源,最后服務(wù)器隨之崩潰。

解決辦法:不要使用默認(rèn)的 HTTP 客戶端,根據(jù)實(shí)際情況設(shè)置超時(shí)時(shí)間。

var httpClient = &http.Client{
  Timeout: time.Second * 10,
}

對(duì)于 API 接口,超時(shí)時(shí)間建議不需要超過 10s,如果請(qǐng)求在 10s 內(nèi)沒有返回,則請(qǐng)求會(huì)取消并報(bào)錯(cuò):request canceled (Client.Timeout exceeded …) 。

問題二:默認(rèn)的 Http Transport

默認(rèn)情況下,HTTP 客戶端會(huì)維護(hù)一個(gè)連接池。當(dāng)請(qǐng)求完成之后,連接會(huì)保持打開狀態(tài)直到空閑時(shí)間超時(shí)(默認(rèn)是 90s)自動(dòng)斷開。如果有請(qǐng)求過來,會(huì)優(yōu)先使用已打開的連接而不是創(chuàng)建新的連接,請(qǐng)求完成之后,連接會(huì)返還到連接池中。

使用連接池將使用最少的服務(wù)器資源處理更多的 API 請(qǐng)求。

如果沒有自定義 HTTP 客戶端的 transport,將會(huì)使用默認(rèn)配置。

HTTP Transport 的默認(rèn)配置如下:

var DefaultTransport RoundTripper = &Transport{
    ...
    MaxIdleConns:          100,
    IdleConnTimeout:       90 * time.Second,
    ...
}

 
const DefaultMaxIdleConnsPerHost = 2

MaxIdleConns 表示連接池大小,是可以打開的最大連接數(shù),默認(rèn)值是 100。

參數(shù) DefaultMaxIdleConnsPerHost 的默認(rèn)值是 2,表示每個(gè)主機(jī)(host)的打開連接數(shù)。這意味著,連接池中 100 個(gè)連接只有兩個(gè)連接分配給該主機(jī)。

隨著請(qǐng)求增多,但是只有兩個(gè)請(qǐng)求被處理,其他請(qǐng)求只能被迫等待并進(jìn)入 TIME_WAIT 狀態(tài)。請(qǐng)求增多,進(jìn)入 TIME_WAIT 狀態(tài)的連接數(shù)增多,消耗越來越多的服務(wù)器資源,當(dāng)達(dá)到服務(wù)器瓶頸時(shí),服務(wù)器將會(huì)崩潰。

解決辦法:提高 MaxIdleConnsPerHost 數(shù)值,不要使用默認(rèn)的 Transport。

t := http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConns = 100
t.MaxConnsPerHost = 100
t.MaxIdleConnsPerHost = 100

httpClient = &http.Client{
  Timeout:   10 * time.Second,
  Transport: t,
}

通過增加每個(gè)主機(jī)的連接數(shù)和空閑連接數(shù),就有助于提高性能并以最少的服務(wù)器資源處理更多請(qǐng)求。

可以根據(jù)服務(wù)器資源和實(shí)際需求適當(dāng)增加連接池大小和每個(gè)主機(jī)的連接數(shù)。

總結(jié)

這篇文章中,我們圍繞 net/http 包討論了默認(rèn)配置的一些問題。通過更改 HTTP 客戶端的一些默認(rèn)設(shè)置,在生產(chǎn)環(huán)境中也可以獲得高性能的 HTTP 客戶端。

到此這篇關(guān)于使用Go HTTP客戶端打造高性能服務(wù)的文章就介紹到這了,更多相關(guān)Go HTTP客戶端高性能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang http使用踩過的坑與填坑指南

    golang http使用踩過的坑與填坑指南

    這篇文章主要介紹了golang http使用踩過的坑與填坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang中select語句的簡(jiǎn)單實(shí)例

    golang中select語句的簡(jiǎn)單實(shí)例

    Go的select語句是一種僅能用于channl發(fā)送和接收消息的專用語句,此語句運(yùn)行期間是阻塞的,下面這篇文章主要給大家介紹了關(guān)于golang中select語句的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Go語言使用Timeout Context取消任務(wù)的實(shí)現(xiàn)

    Go語言使用Timeout Context取消任務(wù)的實(shí)現(xiàn)

    本文主要介紹了Go語言使用Timeout Context取消任務(wù)的實(shí)現(xiàn),包括基本的任務(wù)取消和控制HTTP客戶端請(qǐng)求的超時(shí),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 利用Go語言開發(fā)文件操作工具輕松處理所有文件

    利用Go語言開發(fā)文件操作工具輕松處理所有文件

    在后端開發(fā)中,文件操作是一個(gè)非常常見但又容易出錯(cuò)的場(chǎng)景,本文小編要向大家介紹一個(gè)強(qiáng)大的 Go 語言文件操作工具庫,它能幫你輕松處理各種文件操作場(chǎng)景
    2025-03-03
  • golang微服務(wù)框架基礎(chǔ)Gin基本路由使用詳解

    golang微服務(wù)框架基礎(chǔ)Gin基本路由使用詳解

    這篇文章主要為大家介紹了golang微服務(wù)框架Gin基本路由的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 本地使用Docker搭建go開發(fā)環(huán)境的全過程

    本地使用Docker搭建go開發(fā)環(huán)境的全過程

    最近想學(xué)習(xí)一下golang,自己之前一直把環(huán)境全部安裝在docker上,所以這次也想把golang的環(huán)境安裝在docker上,下面這篇文章主要給大家介紹了關(guān)于本地使用Docker搭建go開發(fā)環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 淺談Golang的Work Stealing機(jī)制

    淺談Golang的Work Stealing機(jī)制

    Go的運(yùn)行時(shí)系統(tǒng)使用了一種名為Work Stealing的調(diào)度策略來分配Goroutine到可用線程上執(zhí)行,本文主要介紹了淺談Golang的Work Stealing機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • go編譯標(biāo)簽build?tag注釋里語法詳解

    go編譯標(biāo)簽build?tag注釋里語法詳解

    這篇文章主要為大家介紹了go編譯標(biāo)簽build?tag注釋里語法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang os.Eixt使用示例

    golang os.Eixt使用示例

    在Go語言中,os.Exit函數(shù)用于立即終止程序并返回一個(gè)指定的退出狀態(tài)碼,本文就來介紹一下golang os.Eixt使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • go語言如何使用gin庫實(shí)現(xiàn)SSE長(zhǎng)連接

    go語言如何使用gin庫實(shí)現(xiàn)SSE長(zhǎng)連接

    所謂長(zhǎng)連接指在一個(gè)TCP連接上可以連續(xù)發(fā)送多個(gè)數(shù)據(jù)包,在TCP連接保持期間,如果沒有數(shù)據(jù)包發(fā)送,需要雙方發(fā)檢測(cè)包以維持此連接,一般需要自己做在線維持,下面這篇文章主要給大家介紹了關(guān)于go語言如何使用gin庫實(shí)現(xiàn)SSE長(zhǎng)連接的相關(guān)資料,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

义乌市| 神农架林区| 静乐县| 九龙城区| 临汾市| 寻乌县| 扎赉特旗| 定西市| 新建县| 佛冈县| 玉龙| 葫芦岛市| 罗江县| 建昌县| 乳山市| 安福县| 古丈县| 江达县| 平凉市| 明星| 安多县| 鲜城| 建阳市| 平度市| 桃江县| 雷波县| 江永县| 卓资县| 青海省| 峡江县| 玛曲县| 榆社县| 金门县| 衡阳市| 长治市| 福建省| 博兴县| 天镇县| 阜康市| 屏边| 道真|