日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

img

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

反向代理使用場景

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

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

緩存:假設你的實際服務器與用戶所在的地區(qū)距離比較遠,那么你可以在當?shù)夭渴鸱聪虼?,它可以緩存網站內容并為當?shù)赜脩籼峁┓铡?/p>

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

Golang 實現(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

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

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

if err != nil {

panic(err)

}

// handle all requests to your server using the proxy

// 使用 proxy 處理所有請求到你的服務

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

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

}

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

修改響應

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

在 modifyResponse 中,可以返回一個錯誤(如果你在處理響應發(fā)生了錯誤), 如果你設置了 proxy.ErrorHandler, modifyResponse 返回錯誤時會自動調用 ErrorHandler 進行錯誤處理。

// 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ā)送到服務器之前對其進行修改。在下面的例子中,我們將會在請求發(fā)送到服務器之前添加了一個 Header 頭。同樣的,你可以在請求發(fā)送之前對其進行任何更改。

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

}

反向代理非常強大,如文章之前所說,它有很多應用場景。你可以根據你的情況對其進行自定義。如果遇到任何問題,我非常樂意為你提供幫助。如果你覺得這篇文章有趣,請分享一下,讓更多 gopher 可以閱讀!非常感謝你的閱讀。

轉自:h1z3y3.me/posts/simple-and-powerful-reverse-proxy-in-golang/

責任編輯:haq

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

    關注

    14

    文章

    10371

    瀏覽量

    91770
  • 代理
    +關注

    關注

    1

    文章

    44

    瀏覽量

    11462

原文標題:Go 簡單而強大的Reverse Proxy反向代理

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    2026年上海永銘電子代理商會議圓滿落幕:確定的方向,有限的窗口,攜手搶占未來賽道

    總在致辭中點明會議主題:確定的方向,有限的窗口。隨后,會議深入探討了如何在窗口期內完成產品布局,搶占AI、新能源汽車等賽道的先發(fā)優(yōu)勢,實現(xiàn)共贏增長。三大核心內容落
    的頭像 發(fā)表于 03-07 14:55 ?558次閱讀
    2026年上海永銘電子<b class='flag-5'>代理</b>商會議圓滿落幕:確定的方向,有限的窗口,攜手搶占未來賽道

    何在小尺寸陶瓷天線同時實現(xiàn)多頻段覆蓋?

    何在小尺寸陶瓷天線同時實現(xiàn)多頻段覆蓋智能手表、藍牙耳機、物聯(lián)網傳感器……這些設備越來越小巧,功能卻越來越多。以智能手表為例:藍牙連接耳機(2.4GHz)、GPS定位(1.5GHz)、WiFi數(shù)據
    的頭像 發(fā)表于 03-02 14:29 ?259次閱讀
    如<b class='flag-5'>何在</b>小尺寸陶瓷天線<b class='flag-5'>中</b>同時<b class='flag-5'>實現(xiàn)</b>多頻段覆蓋?

    Nginx反向代理和負載均衡配置實戰(zhàn)

    負載均衡則是反向代理的進階玩法。當一臺后端服務器扛不住流量的時候,就需要多臺服務器一起分擔壓力。Nginx負責把請求分發(fā)到不同的服務器上,這就是負載均衡。
    的頭像 發(fā)表于 01-23 13:44 ?994次閱讀

    何在Zephyr RTOS實現(xiàn)延時和計時函數(shù)

    多種延時與計時實現(xiàn)方案,滿足不同應用場景的需求。那么,大家平時都是怎么在MCU程序實現(xiàn)計時函數(shù)、實現(xiàn)延時的呢?
    的頭像 發(fā)表于 12-26 10:32 ?6207次閱讀
    如<b class='flag-5'>何在</b>Zephyr RTOS<b class='flag-5'>中</b><b class='flag-5'>實現(xiàn)</b>延時和計時函數(shù)

    反向代理新玩法?ZeroNews黑科技解讀。

    如果你是一名開發(fā)者或運維,對“反向代理”一定不會陌生。 Nginx、Caddy、Traefik……這些耳熟能詳?shù)墓ぞ撸俏覀兊牡昧χ帧?但它們都有一個前提: 你需要一臺擁有公網IP的服務器。 今天
    的頭像 發(fā)表于 11-05 14:51 ?613次閱讀

    何在VS code配置Zephyr集成開發(fā)環(huán)境

    上一篇文章介紹了如何在VS code中使用瑞薩官方插件為RA芯片創(chuàng)建項目與項目調試,相信大家對RA在VS code的開發(fā)有了基礎的了解。
    的頭像 發(fā)表于 11-05 14:46 ?1817次閱讀
    如<b class='flag-5'>何在</b>VS code<b class='flag-5'>中</b>配置Zephyr集成開發(fā)環(huán)境

    企業(yè)安全訪問網關:ZeroNews反向代理

    花半天時間配置VPN賬號。” 這些場景您是否遇到過? 傳統(tǒng)的VPN(虛擬專用網)在為企業(yè)提供遠程接入能力的同時,其 “全有或全無” 的粗放式網絡接入模式,已成為企業(yè)安全體系的一個巨大裂縫。一旦接入,用戶就如同進入了內網,訪問行為
    的頭像 發(fā)表于 10-14 10:50 ?476次閱讀
    企業(yè)安全訪問網關:ZeroNews<b class='flag-5'>反向</b><b class='flag-5'>代理</b>

    高效反向導通IGBT的原理詳解

    在先進的反向導通絕緣柵雙極晶體管(RCIGBT),低導通電壓降(Vce(sat))和集成二極管正向電壓(VF)對于有效減少導通損耗至關重要。
    的頭像 發(fā)表于 10-10 09:25 ?2601次閱讀
    高效<b class='flag-5'>反向</b>導通IGBT的原理詳解

    何在 buildroot 的 rootfs 顯示當前目錄?

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

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

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

    華為手機反向無線充電原理

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

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

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

    何在多顯卡環(huán)境下配置OLLAMA實現(xiàn)GPU負載均衡

    本文將帶你深入了解如何在多顯卡環(huán)境下配置OLLAMA,實現(xiàn)GPU負載均衡,并分享生產環(huán)境的最佳實踐。無論你是剛接觸GPU集群還是尋求性能優(yōu)化的老手,這篇文章都能給你帶來實用價值。
    的頭像 發(fā)表于 07-24 14:12 ?5026次閱讀

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

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

    何在Linux配置DNS服務器

    本文詳細介紹了如何在Linux配置DNS服務器,包括DNS工作原理、本地緩存、DNS查詢過程,以及正向和反向查詢的配置。步驟包括服務器配置、編輯BIND配置文件、添加解析信息和客戶端測試,同時提到了注意事項和常見問題解決方法。
    的頭像 發(fā)表于 05-09 13:38 ?2801次閱讀
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中</b>配置DNS服務器
    大余县| 蓬莱市| 涡阳县| 太和县| 吉木乃县| 县级市| 乌鲁木齐市| 东阿县| 正阳县| 原阳县| 万年县| 长乐市| 天柱县| 晋州市| 同德县| 龙江县| 祥云县| 宝坻区| 鄯善县| 白水县| 滦平县| 巴彦淖尔市| 新晃| 滨海县| 定日县| 洞口县| 龙里县| 沙湾县| 东海县| 青田县| 马公市| 怀宁县| 鱼台县| 陈巴尔虎旗| 尼玛县| 肇庆市| 郎溪县| 洞口县| 科技| 滦平县| 朝阳县|