閘道卸除模式

Azure 應用程式閘道

將共用或特製化服務功能卸除至閘道 Proxy。 此模式可將共用服務功能,例如使用SSL憑證,從應用程式的其他部分移至閘道,以簡化應用程式開發。

內容和問題

某些功能通常用於多個服務,這些功能需要設定、管理和維護。 隨每個應用程式部署一起散發的共用或特製化服務會增加系統管理額外負荷,並增加部署錯誤的可能性。 共用功能的任何更新都必須部署到所有共用該功能的服務。

正確處理安全性問題(令牌驗證、加密、SSL 憑證管理)和其他複雜工作,可能需要小組成員具備高度特製化技能。 例如,應用程式所需的憑證必須設定並部署在所有應用程式實例上。 在每個新的部署中,都必須管理憑證,以確保憑證不會過期。 任何即將到期的通用憑證都必須在每個應用程式部署上更新、測試及驗證。

其他常見的服務,例如驗證、授權、記錄、監視或 節流 ,可能難以在大量部署中實作和管理。 最好合併這種類型的功能,以減少額外負荷和錯誤的機會。

解決方案

將某些功能卸除至閘道,特別是跨領域考慮,例如憑證管理、驗證、SSL 終止、監視、通訊協定轉譯或節流。

下圖顯示終止輸入 SSL 連線的閘道。 它會代表來自閘道上游任何 HTTP 伺服器的原始要求者要求數據。

閘道卸除模式的圖表

此模式的優點包括:

  • 藉由移除散發和維護支持資源的需求,例如網頁伺服器憑證和安全網站的設定,以簡化服務的開發。 更簡單的組態可簡化管理和延展性,並讓服務升級更簡單。

  • 允許專用小組實作需要特殊專業知識的功能,例如安全性。 這可讓核心小組專注於應用程式功能,將這些特殊但跨領域關注的問題留給相關專家。

  • 提供要求和回應記錄和監視的一些一致性。 即使服務未正確檢測,也可以設定閘道以確保監視和記錄的最低層級。

問題和考量

  • 請確定閘道具有高可用性且可復原失敗。 執行閘道的多個實例,以避免單一失敗點。
  • 請確定閘道是針對應用程式和端點的容量和調整需求所設計。 請確定閘道不會成為應用程式的瓶頸,而且可充分調整。
  • 只卸除整個應用程式所使用的功能,例如安全性或數據傳輸。
  • 商業規則不應該卸除至閘道。
  • 如果您需要追蹤交易,請考慮針對記錄目的產生相互關聯標識符。

使用此模式的時機

當下列情況時,請使用此模式:

  • 應用程式部署有共享問題,例如 SSL 憑證或加密。
  • 應用程式部署之間可能有不同的資源需求,例如記憶體資源、記憶體容量或網路連線等常見功能。
  • 您想要將網路安全性、節流或其他網路界限問題的責任移至更專門的小組。

如果此模式在服務之間引進結合,可能不適合。

工作負載設計

架構設計人員應該評估閘道卸除模式如何用於其工作負載的設計,以解決 Azure 良好架構架構支柱涵蓋的目標和原則。 例如:

要素 此模式如何支援支柱目標
可靠性設計決策可協助工作負載復原到故障,並確保它會在發生失敗后復原到完全正常運作的狀態。 將此責任卸除至閘道可減少後端節點上應用程式程式代碼的複雜性。 在某些情況下,卸除會將功能完全取代為可靠的平臺提供功能。

- RE:01 簡單性和效率
安全性 設計決策有助於確保 工作負載數據和系統的機密性完整性可用性 將閘道新增至要求流程可讓您集中使用用戶端的 Web 應用程式防火牆和 TLS 連線等安全性功能。 平臺提供的任何卸除功能都已提供增強的安全性。

- SE:06 網路控制
- SE:08 強化資源
成本優化著重於維持和改善工作負載的投資報酬率。 此模式可讓您將成本從每個節點花費的資源重新導向至閘道實作。 集中式處理模型中的成本經常低於分散式模型的成本。

- CO:14 合併
營運卓越可透過標準化的流程和小組凝聚力,協助提供工作負載品質 在此模式中,卸除功能的組態和維護是來自單一點,而不是從多個節點進行管理。

- OE:04 工具和程式
效能效率 可透過調整、數據、程式代碼的優化,有效率地協助您的工作負載 符合需求 將卸除閘道新增至要求程式可讓您使用較少的每個節點的資源,因為功能會集中在閘道上。 您可以優化與應用程式程式代碼無關之卸除功能的實作。 卸除的平臺提供功能可能已是高效能的。

- PE:03 選取服務

如同任何設計決策,請考慮對其他可能以此模式導入之目標的任何取捨。

範例

使用 Nginx 作為 SSL 卸除設備,下列組態會終止輸入 SSL 連線,並將連線散發至三部上游 HTTP 伺服器的其中一部。

upstream iis {
        server  10.3.0.10    max_fails=3    fail_timeout=15s;
        server  10.3.0.20    max_fails=3    fail_timeout=15s;
        server  10.3.0.30    max_fails=3    fail_timeout=15s;
}

server {
        listen 443;
        ssl on;
        ssl_certificate /etc/nginx/ssl/domain.cer;
        ssl_certificate_key /etc/nginx/ssl/domain.key;

        location / {
                set $targ iis;
                proxy_pass http://$targ;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host;
        }
}

在 Azure 上,您可以藉由在 應用程式閘道 上設定 SSL 終止來達成此目的。