如果❤️我的文章有幫助,歡迎點贊、關注。這是對我繼續技術創作最大的鼓勵。
更多系列文章在我部落格[1]
Golang 實現簡版反向代理
正向代理 和 反向代理
如果說昨天介紹的
正向代理伺服器
是從
使用者端
角度出發。使得
使用者端
能夠:
訪問無法訪問的資料 —— 訪問谷歌
加速頁面訪問速度的快取 —— CDN 快取
對客戶端訪問內容過濾, 訪問授權 —— 公司內網不能訪問購物網站; 網咖
上網管理記錄使用者訪問記錄,對外隱藏特殊資訊 —— 路由訪問記錄
那麼今天要說的
反向代理伺服器
則從
服務端
考慮
負載均衡, 提高服務可擴充套件、穩定性 —— 伺服器叢集、多中心機房、災備
ip白名單、限制開發埠, 保護內網安全 —— 閘道器
限流、熔斷、降級 —— 閘道器
訪問資料統計、訪問內容許可權控制 —— 閘道器
內網、外網透過代理轉發,對外隱藏實現細節。增加內部服務安全性 —— 閘道器
舉個現有的例子:就是使用廣受歡迎的
Nginx
。個人感覺
反向代理
在業務上面更多以
閘道器
角色呈現, 而
閘道器
則更像一個
定製化 Nginx
簡版反向代理實現
《HTTP 權威指南》中概括用一句話概括了
代理的核心功能
:
接受客戶端的請求,轉發到後端伺服器,獲得響應並返回給客戶端
這些都沒在下面的
程式碼實現
中一一找到對應:
接受客戶端的請求
:
第 11 行
設定路由, 所有請求
代理伺服器
由
handler()
方法處理
handler()
方法內
第 27 行
解析
下游伺服器
的 請求協議、ip地址。並設入請求變數
r
轉發到後端伺服器
:請求
r
由
第 33 行
transport。RoundTrip(r), 轉發請求至
下游伺服器
獲得響應
:
下游伺服器
請求 Header 資訊 在
第 40 ~ 44 行
設入代理伺服器的響應
w
返回給客戶端
:代理伺服器的響應
w
並返回
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/