最近在公司開發了一個項目,項目部署架構圖以下:html
如圖中文本所述,公司大數據集羣不容許直接訪問外網,須要一個網關服務器代理請求,本處服務器A就是邊緣代理服務器的做用。nginx
一般技術人員最快捷的思路是在服務器A上部署IIS+Application Request Routing Module組件,或者配置由Nginx代理請求完成這次邊緣代理服務器的功能。web
可是因爲本處代理服務器A 還須要完成額外的功能:編程
服務器A須要定時訪問外網雲服務器將數據請求並保存到本地api
代理服務器A集中管理雲服務器B的基自己份認證憑據, 因此該代理服務器A在代理請求的時候須要發送認證憑據服務器
關於web服務器定時任務功能實踐,請參照技術博客;架構
關於基自己份認證的編程實踐,請參照技術博客。app
因此本處咱們考慮利用ASP.NET Core實現一個帶認證功能的代理服務器。大數據
任務集中在2點:網站
實現代理請求
代理請求的時候攜帶 基自己份認證憑據
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<RemoteBasicAuth>(Configuration.GetSection("RemoteBasicAuth")); _proxyOption = services.ConfigureOption<ProxyOptions>(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代理服務器。
感謝您的認真閱讀,若有問題請大膽斧正;以爲有用,請下方或加關注。
本文歡迎轉載,但請保留此段聲明,且在文章頁面明顯位置註明本文的做者及原文連接。