成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > 1行Go代碼實(shí)現(xiàn)反向代理的示例

1行Go代碼實(shí)現(xiàn)反向代理的示例

熱門標(biāo)簽:廣州呼叫中心外呼系統(tǒng) 南通如皋申請(qǐng)開通400電話 地圖標(biāo)注的汽車標(biāo) 江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 高德地圖標(biāo)注口訣 浙江高速公路地圖標(biāo)注 中國地圖標(biāo)注省會(huì)高清 西部云谷一期地圖標(biāo)注 學(xué)海導(dǎo)航地圖標(biāo)注

暫且放下你的編程語言來瞻仰下我所見過的最棒的標(biāo)準(zhǔn)庫。

為項(xiàng)目選擇編程語言和挑選你最愛的球隊(duì)不一樣。應(yīng)該從實(shí)用主義出發(fā),根據(jù)特定的工作選擇合適的工具。

在這篇文章中我會(huì)告訴你從何時(shí)開始并且為什么我認(rèn)為 Go 語言如此閃耀,具體來說是它的標(biāo)準(zhǔn)庫對(duì)于基本的網(wǎng)絡(luò)編程來說顯得非常穩(wěn)固。更具體一點(diǎn),我們將要編寫一個(gè)反向代理程序。

Go 為此提供了很多,但真正支撐起它的在于這些低級(jí)的網(wǎng)絡(luò)管道任務(wù),沒有更好的語言了。

反向代理是什么? 有個(gè)很棒的說法是流量轉(zhuǎn)發(fā) 。我獲取到客戶端來的請(qǐng)求,將它發(fā)往另一個(gè)服務(wù)器,從服務(wù)器獲取到響應(yīng)再回給原先的客戶端。反向的意義簡單來說在于這個(gè)代理自身決定了何時(shí)將流量發(fā)往何處。

為什么這很有用?因?yàn)榉聪虼淼母拍钍侨绱撕唵我灾劣谒梢员粦?yīng)用于許多不同的場(chǎng)景:負(fù)載均衡,A/B 測(cè)試,高速緩存,驗(yàn)證等等。

當(dāng)讀完這篇文章之后,你會(huì)學(xué)到:

  • 如何響應(yīng) HTTP 請(qǐng)求
  •  如何解析請(qǐng)求體
  • 如何通過反向代理將流量轉(zhuǎn)發(fā)到另一臺(tái)服務(wù)器

 我們的反向代理項(xiàng)目

我們來實(shí)際寫一下項(xiàng)目。我們需要一個(gè) Web 服務(wù)器能夠提供以下功能:

  • 獲取到請(qǐng)求
  • 讀取請(qǐng)求體,特別是 proxy_condition 字段
  • 如果代理域?yàn)?A,則轉(zhuǎn)發(fā)到 URL 1
  • 如果代理域?yàn)?B,則轉(zhuǎn)發(fā)到 URL 2
  • 如果代理域都不是以上,則轉(zhuǎn)發(fā)到默認(rèn)的 URL

準(zhǔn)備工作

  •  Go 語言環(huán)境。
  • http-server 用來創(chuàng)建簡單的服務(wù)。

環(huán)境配置

我們要做的第一件事是將我們的配置信息寫入環(huán)境變量,如此就可以使用它們而不必寫死在我們的源代碼中。

我發(fā)現(xiàn)最好的方式是創(chuàng)建一個(gè)包含所需環(huán)境變量的 .env 文件。

以下就是我為特定項(xiàng)目編寫的文件內(nèi)容:

export PORT=1330
export A_CONDITION_URL="http://localhost:1331"
export B_CONDITION_URL="http://localhost:1332"
export DEFAULT_CONDITION_URL=http://localhost:1333

這是我從 12 Factor App 項(xiàng)目中獲得的技巧。

保存完 .env 文件之后就可以運(yùn)行:

source .env

在任何時(shí)候都可以運(yùn)行該指令來將配置加載進(jìn)環(huán)境變量。

項(xiàng)目基礎(chǔ)工作

接著我們創(chuàng)建 main.go 文件做如下事情:

  1. PORT , A_CONDITION_URL , B_CONDITION_URLDEFAULT_CONDITION_URL 變量通過日志打印到控制臺(tái)。
  2. / 路徑上監(jiān)聽請(qǐng)求:
package main

import (
 "bytes"
 "encoding/json"
 "io/ioutil"
 "log"
 "net/http"
 "net/http/httputil"
 "net/url"
 "os"
 "strings"
)

// Get env var or default
func getEnv(key, fallback string) string {
 if value, ok := os.LookupEnv(key); ok {
  return value
 }
 return fallback
}

// Get the port to listen on
func getListenAddress() string {
 port := getEnv("PORT", "1338")
 return ":" + port
}

// Log the env variables required for a reverse proxy
func logSetup() {
 a_condtion_url := os.Getenv("A_CONDITION_URL")
 b_condtion_url := os.Getenv("B_CONDITION_URL")
 default_condtion_url := os.Getenv("DEFAULT_CONDITION_URL")

 log.Printf("Server will run on: %s\n", getListenAddress())
 log.Printf("Redirecting to A url: %s\n", a_condtion_url)
 log.Printf("Redirecting to B url: %s\n", b_condtion_url)
 log.Printf("Redirecting to Default url: %s\n", default_condtion_url)
}

// Given a request send it to the appropriate url
func handleRequestAndRedirect(res http.ResponseWriter, req *http.Request) {
 // We will get to this...
}

func main() {
 // Log setup values
 logSetup()

 // start server
 http.HandleFunc("/", handleRequestAndRedirect)
 if err := http.ListenAndServe(getListenAddress(), nil); err != nil {
  panic(err)
 }
}

現(xiàn)在你就可以運(yùn)行代碼了。

解析請(qǐng)求體

有了項(xiàng)目的基本骨架之后,我們需要添加邏輯來處理解析請(qǐng)求的請(qǐng)求體部分。更新 handleRequestAndRedirect 函數(shù)來從請(qǐng)求體中解析出 proxy_condition 字段。

type requestPayloadStruct struct {
 ProxyCondition string `json:"proxy_condition"`
}

// Get a json decoder for a given requests body
func requestBodyDecoder(request *http.Request) *json.Decoder {
 // Read body to buffer
 body, err := ioutil.ReadAll(request.Body)
 if err != nil {
  log.Printf("Error reading body: %v", err)
  panic(err)
 }

 // Because go lang is a pain in the ass if you read the body then any susequent calls
 // are unable to read the body again....
 request.Body = ioutil.NopCloser(bytes.NewBuffer(body))

 return json.NewDecoder(ioutil.NopCloser(bytes.NewBuffer(body)))
}

// Parse the requests body
func parseRequestBody(request *http.Request) requestPayloadStruct {
 decoder := requestBodyDecoder(request)

 var requestPayload requestPayloadStruct
 err := decoder.Decode(requestPayload)

 if err != nil {
  panic(err)
 }

 return requestPayload
}

// Given a request send it to the appropriate url
func handleRequestAndRedirect(res http.ResponseWriter, req *http.Request) {
 requestPayload := parseRequestBody(req)
  // ... more to come
}

通過 proxy_condition 判斷將流量發(fā)往何處

現(xiàn)在我們從請(qǐng)求中取得了 proxy_condition 的值,可以根據(jù)它來判斷我們要反向代理到何處。記住上文我們提到的三種情形:

  • 如果 proxy_condition 值為 A ,我們將流量發(fā)送到 A_CONDITION_URL
  • 如果 proxy_condition 值為 B ,我們將流量發(fā)送到 B_CONDITION_URL
  • 其他情況將流量發(fā)送到 DEFAULT_CONDITION_URL
// Log the typeform payload and redirect url
func logRequestPayload(requestionPayload requestPayloadStruct, proxyUrl string) {
 log.Printf("proxy_condition: %s, proxy_url: %s\n", requestionPayload.ProxyCondition, proxyUrl)
}

// Get the url for a given proxy condition
func getProxyUrl(proxyConditionRaw string) string {
 proxyCondition := strings.ToUpper(proxyConditionRaw)

 a_condtion_url := os.Getenv("A_CONDITION_URL")
 b_condtion_url := os.Getenv("B_CONDITION_URL")
 default_condtion_url := os.Getenv("DEFAULT_CONDITION_URL")

 if proxyCondition == "A" {
  return a_condtion_url
 }

 if proxyCondition == "B" {
  return b_condtion_url
 }

 return default_condtion_url
}

// Given a request send it to the appropriate url
func handleRequestAndRedirect(res http.ResponseWriter, req *http.Request) {
 requestPayload := parseRequestBody(req)
 url := getProxyUrl(requestPayload.ProxyCondition)
 logRequestPayload(requestPayload, url)
 // more still to come...
}

反向代理到 URL

最終我們來到了實(shí)際的反向代理部分。在如此多的語言中要編寫一個(gè)反向代理需要考慮很多東西,寫大段的代碼?;蛘咧辽僖胍粋€(gè)復(fù)雜的外部庫。

然而 Go 的標(biāo)準(zhǔn)庫使得創(chuàng)建一個(gè)反向代理非常簡單以至于你都不敢相信。下面就是你所需要的最關(guān)鍵的一行代碼:

httputil.NewSingleHostReverseProxy(url).ServeHTTP(res, req)

注意下面代碼中我們做了些許修改來讓它能完整地支持 SSL 重定向(雖然不是必須的)。

// Serve a reverse proxy for a given url
func serveReverseProxy(target string, res http.ResponseWriter, req *http.Request) {
 // parse the url
 url, _ := url.Parse(target)

 // create the reverse proxy
 proxy := httputil.NewSingleHostReverseProxy(url)

 // Update the headers to allow for SSL redirection
 req.URL.Host = url.Host
 req.URL.Scheme = url.Scheme
 req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
 req.Host = url.Host

 // Note that ServeHttp is non blocking and uses a go routine under the hood
 proxy.ServeHTTP(res, req)
}

// Given a request send it to the appropriate url
func handleRequestAndRedirect(res http.ResponseWriter, req *http.Request) {
 requestPayload := parseRequestBody(req)
 url := getProxyUrl(requestPayload.ProxyCondition)

 logRequestPayload(requestPayload, url)

 serveReverseProxy(url, res, req)
}

全部啟動(dòng)

好了,現(xiàn)在啟動(dòng)我們的反向代理程序讓其監(jiān)聽 1330 端口。讓其他的 3 個(gè)簡單的服務(wù)分別監(jiān)聽 1331–1333 端口(在各自的終端中)。

  1. source .env go install $GOPATH/bin/reverse-proxy-demo
  2. http-server -p 1331
  3. http-server -p 1332
  4. http-server -p 1333

這些服務(wù)都啟動(dòng)之后,我們就可以在另一個(gè)終端中像下面這樣開始發(fā)送帶有 JSON 體的請(qǐng)求了:

curl --request GET \

 --url http://localhost:1330/ \

 --header 'content-type: application/json' \

 --data '{
 "proxy_condition": "a"
 }'

如果你在找一個(gè)好用的 HTTP 請(qǐng)求客戶端,我極力推薦 Insomnia 。

然后我們就會(huì)看到我們的反向代理將流量轉(zhuǎn)發(fā)給了我們根據(jù) proxy_condition 字段配置的 3 臺(tái)服務(wù)中的其中一臺(tái)。

總結(jié)

Go 為此提供了很多,但真正支撐起它的在于這些低級(jí)的網(wǎng)絡(luò)管道任務(wù),沒有更好的語言了。我們寫的這個(gè)程序簡單,高性能,可靠并且隨時(shí)可用于生產(chǎn)環(huán)境。

我能看到在以后我會(huì)經(jīng)常使用 Go 來編寫簡單的服務(wù)。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

‍ 代碼是開源的,你可以在 Github 上找到。 :heart: 在 Twitter 上我只聊關(guān)于編程和遠(yuǎn)程工作相關(guān)的東西。如果關(guān)注我,你不會(huì)后悔的。

您可能感興趣的文章:
  • go語言實(shí)現(xiàn)簡單http服務(wù)的方法
  • go語言實(shí)現(xiàn)一個(gè)簡單的http客戶端抓取遠(yuǎn)程url的方法
  • go語言實(shí)現(xiàn)一個(gè)最簡單的http文件服務(wù)器實(shí)例
  • 一個(gè)簡單的Golang實(shí)現(xiàn)的HTTP Proxy方法

標(biāo)簽:曲靖 東營 德宏 保定 貴州 吐魯番 常州 許昌

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《1行Go代碼實(shí)現(xiàn)反向代理的示例》,本文關(guān)鍵詞  1行,代碼,實(shí)現(xiàn),反向,代理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《1行Go代碼實(shí)現(xiàn)反向代理的示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于1行Go代碼實(shí)現(xiàn)反向代理的示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    肉色超薄丝袜脚交| 国产激情在线播放| 欧美激情一区二区三区在线视频| 亚洲欧美视频在线观看视频| 婷婷视频一区二区三区| 亚洲大尺度在线观看| a级片一区二区| 91国模大尺度私拍在线视频| 国产精品一区二区在线观看| 亚洲国产精品久久人人爱蜜臀| av第一福利大全导航| 中文字幕一区在线播放| 欧美日韩在线播放一区| 精品伦理一区二区三区| 国产精品日韩欧美大师| 午夜激情福利电影| 99这里都是精品| 欧美午夜不卡影院在线观看完整版免费| 黄色av网站免费观看| 美女在线视频免费| 瑟瑟视频在线| 日韩欧美二区三区| 日本三级韩国三级欧美三级| 成人性生交大片免费看在线播放| 欧美午夜精品理论片| 最新天堂资源在线| 国偷自产一区二区免费视频| 97精品国产97久久久久久春色| 欧美极品jizzhd欧美| 天堂av手机版| 日韩精品―中文字幕| 亚洲大胆视频| 欧美探花视频资源| 日韩欧美精品中文字幕| 亚洲色图制服诱惑| 国产91精品对白在线播放| 国产一区二区三区精彩视频| 国产精品草草| 99精品欧美一区二区| 国内精品久久久久久久| 久久久久国产精品厨房| 国产网址在线观看| 菁菁伊人国产精品| 成人免费网址| 成人三级做爰av| 国产亚洲精彩久久| 中文字幕久久网| 人狥杂交一区欧美二区| crdy在线观看欧美| 亚洲精品水蜜桃| 国产成人精品123区免费视频| 91精品国产综合久久久久久久久久| 在线视频国产日韩| av中文字幕在线观看| 色婷婷综合中文久久一本| 国内av免费观看| 欧美福利电影在线观看| 特级丰满少妇一级aaaa爱毛片| 浮妇高潮喷白浆视频| 日韩精品欧美激情| 亚洲大胆人体在线| 欧美色图亚洲视频| 软萌小仙自慰喷白浆| 亚洲人成五月天| 一个人看的www久久| 中文字幕一区二区三区免费视频| 欧美黑人在线观看| 国产成人免费在线观看不卡| 免费一级淫片aaa片毛片a级| 欧美精品日韩www.p站| 亚洲国产资源| 国产精品综合久久| 筱崎爱全乳无删减在线观看| 91人妻一区二区三区| 亚洲区中文字幕| 极品av在线| 韩国av电影免费观看| 国产高潮又爽又无遮挡又免费| bbbbbbbbbbb在线视频| 成人毛片一区二区| 91九色论坛| 视频在线一区二区三区| 国产精品美女在线观看| 欧美黄在线观看| h网站免费观看| 欧美乱妇18p| aa视频在线播放| 波多野结衣中文字幕一区| 亚洲国产欧美一区二区三区久久| 成人高清一区| 亚洲十八**毛片| 亚洲精品自拍视频在线观看| 国产精品无码久久久久成人app| 亚洲精品资源在线| 超碰97人人射妻| 日韩美女一区二区三区| 成人看片人aa| 亚洲国产另类久久久精品极度| 亚洲欧洲成视频免费观看| 日韩欧美国产免费| 欧美影院在线播放| 国产高清视频免费观看| 91精品国产精品| 亚洲高清色综合| 91丝袜国产在线播放| 美女欧美视频在线观看免费| 欧洲精品一区二区三区久久| 日本精品免费在线观看| 97久久香蕉国产线看观看| 国产同性人妖ts口直男| 欧美交a欧美精品喷水| 国产精品美女无圣光视频| xxx在线免费观看| 日韩欧美国产三级| 欧美精品久久久久性色| www.亚洲自拍| 97视频在线免费观看| 丁香五精品蜜臀久久久久99网站| 亚洲成人第一页| 亚洲free性xxxx护士hd| 亚洲欧美中文另类| 国产成人av一区二区三区| 国产在线一级片| 污软件在线观看| 欧美黄色一级片视频| 91精品国产91久久久久久三级| 亚洲熟女乱综合一区二区三区| 欧美在线不卡视频| 图片区日韩欧美亚洲| 中文字幕一区二区人妻在线不卡| 亚洲熟妇无码一区二区三区| 性欧美长视频| 亚洲欧美视频在线观看| 亚洲精品乱码久久久久| 天堂8中文在线| www国产成人免费观看视频 深夜成人网| 少妇的滋味中文字幕bd| 天码人妻一区二区三区在线看| 538在线一区二区精品国产| √天堂8在线网| 不卡亚洲精品| 91吃瓜网在线观看| 亚洲一区二区三区sesese| 欧美亚洲国产另类| 国产欧美精品国产国产专区| 日韩精品一区二区三区色欲av| 亚洲欧洲国产日韩精品| 成人免费在线网址| 鬼打鬼之黄金道士1992林正英| 91玉足脚交白嫩脚丫| 成人有码在线播放| 国内在线高清免费视频| 国产九九视频一区二区三区| 国产欧美一区二区三区不卡高清| 国产区一区二区三区| 夜夜爽妓女8888视频免费观看| 欧美久久久久久久| 影音先锋中文字幕第一页| 国产一区二区在线免费播放| 天天干狠狠干| 欧美性受xxxxxx黑人xyx性爽| 精品视频第一区| 中文字幕在线免费视频| 国产在线视频2019最新视频| 欧美日韩免费在线| 亚洲性xxxx| 91影院未满十八岁禁止入内| 亚洲欧美国产另类| 国产精品―色哟哟| 欧洲一区在线电影| 成av人片一区二区| 日韩欧美视频| 77777亚洲午夜久久多人| 97视频在线观看免费高清完整版在线观看| 国产精品无遮挡| 国产情人综合久久777777| 亚洲精品一区二区三区樱花| 亚洲欧美精品中文第三| 亚洲最大成人| 人妻一区二区三区四区| 欧洲一级在线观看| 日韩黄色视屏| 美女亚洲精品| 四虎成人在线视频| 欧美午夜影院一区| 欧美成人久久久| 香蕉网站在线观看| 91麻豆成人精品国产免费网站| 久久99国产精品久久99果冻传媒| 交videos老少配com| 日本蜜桃在线观看视频| 久草在线资源站资源站| 黑人巨茎大战欧美白妇| 欧美成人bangbros| av电影一区二区三区| 久久亚洲影音av资源网| 影音先锋男人资源在线观看| 欧美精品久久久久久久多人混战| 在线观看成年人视频| 亚洲不卡一卡2卡三卡4卡5卡精品| 色婷婷av一区二区三区之e本道| 欧美黄色免费| 国模私拍一区二区国模曼安| 欧美最大成人综合网| 色涩成人影视在线播放| 999热视频在线观看| 四虎永久在线精品无码视频| 一道本无吗dⅴd在线播放一区| 欧美日韩激情视频一区二区三区| 国产免费黄色大片| 亚洲性夜色噜噜噜7777| 久久国产夜色精品鲁鲁99| 午夜在线观看免费一区| 97在线视频一区| 九九夜夜操妹子| 欧美日韩激情| 日本色图欧美色图| 任你操在线观看| 青青草国产精品97视觉盛宴| 欧美另类videos黑人极品| 婷婷激情一区| 97超碰在线播放| 性感美女福利视频| 色135综合网| 国产精品久久毛片| 五月天婷婷激情网| 国产高清成人久久| 国产a精品视频| 影音先锋中文字幕在线视频| 成人91在线| www五月天com| 黄网视频午夜青春| 午夜久久久久久电影| 中文写幕一区二区三区免费观成熟| 大陆av在线播放| 精品中文字幕一区二区小辣椒| 欧美综合在线观看视频| 亚洲风情在线资源站| 久久国产尿小便嘘嘘| av在线中出| 搞黄视频在线观看| 在线观看日本中文字幕| 国产视频九色蝌蚪| 一区二区在线影院| 日本欧美韩国一区三区| 精品亚洲成av人在线观看| 色中文字幕在线观看| 你懂的视频在线| 免费成人黄色| 久久久综合av| 日韩欧美国产小视频| 黄网站在线免费| 欧美福利视频一区二区| 在线观看亚洲大片短视频| 91传媒理伦片在线观看| 亚洲一区二区三区四区在线观看| 欧美精品羞羞答答| 国产亚洲综合久久| 91精品国产日韩91久久久久久| 两个人日本在线观看视频| 白丝美女让我捅| 国产人妻精品一区二区三区| 日本在线视频一区二区三区| 韩国19禁主播vip福利视频| 久久日文中文字幕乱码| 精品一成人岛国片在线观看| 久久蜜桃资源一区二区老牛| 91精品国产乱码久久久| 色爱精品视频一区| 免费操人视频| 久久久久久久久久久人体| 欧美精品欧美极品欧美激情| 欧美三级免费观看| 久久久久一区二区三区四区| 欧美gay囗交囗交| 999国产在线视频| 国产激情片在线观看| 欧美三级午夜理伦三级在线观看| 川上优的av在线一区二区| 小草在线视频免费播放| 天天人人精品| 亚洲精品免费网站| 欧美日韩一区二区在线观看| 日韩av在线免费观看不卡| 日本熟妇人妻中出| 在线综合+亚洲+欧美中文字幕| 欧美视频亚洲色图| 成人国产精品免费观看| 黄色免费观看网站| 性欧美videos粗暴| 一本久久综合| 偷拍精品福利视频导航| 成人在线免费观看| 亚州av在线播放| 日韩精品免费一区二区三区| 色婷婷激情五月| gogogo高清在线观看免费完整版| 国产女主播在线直播| 蜜桃传媒在线| 中文字幕一区二区三区最新| 热re91久久精品国99热蜜臀| 欧美日韩综合在线观看| 中文字幕国产视频| 中文字幕第六页| 国产美女在线免费观看| www.毛片com| 亚洲综合精品国产一区二区三区| 在线观看美女网站大全免费| 国产精品一区二区不卡| 国产精品色婷婷在线观看| www污网站在线观看| 999热精品视频| 国产欧美日韩精品丝袜高跟鞋| 婷婷成人综合| 成人免费在线电影| 成人性视频免费看| 亚洲国产一区二区三区在线播| 菠萝蜜视频在线观看一区| 国产在线88av| 成人高清视频免费观看| 欧美另类高清videos| 成人免费观看av| 精品国产午夜福利在线观看| 亚洲国产精品午夜在线观看| 91精品视频大全| 欧美日韩大片一区二区三区| 天天操天天舔天天射| 福利欧美精品在线|