浅析微软的网关项目 -- ReverseProxy

浅析微软的网关项目--ReverseProxy

Intro

最近微软新开了一个项目 ReverseProxy ,也叫做 YARP(A Reverse Proxy)

官方介绍如下:

YARP is a reverse proxy toolkit for building fast proxy servers in .NET using the infrastructure from ASP.NET and .NET. The key differentiator for YARP is that it's been designed to be easily customized and tweaked to match the specific needs of each deployment scenario.

这是一个基于 .net (core) 和 asp.net (core) 的用来代理服务器的反向代理组件,YARP的主要区别在于它的设计易于定制和调整,以适应每种部署方案的特定需求。

你可以基于这个项目来轻松构建自己的 API Gateway

YARP 设计

YARP 主要是基于 endpoint 路由 + asp.net core 中间件来设计实现的

来看一下官方的示例 Startup 配置:

public void ConfigureServices(IServiceCollection services)
{services.AddControllers();services.AddReverseProxy().LoadFromConfig(_configuration.GetSection("ReverseProxy")).AddProxyConfigFilter<CustomConfigFilter>();
}
/// <summary>
/// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
/// </summary>
public void Configure(IApplicationBuilder app)
{app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();endpoints.MapReverseProxy(proxyPipeline =>{// Custom endpoint selectionproxyPipeline.Use((context, next) =>{var someCriteria = false; // MeetsCriteria(context);if (someCriteria){var availableDestinationsFeature = context.Features.Get<IAvailableDestinationsFeature>();var destination = availableDestinationsFeature.Destinations[0]; // PickDestination(availableDestinationsFeature.Destinations);// Load balancing will no-op if we've already reduced the list of available destinations to 1.availableDestinationsFeature.Destinations = new[] { destination };}return next();});proxyPipeline.UseProxyLoadBalancing();});});
}

中间件

基于 asp.net core 的中间件的设计可以使得一些现有的 asp.net core 的中间件可以无缝集成,不得不说微软的设计真的是很优秀

相对来说 Ocelot 的的设计就会稍显逊色一些,因为 Ocelot 的设计是 asp.net core 的一个中间件,在 Ocelot 内部有自己的一套中间件,原来基于 asp.net core 的中间件要在 Ocelot 中使用就需要进一步开发,变成 Ocelot 的中间件,才能正常工作,比如 Ocelot 里的限流中间件就是基于一个 asp.net core 的中间件来实现的 AspNetCoreRateLimit

proxy endpoint 实现

public static void MapReverseProxy(this IEndpointRouteBuilder endpoints, Action<IApplicationBuilder> configureApp)
{if (endpoints is null){throw new ArgumentNullException(nameof(endpoints));}if (configureApp is null){throw new ArgumentNullException(nameof(configureApp));}var appBuilder = endpoints.CreateApplicationBuilder();appBuilder.UseMiddleware<DestinationInitializerMiddleware>();configureApp(appBuilder);appBuilder.UseMiddleware<ProxyInvokerMiddleware>();var app = appBuilder.Build();var routeBuilder = endpoints.ServiceProvider.GetRequiredService<IRuntimeRouteBuilder>();routeBuilder.SetProxyPipeline(app);var dataSource = (EndpointDataSource)endpoints.ServiceProvider.GetRequiredService<IProxyDynamicEndpointDataSource>();endpoints.DataSources.Add(dataSource);
}

从上面的代码可以看到,针对反向代理的处理流程是也是一套中间件管道处理,

首先执行的是 DestinationInitializerMiddleware 在这一中间件,会获取可用的下游节点,并通过 HttpContextFeatures 来传递给后面的中间件,

然后会调用传进来的自定义中间件的逻辑,在这个逻辑中,可以加一些我们自己的业务逻辑,十分灵活,可扩展性极强

之后会执行 ProxyInvokerMiddleware,在这个中间件中会去调用下游服务,并生成 response 返回给客户端

More

目前这个项目在还是在积极开发中,可以关注一下,但是暂时不建议在项目中使用,目前还没发布 preview 版本,原本这个项目只支持 .net 5,不支持 .netcore3.1 ,在许多人的呼吁之下,微软打算在 preview2 版本中提供对 dotnetcore 3.1 的支持,详细可以参考 issue: https://github.com/microsoft/reverse-proxy/issues/159,希望提供 .net core 3.1 支持的可以去点个赞哈

Reference

  • https://github.com/microsoft/reverse-proxy

  • https://github.com/microsoft/reverse-proxy/blob/master/samples/ReverseProxy.Sample/Startup.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[设计模式]模板方法模式

模板方法模式: 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中。模仿方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 代码如下: #include <iostream> using namespace std;class DrinkTemplate { public:virtual void Boi…

Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)

题意&#xff1a; ----最大M子段和问题 给定由 n个整数&#xff08;可能为负整数&#xff09;组成的序列以及一个正整数 m&#xff0c;要求确定序列的 m个不相交子段&#xff0c;使这m个子段的总和达到最大&#xff0c;求出最大和。 题目&#xff1a; Now I think you have …

oracle游标的常用属性,Oracle基础知识(二十六) - Oracle游标常用属性

Oracle游标相信大家都不陌生&#xff0c;下面就为您详细介绍Oracle游标的常用属性&#xff0c;如果您对Oracle游标方面感兴趣的话&#xff0c;不妨一看。Oracle游标常用属性&#xff1a;%FOUND&#xff1a;变量最后从游标中获取记录的时候&#xff0c;在结果集中找到了记录。%N…

差距(分享)

非985大学生, 你和别人的差距在哪里?&#xff08;转&#xff09; 非985大学生, 你和别人的差距在哪里? 中国青年报03-24 在知乎上看到这样一段话&#xff1a; “渣学校意味着渣教学&#xff0c;渣教学意味着渣学历&#xff0c;渣学历意味着渣就业&#xff0c;就算以后考了研究…

在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统

1.APM工具的选取Apm监测工具很多&#xff0c;这里选用网上比较火的一款Skywalking。Skywalking是一个应用性能监控(APM)系统&#xff0c;Skywalking分为服务端Oap、管理界面UI、以及嵌入到程序中的探针Agent部分&#xff0c;大概工作流程就是在程序中添加探针采集各种数据发送给…

[C++11]constexpr修饰常量表达式

常量表达式和非常量表达式的计算时机不同&#xff0c;非常量表达式只能在程序运行阶段算出结果&#xff0c;但是常量表达式的计算往往发生在程序的编译阶段&#xff0c;这可以极大提高程序的执行效率。 constexpr定义一个常量。 代码如下: #include <iostream> using …

oracle sql execute elapsed time,SQL ordered by Elapsed Time 脚本

--提取&beg_snap 、&end_snapselect * from dba_hist_snapshot x ;--提取&dbidselect * from v$database;--提取$inst_numselect * from v$instance;运行的时候输入上面的值(如果需要输入多次&#xff0c;那么输入同样值即可)select from (select round(nvl((sqt.e…

计算机组成原理期末复习题

地址总线A15~Ao(低),存储空间(按字节编址)分配如下 2000H~3FFFH为ROM区, 5000H~6FFFH为RAM区。用 ROM芯片(4Kx4)和RAM芯片(4Kx4)组成该存储器。请回答 &#xff1a;(1)分别需要ROM和RAM多少片? (2)用二进制形式写出每组芯片的地址范围,并说明可以通过哪些地址位来形成片选信号…

干货分享:如何使用Kubernetes的Ingress API

导语以Kubernetes的Kong为例&#xff0c;聊聊当前流行的开源且与云无关的Ingress控制器。正文您可以通过使用诸如Kong for Kubernetes的Ingress控制器&#xff08;使用自定义资源定义并提供许多插件&#xff09;来极大地扩展Ingress资源的功能。Kubernetes正在整个技术行业中得…

[PAT乙级]1029 旧键盘

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字&#xff0c;请你列出肯定坏掉的那些键。 输入格式&#xff1a; 输入在 2 行中分别给出应该输入的文字、以及实际被输入的文字。每…

表空间oracle查询,Oracle表和表空间查询

用户查询查询和用户相关的数据创建用户CREATE USER userIDENTIFIED BY password[DEFAULT TABLESPACE tablespace][TEMPORARY TABLESPACE tablespace]查询所有用户数select username from dba_users;查询当前实例名称select instance_name from v$instance;表空间查询查询用户表…

计算机组成原理期末复习往年卷子

1. I/O设备的编址方式通常有___统一编址__和_独立编址__两种方式。P145 2&#xff0e;Cache是一种高速缓冲存储器&#xff0c;是为了解决____CPU____和___主存____之间速度不匹配而采用的一项重要技术。P124 3&#xff0e;在计算机系统中&#xff0c;I/O设备与主机传递消息的…

.NET Core接入ElasticSearch 7.5

写在前面最近一段时间&#xff0c;团队在升级ElasticSearch&#xff08;以下简称ES&#xff09;&#xff0c;从ES 2.2升级到ES 7.5。也是这段时间&#xff0c;我从零开始&#xff0c;逐步的了解了ES&#xff0c;中间也踩了不少坑&#xff0c;所以特地梳理和总结一下相关的技术点…

[C++11]字符串原始字面量

代码如下: #include <iostream> #include <string> using namespace std;int main() {string str1 R"(D:\hello\world\test.txt)";cout << str1 << endl;string str2 R"(dsdasasdasasda asdagdfhadagd)";cout << str2 &l…

oracle实现序列,oracle中创建序列和自增长列的实现方式

众所周知&#xff0c;在SQL Server中设置自增长列很简单&#xff0c;但是在ORACLE中则不然&#xff0c;现在介绍一下ORACLE中自增长列如何实现&#xff1a;1.创建序列。举例如下&#xff1a;create sequence seq_personincrement by 1start with 1nomaxvalue --不设最大值nocy…

ASP.NET Core on K8s学习之旅(13)Ocelot API网关接入

【云原生】| 作者/Edison Zhou这是恰童鞋骚年的第232篇原创文章上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用&#xff0c;考虑到很多团队都在使用Ocelot作为API网关&#xff08;包括我司&#xff09;做了很多限流和鉴权的工作&#xff0c;因此本篇介绍一下如…

数据结构期末复习

1.完全二叉树的第5层有9个节点&#xff0c;该完全二叉树总计有多少个节点( B ). A.41 B.24 C.40 D.25 2.具有21个顶点的无向图至少有多少条边才能形成连通图 ( B ). A.21 B.20 C.22 D.21…

oracle有入参的试图,Oracle 带参视图

创建包:create or replace package p_view_param isfunction set_param(num number) return number;function get_param return number;end p_view_param;create or replace package body p_view_param isparamValue number;function set_param(num number) return number is…

C++实现拓扑排序(vector模拟邻接表存储,优先队列实现)

代码如下: #include <iostream> #include <queue> #include <vector> using namespace std; const int N 10010; int in[N]; vector<int>v[N]; vector<int>print;//存放拓扑序列 int main() {int n, m;//n为点的个数&#xff0c;m为边的条数,点…

ASP.NET Core分布式项目实战(运行Consent Page)--学习笔记

任务21&#xff1a;运行Consent Page修改 Config.cs 中的 RequireConsent 为 true&#xff0c;这样登录的时候就会跳转到 Consent 页面修改 ConsentController 的 Index 为异步[HttpGet] public async Task<IActionResult> Index(string returnUrl) {var model await Bu…