欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go實(shí)踐反向代理ReverseProxy解析

 更新時(shí)間:2023年04月17日 10:35:23   作者:小雄Ya  
這篇文章主要為大家介紹了Go實(shí)踐反向代理示例ReverseProxy解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

近期在處理一個(gè)關(guān)于網(wǎng)關(guān)的需求,主要是對(duì)用戶的請(qǐng)求轉(zhuǎn)發(fā)到后端的服務(wù)器集群中。整個(gè)設(shè)計(jì)思路其實(shí)還是很簡(jiǎn)單,通過(guò)用戶請(qǐng)求過(guò)來(lái)的路徑轉(zhuǎn)發(fā)到相應(yīng)的后端服務(wù)器上。比如A和B兩個(gè)服務(wù),當(dāng)訪問(wèn)test.cn:8080 時(shí)網(wǎng)關(guān)將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)A,當(dāng)訪問(wèn)test.cn:8080/images 時(shí)網(wǎng)關(guān)把請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)B吧。本文主要是實(shí)踐下 Go 提供的 httputil 包中的ReverseProxy類型,它可以幫助我們快速地實(shí)現(xiàn)HTTP反向代理。

ReverseProxy

ReverseProxy類型是一個(gè)HTTP處理器,用于將客戶端的請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)HTTP服務(wù)器上。ReverseProxy有兩個(gè)主要的字段:Director和Transport。

  • Director函數(shù):用于修改請(qǐng)求的URL和Header,以便將請(qǐng)求發(fā)送到正確的后端服務(wù)器上。
Director func(*http.Request)

可以看到 Director 函數(shù)是一個(gè)回調(diào)函數(shù),傳遞的參數(shù) Http請(qǐng)求,所在在該函數(shù)中,可以修改請(qǐng)求路徑將其改成真正要請(qǐng)求的服務(wù)地址,也可以對(duì) Header 字段進(jìn)行增加、刪除或修改。

  • Transport字段:用于控制如何與后端服務(wù)器通信。Transport字段是非必選字段,如果未指定,則將使用默認(rèn)的http.Transport。通過(guò) Transport字段可以控制服務(wù)之間如何建立連接,服務(wù)通信的證書驗(yàn)證以及設(shè)置如何失敗重試請(qǐng)求。就是設(shè)置對(duì)大連接數(shù),最大空閑連接數(shù)和超時(shí)時(shí)間等。

ReverseProxy 例子

下面是一個(gè)簡(jiǎn)單的示例,實(shí)現(xiàn)將來(lái)自localhost:8080的請(qǐng)求轉(zhuǎn)發(fā)到localhost:8888上:

func main() {
	// 創(chuàng)建反向代理
	proxy := httputil.NewSingleHostReverseProxy(&url.URL{
		Scheme: "http",
		Host:   "localhost:8888",
	})
	// 創(chuàng)建HTTP服務(wù)器
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello, world!")
	})
	// 將反向代理和HTTP服務(wù)器綁定在一起
	http.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
		proxy.ServeHTTP(w, r)
	})
	// 啟動(dòng)HTTP服務(wù)器
	if err := http.ListenAndServe(":8080", nil); err != nil {
		panic(err)
	}
}

另外啟動(dòng)一個(gè)端口為 8888的服務(wù),其中提供一個(gè) /api 接口

func main() {
	http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello, From 8888!")
	})
	var err any
	if err = http.ListenAndServe(":8888", nil); err != nil {
		panic(err)
	}
}

在上面的示例中,我們首先創(chuàng)建了一個(gè)反向代理,并將其配置為將請(qǐng)求發(fā)送到localhost:8888。接下來(lái),我們創(chuàng)建了一個(gè)HTTP服務(wù)器,并將其與反向代理綁定在一起。當(dāng)客戶端請(qǐng)求URL以“/api/”開(kāi)頭時(shí),服務(wù)器將使用反向代理將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器上。如果客戶端請(qǐng)求的URL不以“/api/”開(kāi)頭,則服務(wù)器將返回“Hello, world!”的字符串。

當(dāng)我們運(yùn)行該程序并向localhost:8080/api發(fā)送請(qǐng)求時(shí),就可以看看到來(lái)自后端服務(wù)器localhost:8888 的響應(yīng)。結(jié)果如下圖所示:

結(jié)論

使用Go語(yǔ)言的httputil.ReverseProxy,我們可以非常輕松地實(shí)現(xiàn)HTTP反向代理。通過(guò)在Director函數(shù)中修改請(qǐng)求的URL和Header,我們可以將請(qǐng)求發(fā)送到正確的后端服務(wù)器上。如果需要,我們還可以配置傳輸實(shí)現(xiàn)來(lái)控制如何與后端服務(wù)器通信。

以上就是Go實(shí)踐反向代理ReverseProxy解析的詳細(xì)內(nèi)容,更多關(guān)于Go反向代理ReverseProxy的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go語(yǔ)言中數(shù)組,切片和映射的使用

    詳解Go語(yǔ)言中數(shù)組,切片和映射的使用

    Arrays (數(shù)組), Slices (切片) 和 Maps (映射) 是常見(jiàn)的一類數(shù)據(jù)結(jié)構(gòu)。這篇文章將為大家詳細(xì)介紹一下Go語(yǔ)言中數(shù)組,切片和映射的使用,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用介紹

    Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用介紹

    這篇文章主要介紹了Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-05-05
  • 詳解Go語(yǔ)言中的iface和eface

    詳解Go語(yǔ)言中的iface和eface

    Go 是 Google 開(kāi)發(fā)的一種編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言,這篇文章主要介紹了Go語(yǔ)言中的iface和eface,需要的朋友可以參考下
    2023-07-07
  • Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go?1.21新增的內(nèi)置函數(shù)分別是?min、max?和?clear,這篇文章主要帶大家一起了解一下這幾個(gè)函數(shù)的用途和使用示例,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • GoFrame框架gcache的緩存控制淘汰策略實(shí)踐示例

    GoFrame框架gcache的緩存控制淘汰策略實(shí)踐示例

    這篇文章主要為大家介紹了GoFrame框架gcache的緩存控制淘汰策略的實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 使用Go語(yǔ)言發(fā)送郵件的示例代碼

    使用Go語(yǔ)言發(fā)送郵件的示例代碼

    很多朋友想試試用Go語(yǔ)言發(fā)送郵件,所以接下來(lái)小編給大家介紹一下如何用Go語(yǔ)言發(fā)送郵件,文中通過(guò)代碼實(shí)例講解的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • golang求連續(xù)子數(shù)組的最大和實(shí)例

    golang求連續(xù)子數(shù)組的最大和實(shí)例

    這篇文章主要介紹了golang求連續(xù)子數(shù)組的最大和實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • go語(yǔ)言中的Carbon庫(kù)時(shí)間處理技巧

    go語(yǔ)言中的Carbon庫(kù)時(shí)間處理技巧

    這篇文章主要介紹了go語(yǔ)言中的Carbon庫(kù)時(shí)間處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • golang 中獲取字符串個(gè)數(shù)的方法

    golang 中獲取字符串個(gè)數(shù)的方法

    這篇文章主要介紹了golang 中獲取字符串個(gè)數(shù) ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Go代碼檢查的推薦工具及使用詳解

    Go代碼檢查的推薦工具及使用詳解

    這篇文章主要為大家介紹了Go代碼檢查的推薦工具及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論