點選上方“芋道原始碼”,選擇“置頂公眾號”
技術文章第一時間送達!
原始碼精品專欄
來源:http://t.cn/Evbdqc9
1、正向代理和反向代理的概念
無論是正向代理,還是反向代理,說到底,就是代理樣式的衍生版本罷了。我們都學習過代理設計樣式,都知道代理樣式中有代理角色和被代理角色,為什麼這麼說,因為這兩個角色對於我們理解正向和反向代理非常重要,下麵會講到。
我們首先請求代理伺服器,然後代理伺服器幫我們去快速訪問國外的網站,對於這種代理方式,我們就稱之為正向代理。請記住,上面說到代理樣式的兩個角色中,我們當前的角色為 被代理者,也就是瀏覽器這個角色。更重要的是,正向代理的本質是我們去請求外部的資源,如果以生產者、消費者樣式來區分,我們屬於消費者。
總結:
-
1、正向代理,我們的角色是 被代理者
-
2、正向代理,我們不對外提供服務,反而是對外消費服務,屬於消費者
反向代理,很顯然,就是和正向代理相反,如果說正向代理是男,那麼反向代理就是女了,親,此處不再糾結其他情況!下麵我用一副圖片解釋下反向代理:
看完上面的圖片,請你想象一下這麼一個場景,假設你現在是某公司技術總監,你們公司需要對外提供一套web服務,那麼你打算怎麼做呢?
答案是可以透過反向代理來完成。通常你們公司擁有自己的IDC機房,機房通訊通常採用區域網交換機,internet網使用者請求是無法直接訪問到區域網內的web服務的,因此這個時候,你需要一臺反向代理伺服器來接收internet web請求,然後將請求分發到區域網中的不同主機上進行處理,處理完成之後再做出響應。因此,反向代理大概就是這麼一個場景。請記住,反向代理中,我們的角色是 區域網 web服務。
總結:
-
1、反向代理,我們的角色是 區域網 web服務
-
2、反向代理,我們對外提供服務,屬於服務提供者
2、nginx正向代理和反向代理實體解析
nginx在正向代理方面的應用非常地少,因此,對於正向代理的相關配置指令也不多,下麵是一個nginx作為正向代理伺服器的配置實體,配置僅供參考。
server {
resolver 192.168.1.1; #指定DNS伺服器IP地址
listen 8080;
location / {
proxy_pass http://$http_host$request_uri; #設定代理伺服器的協議和地址
}
}
解釋下上面的指令,resolver
配置DNS伺服器的ip地址,可以配置多個。你可能會問,正向代理中為什麼需要配置DNS伺服器的ip地址呢?其實答案很簡單,你想象下假如現在你的瀏覽器配置了正向代理伺服器,你現在在瀏覽器中輸入http://oneSite.cn/index.html
,根據正向代理原理,該url請求將會被正向代理伺服器執行,問題來了,如果你的代理伺服器不配置DNS解析服務,nginx怎麼知道你這個oneSite.cn
到底是個什麼鬼,到底對應因特網的ip地址是什麼?所以這就是需要配置resolver
指令的原因所在。
listen
指令配置nginx監聽瀏覽器請求的埠號。
proxy_pass
指令配置接收到被代理瀏覽器發來的請求之後,需要幫忙執行的請求是什麼,$http_host$request_uri
指明目的主機和uri,屬於nginx變數,一般不需要修改。
nginx反向代理的相關配置如下,在這裡小編搭建兩個Spring boot小demo模擬上面反向代理的web服務,相關原始碼可以在github獲取。
demo
工程啟動埠號為8081
,demo1
工程啟動埠為8082
,對於所有的請求字首帶/demo
的都將轉發到demo
工程進行處理,對於所有的請求字首帶/demo1
的都將轉發到demo1
工程進行處理。
nginx配置如下:
server {
listen 80;
location /demo {
proxy_pass http://127.0.0.1:8081;
}
location /demo1 {
proxy_pass http://127.0.0.1:8082;
}
}
啟動demo
和demo1
兩個工程之後,瀏覽器輸入下麵地址:
可以看到,外部統一使用80埠訪問服務時,nginx根據路徑字首進行代理,然後傳回執行結果。對於nginx反向代理路徑配置有幾點需要註意,使用時要非常謹慎。
上面proxy_pass
指令配置的url為http://127.0.0.1:8081
,註意在該url後面不能使用/demo1
字尾進行代替,否則就報錯了。為什麼呢?首先nginx會判斷proxy_pass
指令中配置的url地址是否包含uri,如果在proxy_pass
指令中配置的url地址不包含uri,那麼nginx將會使用請求路徑的uri進行轉發,如果在proxy_pass
指令中配置的url地址包含uri,則nginx會忽略請求location
中的uri,轉而使用你在proxy_pass
中配置的uri進行改寫,轉發,另外,/
也是一種uri,哈哈,要特別小心哈~
舉例子:
假設請求地址為:http://localhost/demo/getServerInfo.json
,location
配置為/demo
,proxy_pass
配置為http://xxxx:port
,則會使用http://xxxx:port/demo/getServerInfo.json
進行轉發,結果正確。如果proxy_pass
配置為http://xxxx:port/demo1
,則會使用http://xxxx:port/demo1
進行轉發,因為/demo1
改寫了/demo
如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢:
目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:
01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽
05. 拓展機制 SPI
06. 執行緒池
07. 服務暴露 Export
08. 服務取用 Refer
09. 註冊中心 Registry
10. 動態編譯 Compile
11. 動態代理 Proxy
12. 服務呼叫 Invoke
13. 呼叫特性
14. 過濾器 Filter
15. NIO 伺服器
16. P2P 伺服器
17. HTTP 伺服器
18. 序列化 Serialization
19. 叢集容錯 Cluster
20. 優雅停機
21. 日誌適配
22. 狀態檢查
23. 監控中心 Monitor
24. 管理中心 Admin
25. 運維命令 QOS
26. 鏈路追蹤 Tracing
… 一共 69+ 篇
目前在知識星球更新了《Netty 原始碼解析》目錄如下:
01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap
05. 事件輪詢 EventLoop
06. 通道管道 ChannelPipeline
07. 通道 Channel
08. 位元組緩衝區 ByteBuf
09. 通道處理器 ChannelHandler
10. 編解碼 Codec
11. 工具類 Util
… 一共 61+ 篇
目前在知識星球更新了《資料庫物體設計》目錄如下:
01. 商品模組
02. 交易模組
03. 營銷模組
04. 公用模組
… 一共 17+ 篇
原始碼不易↓↓↓↓↓
點贊支援老艿艿↓↓