亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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

開關(guān)電源芯片 ? 來源:github ? 作者:zhaoyang ? 2021-08-23 10:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

img

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

反向代理使用場景

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

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

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

SSL 加密:由于與每個客戶端的 SSL 通信會耗費(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)建一個反向代理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 處理請求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 處理所有請求到你的服務(wù)

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

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

}

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

修改響應(yīng)

HttpUtil 反向代理為我們提供了一種非常簡單的機(jī)制來修改我們從服務(wù)器獲得的響應(yīng), 可以根據(jù)你的應(yīng)用場景來緩存或更改此響應(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 方法中看到 ,我們設(shè)置了自定義 Header 頭。同樣,你也可以讀取響應(yīng)體正文,并對其進(jìn)行更改或緩存,然后將其設(shè)置回客戶端。

在 modifyResponse 中,可以返回一個錯誤(如果你在處理響應(yīng)發(fā)生了錯誤), 如果你設(shè)置了 proxy.ErrorHandler, modifyResponse 返回錯誤時會自動調(diào)用 ErrorHandler 進(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)

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”)

}

}

修改請求

你也可以在將請求發(fā)送到服務(wù)器之前對其進(jìn)行修改。在下面的例子中,我們將會在請求發(fā)送到服務(wù)器之前添加了一個 Header 頭。同樣的,你可以在請求發(fā)送之前對其進(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)大,如文章之前所說,它有很多應(yīng)用場景。你可以根據(jù)你的情況對其進(jìn)行自定義。如果遇到任何問題,我非常樂意為你提供幫助。如果你覺得這篇文章有趣,請分享一下,讓更多 gopher 可以閱讀!非常感謝你的閱讀。

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

責(zé)任編輯:haq

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

    關(guān)注

    13

    文章

    10034

    瀏覽量

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

    關(guān)注

    1

    文章

    44

    瀏覽量

    11425

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    何在 buildroot 的 rootfs 顯示當(dāng)前目錄?

    何在 buildroot 的 rootfs 顯示當(dāng)前目錄?
    發(fā)表于 09-03 07:02

    【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】5、安裝sqlite3和使用golang讀寫數(shù)據(jù)庫

    如果想在嵌入式設(shè)備上實(shí)現(xiàn)簡單的設(shè)備管理功能,需要數(shù)據(jù)庫和服務(wù)后端程序。服務(wù)端程序,我更傾向使用golang實(shí)現(xiàn)。 安裝sqlite3,使用ubuntu環(huán)境,可以直接用apt install安裝程序
    發(fā)表于 08-26 00:04

    華為手機(jī)反向無線充電原理

    華為無線反向充電技術(shù)利用電磁感應(yīng)實(shí)現(xiàn)電能共享,支持多設(shè)備兼容,效率高、穩(wěn)定性強(qiáng)。
    的頭像 發(fā)表于 08-10 08:29 ?5611次閱讀
    華為手機(jī)<b class='flag-5'>反向</b>無線充電原理

    代理式AI與AI智能體在不同行業(yè)的實(shí)際應(yīng)用

    代理式 AI 的時代已經(jīng)到來。如今,代理式 AI 已經(jīng)驅(qū)動應(yīng)用邁向深度場景融合與規(guī)?;涞?。這波演進(jìn)浪潮標(biāo)志著 AI 能力向自主執(zhí)行的躍遷。本文將系統(tǒng)解析代理式 AI (Agentic AI
    的頭像 發(fā)表于 07-28 14:28 ?898次閱讀

    使用反向代理,企業(yè)的數(shù)據(jù)到底安不安全?

    “某電商因反向代理配置失誤,3秒泄露10萬訂單數(shù)據(jù)!” “某金融公司被黑*利用Nginx漏洞,內(nèi)網(wǎng)系統(tǒng)遭滲透……” 反向代理(ReverseProxy)作為企業(yè)網(wǎng)絡(luò)架構(gòu)的“守門人”,用
    的頭像 發(fā)表于 05-29 11:11 ?358次閱讀
    使用<b class='flag-5'>反向</b><b class='flag-5'>代理</b>,企業(yè)的數(shù)據(jù)到底安不安全?

    何在Linux配置DNS服務(wù)器

    本文詳細(xì)介紹了如何在Linux配置DNS服務(wù)器,包括DNS工作原理、本地緩存、DNS查詢過程,以及正向和反向查詢的配置。步驟包括服務(wù)器配置、編輯BIND配置文件、添加解析信息和客戶端測試,同時提到了注意事項(xiàng)和常見問題解決方法。
    的頭像 發(fā)表于 05-09 13:38 ?2121次閱讀
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中</b>配置DNS服務(wù)器

    何在S32K146實(shí)現(xiàn)以下功能?

    原來有一個項(xiàng)目芯片是MPC5606B(CodeWarrior編譯器),現(xiàn)在換成S32K146(S32DS ARM),其中有段代碼移植遇到了些問題,請問如何在S32K146實(shí)現(xiàn)以下功能,請幫忙
    發(fā)表于 04-04 08:00

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

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

    在imx93,如何在flexio引腳模擬spi功能?

    何在 flexio 引腳模擬 spi 功能?我看到了實(shí)現(xiàn) I2C 的文檔,但沒有看到 SPI 的文檔。也搜索了內(nèi)核。誰能提供任何文檔或示例來開始仿真 SPI?
    發(fā)表于 03-21 06:59

    冗余電路的概念、作用及如何在設(shè)計(jì)實(shí)現(xiàn)

    以及如何在設(shè)計(jì)實(shí)現(xiàn)這一技術(shù)。 我們來了解一下什么是冗余電路。 簡單來說,冗余電路就是在正常電路之外添加的額外電路或元件。這些額外的部分在正常情況下可能不會工作,但當(dāng)主要電路出現(xiàn)問題時,它們就會介入以確保系統(tǒng)繼續(xù)運(yùn)
    的頭像 發(fā)表于 01-17 09:41 ?1868次閱讀

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

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

    阿里云代理有哪些?

    阿里云作為全球領(lǐng)先的云計(jì)算服務(wù)商,提供多種級別的代理商合作伙伴,以便更好地服務(wù)企業(yè)客戶。不同級別的阿里云代理商在服務(wù)、技術(shù)支持和返傭方面有顯著的差異。本文將重點(diǎn)介紹阿里云代理商的級別和部分優(yōu)秀
    的頭像 發(fā)表于 12-06 15:44 ?1232次閱讀

    深入解析:海外IP代理在跨境電商與數(shù)據(jù)分析的應(yīng)用

    海外IP代理在跨境電商與數(shù)據(jù)分析的應(yīng)用廣泛,其重要性不容忽視。
    的頭像 發(fā)表于 11-20 08:27 ?905次閱讀

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

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

    Golang配置代理方法

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