本文讨论了微软的反向代理——YARP。YARP是一个可以创建高性能、高度可定制的反向代理服务器的类库。那么什么是反向代理呢?反向代理是位于用户与目标服务器之间的中间连接点。它接收初始的HTTP连接请求,并根据配置获取实际的服务器资源。反向代理充当了应用程序和用户之间的网关。

YARP是在使用ASP.NET和.NET(.NET Core 3.1和.NET 5.0)的基础架构构建的。YARP的主要优势在于,它可以通过.net代码轻松地进行定制和调整,以满足每个部署场景的特定需求。

YARP可以支持从appsettings.json或代码中进行配置。在这篇文章中,将探索如何在一个空的ASP.NET Core Web应用程序中使用YARP。该应用程序将包括两个ASP.NET Core MVC应用程序。首先,创建一个空的web应用程序。接下来你需要添加YARP包。可以用下面的命令来做到这一点:

-dotnet add package Microsoft.ReverseProxy -version 1.0.0-preview.9.21116.1

添加包之后,可以配置Startup 类来读取配置并启用反向代理。你可以这样做:

public class Startup{
public IConfiguration Configuration { get; set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddReverseProxy()
.LoadFromConfig(Configuration.GetSection("ReverseProxy"));
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseRouting(); app.UseEndpoints(endpoints =>
{
endpoints.MapReverseProxy();
});
}
}

在ConfigureServices方法中,添加了反向代理中间件,并从appsettings.json中读取配置。在Configure方法,添加映射反向代理配置的路由。接下来需要修改配置,可以通过编辑appsettings.json来完成。下面是反向代理配置:

"ReverseProxy": {
"Routes": [
{
"RouteId": "route1",
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
],
"Clusters": {
"cluster1": { "Destinations": {
"cluster1/destination1": {
"Address": "https://localhost:11000"
},
"cluster1/destination2": {
"Address": "https://localhost:12000"
}
}
}
}
}

这个配置主要有两个元素——Routes和Clusters。你可以在Routes中配置终结点路由和url。Match元素为所有路由配置代理。RouteId是路由的唯一名称,ClusterId用于标识后端应用服务器或url。在Clusters中,配置了两个应用程序url。这是同一个应用程序运行在不同的端口上。现在可以运行代理应用程序和其他web应用程序了。其他的web应用程序,你可以在不同的端口运行以下命令:

-dotnet run --url="https://localhost:xxxxx"

现在,尝试浏览https://localhost:5001,将能够看到Web应用程序的索引页。如果你不断刷新,有时你还能看到第二个应用程序。默认情况下,YARP将使用PowerOfTwoChoices算法进行负载均衡,除此之外还有其他内置的策略,比如。

  • First-选择第一个目标,不考虑负载。这对于双目标故障转移系统非常有用。
  • Random-随机选择一个目标。
  • PowerOfTwoChoices(默认)-选择两个随机的目标,然后从中选择一个更少请求的目标。这避免了LeastRequests的开销,也避免了Random选择繁忙目的地的最坏情况。
  • RoundRobin -通过顺序循环选择一个目标。
  • LeastRequests—所有目标中选择分配请求最少的目标。这需要检查所有目标。

要配置任何其他负载均衡策略,可以这样修改配置,这里使用的是RoundRobin算法:

"Clusters": {
"cluster1": {
"LoadBalancingPolicy": "RoundRobin",
"Destinations": {
"cluster1/destination1": {
"Address": "https://localhost:11000"
},
"cluster1/destination2": {
"Address": "https://localhost:12000"
}
}
}

YARP还通过检查目标应用程序的运行状况并基于路由请求来支持流量路由。如果你正在使用ASP.NET Core应用程序,可以启用ASP.NET Core运行状况检查选项。YARP带来了很多新特性和改进。

查看文档和主页(https://microsoft.github.io/reverse-proxy/?WT.mc_id=AZ-MVP-5002040),了解现有特性和如何使用它的更多细节。

原文链接:https://dotnetthoughts.net/getting-started-with-microsoft-yarp/

微软YARP初体验的更多相关文章

  1. 微软最新设计Fluent Design System初体验

    微软最新设计Fluent Design System初体验 本文图片不全!建议移步知乎专栏查看!!! https://zhuanlan.zhihu.com/p/30582886 原创 2017-11- ...

  2. Microsoft IoT Starter Kit 开发初体验

    1. 引子 今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter Kit ,并且免费开放1000套的申请.申请地址为:http:// ...

  3. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  4. Linux之初体验

    预备作业03--我的Linux初体验 学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 一开始以为这个项目很简单,以往也在自己的笔记本上看教程安装过软件, ...

  5. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

    转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...

  6. Microsoft IoT Starter Kit 开发初体验-反馈控制与数据存储

    在上一篇文章<Microsoft IoT Starter Kit 开发初体验>中,讲述了微软中国发布的Microsoft IoT Starter Kit所包含的硬件介绍.开发环境搭建.硬件 ...

  7. .net core安装及初体验

    .net core安装及初体验 .net core 作为微软的新一代技术,在开发跨平台.微服务等方面有很大的优势,也更贴近现代的编码习惯.在2.0版发布很久以后,近期终于决定进行学习和体验. 安装 作 ...

  8. MEF 插件式开发之 DotNetCore 初体验

    背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...

  9. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

随机推荐

  1. UI和3D物体的堆叠响应

    一.问题:当3D物体和UI元素重叠显示时一般UI元素会遮挡物体,这时点击UI元素响应时UI后方的物体也会响应. private void OnMouseDown() { ChangeColor(); ...

  2. C++多元组tuple使用方法?你熟悉吗?快来看看吧

  3. SDNUOJ1016矩形合并

    传送门 题意: 给出n个矩形,把重合的矩形归成一个图形,问合并以后剩下几个图形 思路: 我开始想用dfs,但是发现不太行. 后来知道才是并查集 Orz 用一个结构体数组存矩形的左下角和右上角的坐标,再 ...

  4. 使用Python调用SMTP服务自动发送Email

    需求背景 假设我们想设计一个定时任务,比如每天定时的用python来测试服务是否在正常运行,但是又不希望每天登录到系统后台去查看服务状态.这里我们就可以采取python的smtp模块进行任务结果广播, ...

  5. Hive之insert和insert overwrite

    1. hive 表及数据准备 建表,并插入初始数据.向表中插入 hive> use test; hive> create table kwang_test (id int, name st ...

  6. hdu3555 Bomb(要49)

    Problem Description The counter-terrorists found a time bomb in the dust. But this time the terroris ...

  7. Codeforces Round #552 (Div. 3) E. Two Teams (模拟,优先队列,双向链表)

    题意:有\(n\)个队员站成一排,有两个教练分别选人,每次选当前剩余人中的能力值最大的那个以及他两边相邻的\(k\)个人,问最后每个人所在队伍情况. 题解:优先队列模拟,以及双向链表,先用结构体存入每 ...

  8. Codeforces Round #550 (Div. 3) F. Graph Without Long Directed Paths (二分图染色)

    题意:有\(n\)个点和\(m\)条无向边,现在让你给你这\(m\)条边赋方向,但是要满足任意一条边的路径都不能大于\(1\),问是否有满足条件的构造方向,如果有,输出一个二进制串,表示所给的边的方向 ...

  9. HDU2732 Leapin' Lizards 最大流

    题目 题意: t组输入,然后地图有n行m列,且n,m<=20.有一个最大跳跃距离d.后面输入一个n行的地图,每一个位置有一个值,代表这个位置的柱子可以经过多少个猴子.之后再输入一个地图'L'代表 ...

  10. Is It A Tree? POJ - 1308

    题意: 题目给你一组单向边,当遇到输入0 0就证明这是一组边,当遇到-1 -1就要停止程序.让你判断这是不是一棵树 题解: 题目很简单,但是程序要考虑的很多 1.因为是一颗树,所以肯定不能出现环,这个 ...