基于 YARP 实现一个 Github 的反向代理

基于 YARP 实现一个 Github 的反向代理

Intro

最近 Github 上有一个比较火的项目,是汇集的各个省市停贷的信息,项目地址是:https://github.com/WeNeedHome/SummaryOfLoanSuspension

有看到有人提供了一个 php 的反向代理实现,于是想着我们 .NET 也可以啊,

于是基于 YARP 实现了反向代理,可以在 https://weneedhome.weihanli.xyz/ 这个地址进行体验

基于 YARP 实现一个 Github 的反向代理

基于 YARP 实现一个 Github 的反向代理

基于 YARP 实现一个 Github 的反向代理

YARP

YARP(Yet Another Reverse Proxy) 是微软开源的一个 .NET 的反向代理,提供了很好灵活性和很好的性能,项目地址是:https://github.com/microsoft/reverse-proxy

YARP 里的概念有很多,本文只介绍几个我们用到的,更多介绍可以参考官方文档的介绍:https://microsoft.github.io/reverse-proxy

Route

路由规则,就像我们普通的 API 会有一个 API 请求的方式和路径以及参数等,路由的定义也会有这些信息,比较常用的可能一般是基于请求路径的路由

Cluster

Cluster 代表某一个服务的集合,在现代化的应用中一般一个 API 服务可能会有多个实例,不同的示例会是不同的 endpoint,每一个 endpoint 就是这个 cluster 中的一个目标地址 Destination

Transform

Transform 是指把原始请求转换为需要转发的请求以及将原始响应返回处理的的过程,默认支持了很多种的转换。比如新增或移除请求头、修改 Request Path、响应头、query 等,有的时候内置的转换可能不能满足我们需要,我们也可以自己进行扩展以满足我们的需要

Implement

Yarp 配置

{
  "ReverseProxy": {
    "Routes": {
      "images1" : {
        "ClusterId""githubImages",
        "Match": {
          "Path""/WeNeedHome/SummaryOfLoanSuspension/raw/{*any}"
        }
       },
      "images2": {
        "ClusterId""githubImages",
        "Match": {
          "Path""{**any:regex(.+\.(jpg|png|gif|jpeg))}"
        }
      },
      "default" : {
        "ClusterId""default",
        "Match": {
          "Path""/"
        }
      },
      "main" : {
        "ClusterId""github",
        "Match": {
          "Path""{**catch-all}"
        }
      }
    },
    "Clusters": {
      "githubImages": {
        "Destinations": {
          "github/images": {
            "Address""https://raw.githubusercontent.com/"
          }
        }
      },
      "github": {
        "Destinations": {
          "github/main": {
            "Address""https://github.com/"
          }
        }
      },
      "default": {
        "Destinations": {
          "github/default": {
            "Address""https://github.com/WeNeedHome/SummaryOfLoanSuspension/blob/main/README.md"
          }
        }
      }
    }
  }
}

实现代码:

using Yarp.ReverseProxy.Transforms;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddTransforms(context =>
    {
        if (context.Route.ClusterId == "githubImages")
        {
            context.AddRequestTransform(transformContext =>
            {
                var path = transformContext.HttpContext.Request.Path.Value
                            ?.Replace("/blob/""/").Replace("/raw/""/")
                        ?? "/";
                var query = transformContext.HttpContext.Request.QueryString.HasValue
                    ? $"?{transformContext.HttpContext.Request.QueryString}"
                    : "";
                var url = $"https://raw.githubusercontent.com{path}{query}";
                transformContext.ProxyRequest.RequestUri = new Uri(url);
                return default;
            });
        }
    });

var app = builder.Build();
app.MapReverseProxy();
app.Run();

这里在最基本的代码中加入了一个自定义的 Transform 扩展,主要是为了图片展示的一些优化

举个栗子

默认打开图片路径会是这样的

基于 YARP 实现一个 Github 的反向代理

是对于一个 read-only 的 proxy 来说,这个页面的意义并不太大,所以直接把这个页面会 proxy 到图片的下载地址,proxy 的示例效果如下:

基于 YARP 实现一个 Github 的反向代理


More

接触 YARP 还不是特别多,也许还有更好的方案,也更好的方案也欢迎一起交流~~

也欢迎大家使用 .NET 技术为 全国各省市停贷通知汇总 这个开源项目来添砖加瓦~

References

  • https://github.com/WeNeedHome/SummaryOfLoanSuspension/tree/main/development/frontend/dotnet_proxy
  • https://github.com/WeihanLi/SamplesInPractice/tree/master/YarpSamples/GithubProxySample
  • https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-6.0#route-templates
  • https://weneedhome.weihanli.xyz/
  • https://github.com/microsoft/reverse-proxy
  • https://microsoft.github.io/reverse-proxy


原文始发于微信公众号(amazingdotnet):基于 YARP 实现一个 Github 的反向代理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/59710.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!