最近在公司开发了一个项目,项目部署架构图以下: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代理服务器。
感谢您的认真阅读,若有问题请大胆斧正;以为有用,请下方或加关注。
本文欢迎转载,但请保留此段声明,且在文章页面明显位置注明本文的做者及原文连接。