Proxy Pattern

莫力全 Kyle Mo
5 min readSep 3, 2020

--

其實 Proxy 是一個相當廣的概念,它可以代表一種設計模式,也可以代表實際存在的網路實體。若是實體,又可以存在於 backend server 之間,也能存在於路由器之間,又或者是多台電腦之間,符合特定概念的都能稱作 proxy,而這篇文章則是想介紹 Proxy 的定義與概念,下篇文章則是會使用 Node.js 實作 http proxy server,這個在 web service 中非常重要且常見的概念。

Proxy 的定義

要理解 Proxy 我認為該從設計模式的定義講起,畢竟它是一種模式、一種概念,理解它背後的邏輯後就可以 based on it 實作出各種不同的 use case。首先讓我們看看網路上對 Proxy design pattern 的定義:

Proxy is a structural design pattern that lets you provide a substitute or placeholder for another object. A proxy controls access to the original object, allowing you to perform something either before or after the request gets through to the original object.

白話說起來其實就是指我們不會直接操作目標物件,而是會建立一個代理(proxy)負責對目標物件的操作,這麼做的好處除了可以避免 code duplication 以外,更大的好處是我們可以在 proxy 做一些額外的操作,卻不用怕更改到目標物件,而原則上 proxy 會 implement 跟目標物件一樣的 interface,因此預計接收原目標物件的 client 同樣是可以接受 proxy 物件的。proxy 會在收到 client 的請求後做一些特定的操作(optional),再 delegates works 給真實的目標物件,這就是 design pattern 中 Proxy pattern的概念。

實踐 Proxy Pattern

了解 Proxy 的概念後,不難發現其實許多地方都有可以實踐它的機會,不管是程式語言(例如 JS 的 proxy)、server side 的 proxy server、或是 infra 面相的 proxy 主機…等,背後的機制都是 proxy pattern 的實踐,這裡想介紹幾個我認為蠻有趣的 proxy pattern 應用:

Lazy Initialization (virtual proxy)

當你擁有一個非常肥大又消耗系統資源的 object service ,然而它又沒有一直啟動的必要(也許特定狀況才會使用到它),這種情況就沒有必要在 App 啟動的時候一起把這個肥大的 object service 建立起來,而可以將建立物件的步驟延後到真正需要使用它的時候。

Local execution of a remote service (remote proxy)

當你要操作的 service object 位於遠端 server 時,由 remote proxy 負責經由 network 傳送 request 給 service object,這也代表了與 network 溝通的複雜細節就交給 proxy 處理,client 不需要自行 handle 這塊。

Access control (protection proxy)

這是一個在 web service 中蠻常見的應用,當 request 送出後會先送至 proxy server,proxy 再根據 session 或者 token 判斷 client 是否有權限可以訪問這個資源,同樣的概念也可以用在 web server 以外的許多地方。

Logging requests (logging proxy)

因為是存在於 request 與 target object service 之間,因此也很適合負責紀錄 request 的歷史紀錄。

Caching request results (caching proxy)

如果有看過我之前寫的關於 Cache 的文章的話,應該會知道 CDN 的概念,而它確實也是一種 proxy pattern 的實踐。

Proxy Pattern 的優點

  • 可以在 client 不知覺的狀況下操作 service object
  • 可以管理 service object 的 lifecycle (這些也是 client 不需要也通常不會去在乎的)
  • 即使 service object 還沒 ready 或是還不能 work, proxy 還是可以運作
  • 可以在不改動 client 與 service object 的前提下引進新的 proxy

Proxy Pattern 的缺點

  • code 的複雜度會提升
  • 從 service 回來的 response 可能會 delay (因為中間多經過一層 proxy)

小結

本篇透過簡短的篇幅介紹了 Proxy Pattern 的概念,理解概念之後會發現除了軟體開發領域有許多運用 Proxy Pattern 的技術外,現實生活的許多生活情境也能用 Proxy Pattern 來解釋,例如我在這篇文章 中提及的銀行借貸就是一個例子。下篇文章將示範使用 Node.js 實作一個簡易的 Proxy Server。

--

--

莫力全 Kyle Mo
莫力全 Kyle Mo

Written by 莫力全 Kyle Mo

什麼都想學的雜食性軟體工程師 🇹🇼 (https://github.com/kylemocode) 合作與聯繫 📪 oldmo860617@gmail.com IG 技術自媒體:@kylemo.webdev.life

No responses yet