在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在Golang中實(shí)現(xiàn)反向代理

開(kāi)關(guān)電源芯片 ? 來(lái)源:github ? 作者:zhaoyang ? 2021-08-23 10:22 ? 次閱讀

【導(dǎo)讀】在本文中,我們將了解反向代理,它的應(yīng)用場(chǎng)景以及如何在 Golang 中實(shí)現(xiàn)它。

反向代理是位于 Web 服務(wù)器前面并將客戶端(例如 Web 瀏覽器)的請(qǐng)求轉(zhuǎn)發(fā)到 Web 服務(wù)器的服務(wù)器。它們讓你可以控制來(lái)自客戶端的請(qǐng)求和來(lái)自服務(wù)器的響應(yīng),然后我們可以利用這個(gè)特點(diǎn), 可以增加緩存、做一些提高網(wǎng)站的安全性措施等。

在我們深入了解有關(guān)反向代理之前,讓我們快速看普通代理(也稱為正向代理)和反向代理之間的區(qū)別。

在正向代理中,代理代表原始客戶端從另一個(gè)網(wǎng)站檢索數(shù)據(jù)。它位于客戶端(瀏覽器)前面,并確保沒(méi)有后端服務(wù)器直接與客戶端通信。所有客戶端的請(qǐng)求都通過(guò)代理被轉(zhuǎn)發(fā),因此服務(wù)器只與這個(gè)代理通信(服務(wù)器會(huì)認(rèn)為代理是它的客戶端)。在這種情況下,代理可以隱藏真正的客戶端。

img

另一方面,反向代理位于后端服務(wù)器的前面,確保沒(méi)有客戶端直接與服務(wù)器通信。所有客戶端請(qǐng)求都會(huì)通過(guò)反向代理發(fā)送到服務(wù)器,因此客戶端始終只與反向代理通信, 而從不會(huì)直接與實(shí)際服務(wù)器通信。在這種情況下,代理可以隱藏后端服務(wù)器。幾個(gè)常見(jiàn)的反向代理有 Nginx, HAProxy。

反向代理使用場(chǎng)景

負(fù)載均衡(Load balancing):反向代理可以提供負(fù)載均衡解決方案,將傳入的流量均勻地分布在不同的服務(wù)器之間,以防止單個(gè)服務(wù)器過(guò)載。

防止安全攻擊:由于真正的后端服務(wù)器永遠(yuǎn)不需要暴露公共 IP,所以 DDoS 等攻擊只能針對(duì)反向代理進(jìn)行, 這能確保在網(wǎng)絡(luò)攻擊中盡量多的保護(hù)你的資源,真正的后端服務(wù)器始終是安全的。

緩存:假設(shè)你的實(shí)際服務(wù)器與用戶所在的地區(qū)距離比較遠(yuǎn),那么你可以在當(dāng)?shù)夭渴鸱聪虼恚梢跃彺婢W(wǎng)站內(nèi)容并為當(dāng)?shù)赜脩籼峁┓?wù)。

SSL 加密:由于與每個(gè)客戶端的 SSL 通信會(huì)耗費(fèi)大量的計(jì)算資源,因此可以使用反向代理處理所有與 SSL 相關(guān)的內(nèi)容, 然后釋放你真正服務(wù)器上的寶貴資源。

Golang 實(shí)現(xiàn)

import (

“l(fā)og”

“net/http”

“net/http/httputil”

“net/url”

// NewProxy takes target host and creates a reverse proxy// NewProxy 拿到 targetHost 后,創(chuàng)建一個(gè)反向代理func NewProxy(targetHost string) (*httputil.ReverseProxy, error) {

url, err := url.Parse(targetHost)

if err != nil {

return nil, err

}

return httputil.NewSingleHostReverseProxy(url), nil

}

// ProxyRequestHandler handles the http request using proxy// ProxyRequestHandler 使用 proxy 處理請(qǐng)求func ProxyRequestHandler(proxy *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {

return func(w http.ResponseWriter, r *http.Request) {

proxy.ServeHTTP(w, r)

}

}

func main() {

// initialize a reverse proxy and pass the actual backend server url here

// 初始化反向代理并傳入真正后端服務(wù)的地址

proxy, err := NewProxy(“http://my-api-server.com”)

if err != nil {

panic(err)

}

// handle all requests to your server using the proxy

// 使用 proxy 處理所有請(qǐng)求到你的服務(wù)

http.HandleFunc(“/”, ProxyRequestHandler(proxy))

log.Fatal(http.ListenAndServe(“:8080”, nil))

}

是的沒(méi)錯(cuò)!這就是在 Go 中創(chuàng)建一個(gè)簡(jiǎn)單的反向代理所需的全部?jī)?nèi)容。我們使用標(biāo)準(zhǔn)庫(kù) net/http/httputil 創(chuàng)建了一個(gè)單主機(jī)的反向代理。到達(dá)我們代理服務(wù)器的任何請(qǐng)求都會(huì)被代理到位于 http://my-api-server.com。如果你對(duì) Go 比較熟悉,這個(gè)代碼的實(shí)現(xiàn)一目了然。

修改響應(yīng)

HttpUtil 反向代理為我們提供了一種非常簡(jiǎn)單的機(jī)制來(lái)修改我們從服務(wù)器獲得的響應(yīng), 可以根據(jù)你的應(yīng)用場(chǎng)景來(lái)緩存或更改此響應(yīng),讓我們看看應(yīng)該如何實(shí)現(xiàn):

// NewProxy takes target host and creates a reverse proxyfunc NewProxy(targetHost string) (*httputil.ReverseProxy, error) {

url, err := url.Parse(targetHost)

if err != nil {

return nil, err

}

proxy := httputil.NewSingleHostReverseProxy(url)

proxy.ModifyResponse = modifyResponse()

return proxy, nil

}

func modifyResponse() func(*http.Response) error {

return func(resp *http.Response) error {

resp.Header.Set(“X-Proxy”, “Magical”)

return nil

}

}

可以在 modifyResponse 方法中看到 ,我們?cè)O(shè)置了自定義 Header 頭。同樣,你也可以讀取響應(yīng)體正文,并對(duì)其進(jìn)行更改或緩存,然后將其設(shè)置回客戶端。

在 modifyResponse 中,可以返回一個(gè)錯(cuò)誤(如果你在處理響應(yīng)發(fā)生了錯(cuò)誤), 如果你設(shè)置了 proxy.ErrorHandler, modifyResponse 返回錯(cuò)誤時(shí)會(huì)自動(dòng)調(diào)用 ErrorHandler 進(jìn)行錯(cuò)誤處理。

// NewProxy takes target host and creates a reverse proxyfunc NewProxy(targetHost string) (*httputil.ReverseProxy, error) {

url, err := url.Parse(targetHost)

if err != nil {

return nil, err

}

proxy := httputil.NewSingleHostReverseProxy(url)

proxy.ModifyResponse = modifyResponse()

proxy.ErrorHandler = errorHandler()

return proxy, nil

}

func errorHandler() func(http.ResponseWriter, *http.Request, error) {

return func(w http.ResponseWriter, req *http.Request, err error) {

fmt.Printf(“Got error while modifying response: %v

”, err)

return

}

}

func modifyResponse() func(*http.Response) error {

return func(resp *http.Response) error {

return errors.New(“response body is invalid”)

}

}

修改請(qǐng)求

你也可以在將請(qǐng)求發(fā)送到服務(wù)器之前對(duì)其進(jìn)行修改。在下面的例子中,我們將會(huì)在請(qǐng)求發(fā)送到服務(wù)器之前添加了一個(gè) Header 頭。同樣的,你可以在請(qǐng)求發(fā)送之前對(duì)其進(jìn)行任何更改。

// NewProxy takes target host and creates a reverse proxyfunc NewProxy(targetHost string) (*httputil.ReverseProxy, error) {

url, err := url.Parse(targetHost)

if err != nil {

return nil, err

}

proxy := httputil.NewSingleHostReverseProxy(url)

originalDirector := proxy.Director

proxy.Director = func(req *http.Request) {

originalDirector(req)

modifyRequest(req)

}

proxy.ModifyResponse = modifyResponse()

proxy.ErrorHandler = errorHandler()

return proxy, nil

}

func modifyRequest(req *http.Request) {

req.Header.Set(“X-Proxy”, “Simple-Reverse-Proxy”)

}

完整代碼

package main

import (

“errors”

“fmt”

“l(fā)og”

“net/http”

“net/http/httputil”

“net/url”

// NewProxy takes target host and creates a reverse proxyfunc NewProxy(targetHost string) (*httputil.ReverseProxy, error) {

url, err := url.Parse(targetHost)

if err != nil {

return nil, err

}

proxy := httputil.NewSingleHostReverseProxy(url)

originalDirector := proxy.Director

proxy.Director = func(req *http.Request) {

originalDirector(req)

modifyRequest(req)

}

proxy.ModifyResponse = modifyResponse()

proxy.ErrorHandler = errorHandler()

return proxy, nil

}

func modifyRequest(req *http.Request) {

req.Header.Set(“X-Proxy”, “Simple-Reverse-Proxy”)

}

func errorHandler() func(http.ResponseWriter, *http.Request, error) {

return func(w http.ResponseWriter, req *http.Request, err error) {

fmt.Printf(“Got error while modifying response: %v

”, err)

return

}

}

func modifyResponse() func(*http.Response) error {

return func(resp *http.Response) error {

return errors.New(“response body is invalid”)

}

}

// ProxyRequestHandler handles the http request using proxyfunc ProxyRequestHandler(proxy *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {

return func(w http.ResponseWriter, r *http.Request) {

proxy.ServeHTTP(w, r)

}

}

func main() {

// initialize a reverse proxy and pass the actual backend server url here

proxy, err := NewProxy(“http://my-api-server.com”)

if err != nil {

panic(err)

}

// handle all requests to your server using the proxy

http.HandleFunc(“/”, ProxyRequestHandler(proxy))

log.Fatal(http.ListenAndServe(“:8080”, nil))

}

反向代理非常強(qiáng)大,如文章之前所說(shuō),它有很多應(yīng)用場(chǎng)景。你可以根據(jù)你的情況對(duì)其進(jìn)行自定義。如果遇到任何問(wèn)題,我非常樂(lè)意為你提供幫助。如果你覺(jué)得這篇文章有趣,請(qǐng)分享一下,讓更多 gopher 可以閱讀!非常感謝你的閱讀。

轉(zhuǎn)自:h1z3y3.me/posts/simple-and-powerful-reverse-proxy-in-golang/

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9335

    瀏覽量

    86134
  • 代理
    +關(guān)注

    關(guān)注

    1

    文章

    44

    瀏覽量

    11236

原文標(biāo)題:Go 簡(jiǎn)單而強(qiáng)大的Reverse Proxy反向代理

文章出處:【微信號(hào):gh_3980db2283cd,微信公眾號(hào):開(kāi)關(guān)電源芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Nginx代理轉(zhuǎn)發(fā)實(shí)戰(zhàn):零基礎(chǔ)掌握服務(wù)器流量分發(fā)技巧

    Nginx 是最常用的反向代理工具之一,一個(gè)指令 proxy_pass搞定反向代理,對(duì)于接口代理、負(fù)載均衡很是實(shí)用,但 proxy_pass
    的頭像 發(fā)表于 12-09 12:28 ?1072次閱讀

    Python編程:處理網(wǎng)絡(luò)請(qǐng)求的代理技術(shù)

    在網(wǎng)絡(luò)編程代理技術(shù)扮演著至關(guān)重要的角色,尤其在處理網(wǎng)絡(luò)請(qǐng)求時(shí)。通過(guò)代理服務(wù)器,我們可以實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā)、緩存、負(fù)載均衡以及安全控制等功能。Python作為一種功能強(qiáng)大的編程語(yǔ)言,為提
    的頭像 發(fā)表于 11-12 07:23 ?231次閱讀

    Golang配置代理方法

    由于一些客觀原因的存在,我們開(kāi)發(fā) Golang 項(xiàng)目的過(guò)程總會(huì)碰到無(wú)法下載某些依賴包的問(wèn)題。這不是一個(gè)小問(wèn)題,因?yàn)槟愕墓ぷ鲿?huì)被打斷,即便你使用各種神通解決了問(wèn)題,很可能這時(shí)你的線程已經(jīng)切換到其他的事情上了(痛恨思路被打斷!)。所以最好是一開(kāi)始我們就重視這個(gè)問(wèn)題,并一勞永逸的解決它。
    的頭像 發(fā)表于 11-11 11:17 ?440次閱讀
    <b class='flag-5'>Golang</b>配置<b class='flag-5'>代理</b>方法

    【米爾NXP i.MX 93開(kāi)發(fā)板試用評(píng)測(cè)】4、使用golang搭建Modbus 服務(wù)器

    Modbus是一種廣泛使用的串行通信協(xié)議,主要用于工業(yè)環(huán)境的電子設(shè)備之間的通信。Modbus服務(wù)器通常是指在Modbus通信網(wǎng)絡(luò)中提供數(shù)據(jù)和控制服務(wù)的設(shè)備或軟件。在Modbus協(xié)議,服務(wù)器通常
    發(fā)表于 09-21 22:51

    何在反向降壓-升壓拓?fù)渲惺褂肨PS6290x

    電子發(fā)燒友網(wǎng)站提供《如何在反向降壓-升壓拓?fù)渲惺褂肨PS6290x.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 10:07 ?0次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>反向</b>降壓-升壓拓?fù)渲惺褂肨PS6290x

    何在反激式拓?fù)?b class='flag-5'>中實(shí)現(xiàn)軟啟動(dòng)

    電子發(fā)燒友網(wǎng)站提供《如何在反激式拓?fù)?b class='flag-5'>中實(shí)現(xiàn)軟啟動(dòng).pdf》資料免費(fèi)下載
    發(fā)表于 09-04 11:09 ?0次下載
    如<b class='flag-5'>何在</b>反激式拓?fù)?b class='flag-5'>中</b><b class='flag-5'>實(shí)現(xiàn)</b>軟啟動(dòng)

    何在FPGA實(shí)現(xiàn)隨機(jī)數(shù)發(fā)生器

    分享如何在Xilinx Breadboardable Spartan-7 FPGA, CMOD S7實(shí)現(xiàn)4位偽隨機(jī)數(shù)發(fā)生器(PRNGs)。
    的頭像 發(fā)表于 08-06 11:20 ?787次閱讀
    如<b class='flag-5'>何在</b>FPGA<b class='flag-5'>中</b><b class='flag-5'>實(shí)現(xiàn)</b>隨機(jī)數(shù)發(fā)生器

    何在FPGA實(shí)現(xiàn)狀態(tài)機(jī)

    在FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)實(shí)現(xiàn)狀態(tài)機(jī)是一種常見(jiàn)的做法,用于控制復(fù)雜的數(shù)字系統(tǒng)行為。狀態(tài)機(jī)能夠根據(jù)當(dāng)前的輸入和系統(tǒng)狀態(tài),決定下一步的動(dòng)作和新的狀態(tài)。這里,我們將詳細(xì)探討如何在FPGA設(shè)計(jì)
    的頭像 發(fā)表于 07-18 15:57 ?743次閱讀

    何在Tensorflow實(shí)現(xiàn)反卷積

    ,扮演著重要角色。以下將詳細(xì)闡述如何在TensorFlow實(shí)現(xiàn)反卷積,包括其理論基礎(chǔ)、TensorFlow實(shí)現(xiàn)方式、以及實(shí)際應(yīng)用
    的頭像 發(fā)表于 07-14 10:46 ?720次閱讀

    何在PyTorch實(shí)現(xiàn)LeNet-5網(wǎng)絡(luò)

    等人提出,主要用于手寫(xiě)數(shù)字識(shí)別任務(wù)(如MNIST數(shù)據(jù)集)。下面,我將詳細(xì)闡述如何在PyTorch從頭開(kāi)始實(shí)現(xiàn)LeNet-5網(wǎng)絡(luò),包括網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)、參數(shù)初始化、前向傳播、損失函數(shù)選擇、優(yōu)化器配置以及訓(xùn)練流程等方面。
    的頭像 發(fā)表于 07-11 10:58 ?880次閱讀

    何在SDK實(shí)現(xiàn)WPS?

    我不知道如何在SDK實(shí)現(xiàn)WPS。SDK 附帶了一個(gè)示例,但它似乎對(duì)我不起作用。它編譯了,但什么也沒(méi)發(fā)生。從 uart 輸出,我可以看到 wps 甚至沒(méi)有啟動(dòng)。 我真的真的需要幫助
    發(fā)表于 07-11 07:12

    如何使用nginx反向代理功能?保姆級(jí)教程!

    一關(guān)于nginxnginx是一款高性能的開(kāi)源Web服務(wù)器軟件,也可以用于反向代理、負(fù)載均衡等,并且具有高性能、低內(nèi)存消耗等優(yōu)點(diǎn)。本文我們主要講解關(guān)于nginx的反向代理功能,并在服務(wù)器
    的頭像 發(fā)表于 06-21 08:21 ?726次閱讀
    如何使用nginx<b class='flag-5'>反向</b><b class='flag-5'>代理</b>功能?保姆級(jí)教程!

    何在PSoC 5LP實(shí)現(xiàn)MODBUS RTU(主站)?

    我正在開(kāi)發(fā) PSoC 5LP 板 (CY8CKIT-050),想知道如何在 PSoC 5LP 實(shí)現(xiàn) MODBUS RTU(主站)。
    發(fā)表于 05-20 07:01

    有誰(shuí)知道如何在熱敏打印機(jī)實(shí)現(xiàn)圖片的灰階打印效果嗎?

    有誰(shuí)知道如何在熱敏打印機(jī)實(shí)現(xiàn)圖片的灰階打印效果。 現(xiàn)在基本上文字打印,圖片打印功能都已開(kāi)發(fā)結(jié)束,圖片打印現(xiàn)在用的是點(diǎn)陣打印的方法。想增加灰階打印的效果。 有哪個(gè)大神做過(guò)相關(guān)方面開(kāi)發(fā),知道如何
    發(fā)表于 04-24 15:43

    Golang為何舍棄三元運(yùn)算符

    golang不存在?:運(yùn)算符的原因是因?yàn)檎Z(yǔ)言設(shè)計(jì)者已經(jīng)預(yù)見(jiàn)到三元運(yùn)算符經(jīng)常被用來(lái)構(gòu)建一些極其復(fù)雜的表達(dá)式。雖然使用if進(jìn)行替代會(huì)讓代碼顯得更長(zhǎng),但這毫無(wú)疑問(wèn)可讀性更強(qiáng)。
    的頭像 發(fā)表于 04-03 15:13 ?768次閱讀
    主站蜘蛛池模板: 五月花亚洲 | 97伊人 | 黄色大片视频在线观看 | 成人爽a毛片在线视频 | 精品三级内地国产在线观看 | 天天欲色| 亚洲精品视频在线 | 99国内视频 | 成年男人午夜片免费观看 | 2020天天操 | 深夜视频免费看 | 日本不卡视频免费 | 欧美一级视频在线高清观看 | 亚洲jjzzjjzz在线观看 | 四虎国产精品视频免费看 | 狠狠狠狼鲁欧美综合网免费 | 日本一区视频在线播放 | 国产成人精品日本亚洲专 | 俺色也| 日本一区二区三区免费看 | 香蕉久久夜色精品国产2020 | 丁香六月综合网 | 免费在线观看的视频 | 四虎影库在线播放 | 7799国产精品久久久久99 | 二级黄绝大片中国免费视频0 | 黄色视屏免费在线观看 | 上课被同桌摸下面做羞羞 | 四虎永久在线精品影院 | 精品国产柚木在线观看 | 在线观看免费视频网站色 | 国产成人综合亚洲怡春院 | 黄色网址大全免费 | 国产牛牛 | 黄色免费网站在线 | 国产国产人免费人成成免视频 | 欧美成人天天综合在线视色 | 天堂中文字幕在线 | 国产做a爰片久久毛片a | 色网址在线观看 | 九色亚洲|