YARP简介 —— IHttpProxy


YARP框架中,核心处理类是IHttpProxy,其接口定义如下:

Task ProxyAsync(HttpContext context, string destinationPrefix, HttpMessageInvoker httpClient, RequestProxyOptions requestOptions, HttpTransformer transformer)

从它的接口定义基本可以看出它的功能:从 HttpContext 创建 Http 查询信息、发送到目标地址,并将响应结果写会HttpContext。

IhttpProxy特点如下:

  1. 灵活,能根据请求动态选择代理目标
  2. 强大,能修改http请求和响应的头
  3. 支持gRPC或WebSockets这种流式协议
  4. 支持异常处理

它简单灵活,本身是一个反向代理的功能类的。 用它本身是可以非常简单的实现一个反向代理功能的。代码如下: 

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3     services.AddHttpProxy();
 4 }
 5 
 6 public void Configure(IApplicationBuilder app, IHttpProxy httpProxy)
 7 {
 8     var httpClient = new HttpMessageInvoker(new SocketsHttpHandler()
 9     {
10         UseProxy = false,
11         AllowAutoRedirect = false,
12         AutomaticDecompression = DecompressionMethods.None,
13         UseCookies = false
14     });
15     var transformer = new CustomTransformer(); // or HttpTransformer.Default;
16     var requestOptions = new RequestProxyOptions { Timeout = TimeSpan.FromSeconds(100) };
17 
18     app.UseRouting();
19     app.UseAuthorization();
20     app.UseEndpoints(endpoints =>
21     {
22         endpoints.Map("/{**catch-all}", async httpContext =>
23         {
24             await httpProxy.ProxyAsync(httpContext, "https://localhost:10000/", httpClient,
25                 requestOptions, transformer);
26 
27             var errorFeature = httpContext.GetProxyErrorFeature();
28             if (errorFeature != null)
29             {
30                 var error = errorFeature.Error;
31                 var exception = errorFeature.Exception;
32             }
33         });
34     });
35 }
View Code

这里为了演示请求和相应头的功能,自定义了一个HttpTransformer,代码如下。 

 1 private class CustomTransformer : HttpTransformer
 2 {
 3     public override async Task TransformRequestAsync(HttpContext httpContext,
 4         HttpRequestMessage proxyRequest, string destinationPrefix)
 5     {
 6         // Copy headers normally and then remove the original host.
 7         // Use the destination host from proxyRequest.RequestUri instead.
 8         await base.TransformRequestAsync(httpContext, proxyRequest, destinationPrefix);
 9         proxyRequest.Headers.Host = null;
10     }
11 }
View Code

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

参考文章:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM