引言
最近在公司開發了一個專案,專案部署架構圖如下:
思路
如圖中文字所述,公司大資料叢集不允許直接訪問外網,需要一個閘道器伺服器代理請求,本處伺服器A就是邊緣代理伺服器的作用。
通常技術人員最快捷的思路是在伺服器A上部署IIS+Application Request Routing Module元件,或者配置由Nginx代理請求完成此次邊緣代理伺服器的功能。
但是由於本處代理伺服器A 還需要完成額外的功能:
-
伺服器A需要定時訪問外網雲伺服器將資料請求並儲存到本地
-
代理伺服器A集中管理雲伺服器B的基本身份認證憑據, 所以該代理伺服器A在代理請求的時候需要傳送認證憑據
關於web伺服器定時任務功能實踐,請參照技術部落格;
關於基本身份認證的程式設計實踐,請參照技術部落格。
所以本處我們考慮利用ASP.NET Core實現一個帶認證功能的代理伺服器。
任務集中在2點:
-
實現代理請求
-
代理請求的時候攜帶 基本身份認證憑據
程式設計實現
ASP.NET Core 提供了實現請求代理功能的功能庫 ,透過nuget安裝:
Install-Package Microsoft.AspNetCore.Proxy -Version 0.2.0
該中介軟體目前只有2個擴充套件方法,主要關註如下擴充套件方法:
// // 摘要: // Sends request to remote server as specified in options // // 引數: // app: // // options: // Options for setting port, host, and scheme public static IApplicationBuilder RunProxy(this IApplicationBuilder app, ProxyOptions options);
本次代理請求需要攜帶BA憑據,所以可在ProxyOptions引數設定基本身份認證Handler:
public void ConfigureServices(IServiceCollection services) { _remoteAccount = services.ConfigureOption(Configuration.GetSection("RemoteBasicAuth")); _proxyOption = services.ConfigureOption(Configuration.GetSection("ProxyOptions")); // 從本地配置檔案讀取雲伺服器B的認證憑據,並設定基本身份認證Handler _proxyOption.BackChannelMessageHandler = new BasicAuthenticationClientHandler(_remoteAccount); ...... }
該雲伺服器B在部分頁面【url以/eqids開頭、api以/api/v1/eqids/】配置了BA認證,
所以本次我們使用了MapWhen條件中介軟體:
public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env, Microsoft.Extensions.Hosting.IApplicationLifetime appLifetime, ILoggerFactory loggerFactory) { ...... app.MapWhen(x=> x.Request.Path.Value.StartsWith(@"/eqids", StringComparison.OrdinalIgnoreCase) || x.Request.Path.Value.StartsWith(@"/api/v1/eqids", StringComparison.OrdinalIgnoreCase), builder => builder.RunProxy(_proxyOption)); ...... }
That’s All. 以上程式部署到伺服器A之後, 這樣訪問伺服器A的部署網站, 等同於訪問雲伺服器B的資源,伺服器B對於內網來說是透明的。
本文期待以一種輕鬆、優雅的方式快速實現一個具備自定義訊息處理能力的Web代理伺服器。
原文地址:https://www.cnblogs.com/mi12205599/p/10503600.html
朋友會在“發現-看一看”看到你“在看”的內容