精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

如何在Golang中實現反向代理

開關電源芯片 ? 來源:github ? 作者:zhaoyang ? 2021-08-23 10:22 ? 次閱讀

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

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

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

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

img

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

反向代理使用場景

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

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

緩存:假設你的實際服務器與用戶所在的地區距離比較遠,那么你可以在當地部署反向代理,它可以緩存網站內容并為當地用戶提供服務。

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

Golang 實現

import (

“log”

“net/http”

“net/http/httputil”

“net/url”

// NewProxy takes target host and creates a reverse proxy// NewProxy 拿到 targetHost 后,創建一個反向代理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 中創建一個簡單的反向代理所需的全部內容。我們使用標準庫 net/http/httputil 創建了一個單主機的反向代理。到達我們代理服務器的任何請求都會被代理到位于 http://my-api-server.com。如果你對 Go 比較熟悉,這個代碼的實現一目了然。

修改響應

HttpUtil 反向代理為我們提供了一種非常簡單的機制來修改我們從服務器獲得的響應, 可以根據你的應用場景來緩存或更改此響應,讓我們看看應該如何實現:

// 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 中,可以返回一個錯誤(如果你在處理響應發生了錯誤), 如果你設置了 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”)

}

}

修改請求

你也可以在將請求發送到服務器之前對其進行修改。在下面的例子中,我們將會在請求發送到服務器之前添加了一個 Header 頭。同樣的,你可以在請求發送之前對其進行任何更改。

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

“log”

“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

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

    關注

    12

    文章

    9028

    瀏覽量

    85194
  • 代理
    +關注

    關注

    1

    文章

    44

    瀏覽量

    11200

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

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

收藏 人收藏

    評論

    相關推薦

    Python編程:處理網絡請求的代理技術

    在網絡編程代理技術扮演著至關重要的角色,尤其在處理網絡請求時。通過代理服務器,我們可以實現請求的轉發、緩存、負載均衡以及安全控制等功能。Python作為一種功能強大的編程語言,為提
    的頭像 發表于 11-12 07:23 ?137次閱讀

    Golang配置代理方法

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

    何在反向降壓-升壓拓撲中使用TPS6290x

    電子發燒友網站提供《如何在反向降壓-升壓拓撲中使用TPS6290x.pdf》資料免費下載
    發表于 09-13 10:07 ?0次下載
    如<b class='flag-5'>何在</b><b class='flag-5'>反向</b>降壓-升壓拓撲中使用TPS6290x

    何在反激式拓撲實現軟啟動

    電子發燒友網站提供《如何在反激式拓撲實現軟啟動.pdf》資料免費下載
    發表于 09-04 11:09 ?0次下載
    如<b class='flag-5'>何在</b>反激式拓撲<b class='flag-5'>中</b><b class='flag-5'>實現</b>軟啟動

    何在FPGA實現隨機數發生器

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

    何在FPGA實現狀態機

    在FPGA(現場可編程門陣列)實現狀態機是一種常見的做法,用于控制復雜的數字系統行為。狀態機能夠根據當前的輸入和系統狀態,決定下一步的動作和新的狀態。這里,我們將詳細探討如何在FPGA設計
    的頭像 發表于 07-18 15:57 ?493次閱讀

    何在Tensorflow實現反卷積

    ,扮演著重要角色。以下將詳細闡述如何在TensorFlow實現反卷積,包括其理論基礎、TensorFlow實現方式、以及實際應用
    的頭像 發表于 07-14 10:46 ?549次閱讀

    何在PyTorch實現LeNet-5網絡

    等人提出,主要用于手寫數字識別任務(如MNIST數據集)。下面,我將詳細闡述如何在PyTorch從頭開始實現LeNet-5網絡,包括網絡架構設計、參數初始化、前向傳播、損失函數選擇、優化器配置以及訓練流程等方面。
    的頭像 發表于 07-11 10:58 ?702次閱讀

    何在SDK實現WPS?

    我不知道如何在SDK實現WPS。SDK 附帶了一個示例,但它似乎對我不起作用。它編譯了,但什么也沒發生。從 uart 輸出,我可以看到 wps 甚至沒有啟動。 我真的真的需要幫助
    發表于 07-11 07:12

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

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

    何在PSoC 5LP實現MODBUS RTU(主站)?

    我正在開發 PSoC 5LP 板 (CY8CKIT-050),想知道如何在 PSoC 5LP 實現 MODBUS RTU(主站)。
    發表于 05-20 07:01

    Golang為何舍棄三元運算符

    golang不存在?:運算符的原因是因為語言設計者已經預見到三元運算符經常被用來構建一些極其復雜的表達式。雖然使用if進行替代會讓代碼顯得更長,但這毫無疑問可讀性更強。
    的頭像 發表于 04-03 15:13 ?674次閱讀

    如何使用Golang連接MySQL

    首先我們來看如何使用Golang連接MySQL。
    的頭像 發表于 01-08 09:42 ?3261次閱讀
    如何使用<b class='flag-5'>Golang</b>連接MySQL

    Golang接口的作用和應用場景

    Golang(Go)作為一門現代的靜態類型編程語言,提供了許多強大的特性,其中之一便是接口(interface)。接口是Golang的一個核心概念,它具有廣泛的應用場景,可以幫助開發者實現
    的頭像 發表于 12-05 10:44 ?1097次閱讀

    mybatis接口動態代理原理

    MyBatis是一款輕量級的Java持久化框架,它通過XML或注解配置的方式,將數據庫操作與SQL語句解耦,提供了一種簡單、靈活的數據訪問方式。在MyBatis,使用動態代理技術來實現接口的
    的頭像 發表于 12-03 11:52 ?912次閱讀