Golang 實現簡版反向代理

如果❤️我的文章有幫助,歡迎點贊、關注。這是對我繼續技術創作最大的鼓勵。

更多系列文章在我部落格[1]

Golang 實現簡版反向代理

正向代理 和 反向代理

如果說昨天介紹的

正向代理伺服器

是從

使用者端

角度出發。使得

使用者端

能夠:

訪問無法訪問的資料 —— 訪問谷歌

加速頁面訪問速度的快取 —— CDN 快取

對客戶端訪問內容過濾, 訪問授權 —— 公司內網不能訪問購物網站; 網咖

上網管理記錄使用者訪問記錄,對外隱藏特殊資訊 —— 路由訪問記錄

那麼今天要說的

反向代理伺服器

則從

服務端

考慮

負載均衡, 提高服務可擴充套件、穩定性 —— 伺服器叢集、多中心機房、災備

ip白名單、限制開發埠, 保護內網安全 —— 閘道器

限流、熔斷、降級 —— 閘道器

訪問資料統計、訪問內容許可權控制 —— 閘道器

內網、外網透過代理轉發,對外隱藏實現細節。增加內部服務安全性 —— 閘道器

舉個現有的例子:就是使用廣受歡迎的

Nginx

。個人感覺

反向代理

在業務上面更多以

閘道器

角色呈現, 而

閘道器

則更像一個

定製化 Nginx

簡版反向代理實現

《HTTP 權威指南》中概括用一句話概括了

代理的核心功能

接受客戶端的請求,轉發到後端伺服器,獲得響應並返回給客戶端

這些都沒在下面的

程式碼實現

中一一找到對應:

接受客戶端的請求

第 11 行

設定路由, 所有請求

代理伺服器

handler()

方法處理

handler()

方法內

第 27 行

解析

下游伺服器

的 請求協議、ip地址。並設入請求變數

r

轉發到後端伺服器

:請求

r

第 33 行

transport。RoundTrip(r), 轉發請求至

下游伺服器

獲得響應

下游伺服器

請求 Header 資訊 在

第 40 ~ 44 行

設入代理伺服器的響應

w

返回給客戶端

:代理伺服器的響應

w

並返回

Golang 實現簡版反向代理

Golang 實現簡版反向代理

啟動 下游(被代理)伺服器

$ go run reverse_proxy_v1/real_server/main。go2021/06/12 17:59:24 starting httpserver at 127。0。0。1:20032021/06/12 17:59:24 starting httpserver at 127。0。0。1:2004

測試 下游(被代理)伺服器

$ curl ‘http://127。0。0。1:2003/sda?sda=111’http://127。0。0。1:2003/sdaRemoteAddr=127。0。0。1:49795,X-Forwarded-For=,X-Real-Ip=headers =map[Accept:[*/*] User-Agent:[curl/7。69。1]]$ curl ‘http://127。0。0。1:2004/sda?sda=111’http://127。0。0。1:2003/sdaRemoteAddr=127。0。0。1:49795,X-Forwarded-For=,X-Real-Ip=headers =map[Accept:[*/*] User-Agent:[curl/7。69。1]]

啟動 代理伺服器

$ go run reverse_proxy/reverse_proxy_v1/reverse_proxy_base/main。go2021/06/12 18:32:21 start serving on port2002

測試 代理伺服器

$ curl ‘http://127。0。0。1:2002/sda?sda=111’# 轉發至 2003 並返回結果http://127。0。0。1:2003/sdaRemoteAddr=127。0。0。1:57595,X-Forwarded-For=,X-Real-Ip=headers =map[Accept:[*/*] Accept-Encoding:[gzip] User-Agent:[curl/7。69。1]]

請求代理伺服器,返回結果`http://127。0。0。1:2003/sda`; 與直接請求 `http://127。0。0。1:2003/sda?sda=111` 結果一致。代理成功

References

[1] 更多系列文章在我部落格:

https://coderdao。github。io/