受欢迎的博客标签

Creating a Forward Proxy Server with Yarp.ReverseProxy.Forwarder(IHttpForwarder)

Published

在YARP框架中,核心处理类是IHttpForwarder接口,它实现了基础的转发流程:从 HttpContext 创建 Http 查询信息、发送到目标地址,并将响应结果写会HttpContext。

IHttpForwarder特点如下:

灵活,能根据请求动态选择代理目标
强大,能修改http请求和响应的头
支持gRPC或WebSockets这种流式协议
支持异常处理
它简单灵活,本身是一个反向代理的功能类的。 用它本身是可以非常简单的实现一个反向代理功能的。代码如下: 

using Yarp.ReverseProxy.Forwarder;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpForwarder();        //添加服务

var httpClient = new HttpMessageInvoker(new SocketsHttpHandler()
{
    UseProxy          = false,
    AllowAutoRedirect = false,
});
var requestConfig = new ForwarderRequestConfig();

var app    = builder.Build();
var forwarder = app.Services.GetService<IHttpForwarder>();

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.Map("/test/{**catch-all}", async httpContext =>
    {
        await forwarder.SendAsync(httpContext, "http://localhost:5132/",
            httpClient, requestConfig, HttpTransformer.Default);
    });
});

app.Run();

跑起来后,就可以发现test下的接口都已经可以转发到 http://localhost:5132/ 了。

     

更多信息可以参看微软的官方文档Direct Forwarding,微软也提供了一个最简单的完整示例ReverseProxy.Direct.Sample。

上述代码本身是实现了一个完整的的反向代理的功能的。和目前的主流的反向代理框架比起来,主要缺少一些高级功能,如:路由匹配、负载均衡、会话保持、重试等。但这些高级功能本身不是必须的,这个时候直接用IhttpProxy更加简单直接,也可以方便我们自己构建一个更加灵活高效的反向代理框架。

 

https://www.cnblogs.com/TianFang/p/16357549.html

https://microsoft.github.io/reverse-proxy/articles/direct-forwarding.html