在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