目录

Welcome to YARP - 1.认识YARP并搭建反向代理服务

Welcome to YARP - 2.配置功能

Welcome to YARP - 3.负载均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份验证和授权

Welcome to YARP - 6.压缩、缓存

Welcome to YARP - 7.目标健康检查

Welcome to YARP - 8.分布式跟踪

目前规划了8篇文章,但是能写多少还不确定,哈哈哈。毕竟上班才是主线,只能空闲时间去了解

介绍

YARP 是微软在.NET Core基础架构之上实现的一个反向代理工具包,他的设计初衷是提供核心代理功能的库。

当然也有人拿它做为Gateway来使用。不是特别复杂的网关需求,那么YARP是完全可以胜任的。

什么是反向代理?

反向代理是一个中间层服务器,位于客户端和一个或多个后端服务器之间。它接收来自客户端的请求,然后将这些请求转发给一个或多个后端服务器,最终将后端服务器的响应返回给客户端。反向代理通常用于隐藏后端服务器的真实身份和细节,增加安全性,缓存内容,负责SSL终结等任务。

主要功能

  • 反向代理
  • 负载均衡
  • 限流(此功能仅在使用 .NET 7.0 或更高版本时可用)
  • 身份验证和授权
  • 压缩、缓存
  • 健康检查
  • 分布式跟踪等

主要特点

  • 高效、强大并具有.NET本身的特点:你可以在.NET中使用YARP快速构建一个强大、高性能的代理服务
  • 稳定可靠YAPR提供了主动和被动健康检查,还提供了多种问题诊断机制
  • 可定制化:可以添加或者替换模块来自定义这些功能。(其最大的特点就是可定制化

快速开始

本文演示的环境为:.NET 6 + YARP 2.0.1

注意:部分教程包括官方文档的实例代码用的都是2.0.0版本,但是2.0.0版本的YARP包官方已经报告出有严重的bug(A denial of service vulnerability exists in YARP.)拒绝服务(DOS)的漏洞。截止2023.10.25 YAPR只有两个可用的正式版本,分别是1.1.2和2.0.1。如果你的项目用的是1.x版本请升级到1.1.2,2.x版本则升级到2.0.1

1.创建项目

首先使用命令行创建一个 “空” 的ASP.NET Core 应用程序:

  1. dotnet new web -n MyProxy -f net6.0

或者在 Visual Studio 2022 中创建新的 ASP.NET Core Web 应用程序。

2.添加项目引用

  1. <ItemGroup>
  2. <PackageReference Include="Yarp.ReverseProxy" Version="2.0.1" />
  3. </ItemGroup>

或者使用在程序包管理控制台输入一下命令

  1. dotnet add package Yarp.ReverseProxy --version 2.0.1

3.添加 YARP 中间件

  1. var builder = WebApplication.CreateBuilder(args);
  2. builder.Services.AddReverseProxy()//添加ReverseProxy相关服务到DI
  3. //从配置文件中加载ReverseProxy的设置
  4. .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
  5. var app = builder.Build();
  6. app.MapReverseProxy();//使用ReverseProxy中间件
  7. app.Run();

主要的代码就三行,已经用注释进行标注。

4.Configuration 配置

我们先用appsettings.json 文件来配置YARP。 当然还可以以编程方式提供配置。 下篇文章我们再用另一种方式实现。

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. }
  8. },
  9. "AllowedHosts": "*",
  10. "ReverseProxy": {
  11. "Routes": {
  12. "route1" : {
  13. "ClusterId": "cluster1",
  14. "Match": {
  15. "Path": "{**catch-all}"
  16. }
  17. }
  18. },
  19. "Clusters": {
  20. "cluster1": {
  21. "Destinations": {
  22. "destination1": {
  23. "Address": "https://cn.bing.com/"
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }

具体配置是什么涵义可以往下看,或者移步第二篇看更详尽的配置说明。

5.运行项目

MyProxy.csproj文件目录下使用命令行工具运行dotnet run命令或者在VS中直接F5运行。

查看效果:

可以看到我们已经代理了必应站点,当我们访问代理服务器(http://localhost:5177)时,显示的是必应的搜索界面,客户端对必应这个站点是完全无感知的,也不会知道必应的服务地址是多少

注意:项目本身注册的路由是不受代理影响的。当你访问此路由时不会被代理。例如:app.MapGet("/hello", () => "Hello World!"); 此时你访问http://localhost:5177/hello会正常返回结果,不会被代理到必应的。

配置讲解

  1. "ReverseProxy": {
  2. "Routes": {
  3. //描述一个路由,该路由根据匹配规则匹配传入的请求,并将匹配请求的代理到其ClusterId标识的群集。
  4. "route1" : {
  5. //与此路由匹配的集群标识。这里与下文的cluster1对应,如果路由匹配正确则访问cluster1配置的后端服务器地址。
  6. "ClusterId": "cluster1",
  7. //匹配规则 这里个正则表示匹配任何路径
  8. "Match": {
  9. "Path": "{**catch-all}"
  10. }
  11. }
  12. },
  13. //后端服务器集群
  14. "Clusters": {
  15. //集群标识
  16. "cluster1": {
  17. //服务器配置
  18. "Destinations": {
  19. //目标服务器1,可以有多个
  20. "destination1": {
  21. //服务器地址
  22. "Address": "https://cn.bing.com/"
  23. }
  24. }
  25. }
  26. }
  27. }

总结

本文介绍了YAPR是什么及功能优点和如何快速入门YARP。以上示例的代码已上传GitHub示例代码,在MyProxy文件夹下。

下一篇将介绍YAPR的配置功能:配置文件、Configuration Providers(可以有多种方式提供配置)、及Configuration Filters(配置过滤器)。

Welcome to YARP - 1.认识 YARP 并构建反向代理服务的更多相关文章

  1. YARP实现Dapr服务调用的反向代理

    楔子 公司即将新开项目,打算用点时髦的技术,需要探探路.之前没做过微服务项目,没有技术栈方面的积(负)累(债), 干脆就上微软的分布式运行时Dapr......嗯......用来服务发现,然后等测试用 ...

  2. 解决异地服务器接口访问跨域,node构建反向代理

    跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...

  3. 【译】Introducing YARP Preview 1

    1 YARP YARP是一个项目,用于创建反向代理服务器.它开始于我们注意到来自微软内部团队的一系列问题.他们要么为其服务构建反向代理,要么询问 API 和用于构建 API 的技术.因此我们决定让他们 ...

  4. YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关

    YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...

  5. C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

    关于 Neting 刚开始的时候是打算使用微软官方的 Yarp 库,实现一个 API 网关,后面发现坑比较多,弄起来比较麻烦,就放弃了.目前写完了查看 Kubernetes Service 信息.创建 ...

  6. SLR,语法分析表的构建

    太累了,感觉不会再爱了.执行了跟编译原理上的一模一样的例子,输出了正确结果 #include <stdio.h> #include <malloc.h> #include &l ...

  7. .net core下简单构建高可用服务集群

    一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,如zeekeeper ,反向代理服务网关等一系列的搭建和配置等等:总得来说需要有一定经验和规划的团队才能应用起来.在这文章里你能看到在.net ...

  8. Nginx-Cluster 构建

    nx-Cluster and ReverseProxyServer-----------ReProxy-------------------------Client-----------192.168 ...

  9. 构建squid代理服务器

    基本概念 本文使用squid代理服务 软件介绍:百度百科 作为应用层的代理服务软件,Squid主要提供缓存加速.应用层过滤控制的功能: 工作机制:缓存网页对象,减少重复请求(HTTP代理的缓存加速对象 ...

  10. Nginx+lamp构建动静分离项目

    一.nginx代理的概述 概述:nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个内部网络代理上网的代理 ...

随机推荐

  1. Java并发(八)----使用线程避免cpu占用100%

    1.sleep 实现 在没有利用 cpu 来计算时,不要让 while(true) 空转浪费 cpu,这时可以使用 yield 或 sleep 来让出 cpu 的使用权给其他程序 while(true ...

  2. 逆天的全排列函数next_permutation()

    next_permutation 是算法库(<algorithm>)里的一个用于求全排列的函数,其定义为 next_permutation(_BidIt _First, _BidIt _L ...

  3. Delphi实现登录窗体与主窗体的过程

    登录窗体: type TfrmLogin = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { P ...

  4. Hive-服务启动和停止命令

    1.启动命令 #!/bin/bash nohup hive --service metastore >> $HIVE_HOME/logs/metasotre.log 2>&1 ...

  5. NC18987 粉嘤花之恋

    题目链接 题目 题目描述 qn是个特别可爱的小哥哥,qy是个特别好的小姐姐,他们两个是一对好朋友 [ cp (划掉~) 又是一年嘤花烂漫时,小qn于是就邀请了qy去嘤花盛开的地方去玩.当qy和qn来到 ...

  6. Swoole从入门到入土(15)——WebSocket服务器[初步接触]

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.换句话说,Websocket让web可以与服务端实现长连接. 在Swoole中,通过内置的 WebSock ...

  7. 好用的OCR文本识别工具

    之所以会用到OCR工具,是因为在看一些扫描版的PDF文档时,有时候需要复制粘贴一些文字,特别是技术性文档,对于一些命令或者代码片段需要复制出来执行验证. 网络上有许多推荐OCR工具的文章,但是大多数都 ...

  8. Jina AI x 矩池云Matpool |神经搜索引擎,一键构建

    图片.视频.语音等非结构化数据在快速增长,随着深度学习技术的不断升级,非结构化数据的搜索也逐渐形成可能.在这样的背景下,专注于神经搜索技术的商业开源软件公司--Jina AI,提出了神经搜索 (Neu ...

  9. 制作docker方式执行Gitlab Runner所需要的镜像

    背景知识 启动Gitlab Runner时,使用Gitlab提供的官方镜像gitlab/gitlab-runner:latest即可. Runner以容器的方式启动以后,根据前文我们注册到Gitlab ...

  10. ECMA Script Module(ES module)知识点

    1.每个 ES Module 都是运行在单独的私有作用,ESM 自动采用严格模式,忽略use strict <script type="module">console. ...