淺析微軟的網關項目 -- ReverseProxy

来源:https://www.cnblogs.com/weihanli/archive/2020/05/14/intro-for-yarp.html
-Advertisement-
Play Games

淺析微軟的網關項目 Intro 最近微軟新開了一個項目 "ReverseProxy" ,也叫做 YARP(A Reverse Proxy) 官方介紹如下: YARP is a reverse proxy toolkit for building fast proxy servers in .NET ...


淺析微軟的網關項目 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 selection
            proxyPipeline.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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .net core 3.1中將session持久化到redis,從core1.0開始,2.0/2.1,3.0/3.1每次搭建開發框架都因為session的問題搞的頭大,次次踩坑,花了半天時間再次捋了一遍,發出來如果大家有跟我一樣,希望能幫到你,另外如果有幫到你,記得點贊哈!!! 1.需引入的庫文件 ...
  • 1、前言 文件配置提供程式預設的給我們提供了ini、json、Xml等。都是讀取不同格式的文件。文件配置提供程式支持文件可尋、必選、文件變更的監視。 2、讀取配置文件 主要運用的包:需要Ini、xml的添加相關包就行。 這次依然使用 Core3.1 WebApi項目,在啟動程式介面裡面讀取json配 ...
  • 最近公司開發的項目,分開的版本太多,但是又不是聯網版本,也就沒有登錄,不能通過用戶登錄來控制相關功能。 比如A局有個改動要求,B局有個改動要求,但是,又是同時修改的一個M文件,原來的做法是,把M文件複製一下,分別給A局和B局修改,但是這種方法有個很大的問題,就是修改公共的部分代碼,就需要Double ...
  • 介紹一套用C#寫的WindowForm進銷存管理系統,它有一個特點,也非常有意義。 特點: 系統涵括進銷存的各種業務功能,對想瞭解進銷存的開發人員有一定引導作用,其次是UI規劃相對整潔。 意義: 這是我在大學時期,使用了一個暑假假期的時間研發出來的,當時我還在研究C++,初聞C#誕生,便嘗試用它開發 ...
  • <asp:Repeater ID="rptList" runat="server" OnItemDataBound="Getdata"> <HeaderTemplate> <table width="100%" border="0" cellspacing="0" cellpadding="0" c ...
  • 公司自動開始用釘釘後,企業的相關信息化軟體開始使用釘釘上的應用程式。與銷售公司相關的就是CRM系統。 CRM系統中客戶是私人的,如果想多個人同時負責,需要添加客戶負責人。由於公司的特殊性質,客戶特別多,經常會有人要求增加客戶負責人。每天都有幾個小時在做這樣的工作。釘釘消息、添加負責人,太繁瑣了。 學 ...
  • 互聯網時代,軟體開發所使用的的模式也在逐漸變化。 如今,各行各業都追求信息化,努力跟上時代的步伐,可是這天天跟電腦、跟信息化打交道的軟體業卻其實跟互聯網沒半點關係。因為,互聯網是以人為中心,走的是高流量高流水的模式;而軟體業做的是產品,一個項目即是一個產品,產品之間無法複製通用。 有人說,不一直都 ...
  • 0.前言 上一章簡單介紹了一下ORM框架,並手寫了一個類似ORM的工具類。這一章將介紹一個在C 世界里大名鼎鼎的ORM框架——Entity Framework的Core版。 Entity Framework 非Core版目前已經更新到了6代,這是一款經過檢驗的ORM框架。在這裡簡單介紹一下Entit ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...