aspnetcore 学习笔记一
aspnetcore 个人学习笔记一
在面向服务开发的过程中,服务间经常通过api的方式相互调用,而netcore中封装好了一系列可以简化使用的方法(在Microsoft.Extensions.Http 中)
一、在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求
通过配置不同的httpclient客户端,来访问不同的url,比如,可注册和配置 github 客户端,使其访问 GitHub。 可以注册一个默认客户端用于其他用途。
其中包含四种客户端配置方案
二、出站请求中间件
对于多个httpclient请求客户端,面向切面形式来围绕http请求进行管理,如缓存、错误处理、序列化和日志处理
三、基于Polly处理故障
Polly 以表达策略,例如以流畅且线程安全的方式处理重试、断路器、超时、Bulkhead 隔离和回退。Microsoft.Extensions.Http.Polly NuGet 包中提供 Polly 扩展实现将 Polly 策略用于配置的 HttpClient 实例。
Polly 添加策略分为三种
1. AddTransientHttpErrorPolicy:是处理Http请求的错误,如HTTP 5XX 的状态码,HTTP 408 的状态码 以及System.Net.Http.HttpRequestException异常
2. AddPolicyHandler:添加自定义策列
3. AddPolicyHandlerFromRegistry:从Policy注册表集合里面选择添加
a. AddTransientHttpErrorPolicy
services.AddHttpClient<RequestClient>() .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(3, t => TimeSpan.FromMilliseconds(500))) //或。上下都是定义了,错误重试上面是间隔都是500毫秒,下面则定义了每次重试的时间间隔 .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10) }));
b. AddPolicyHandler
先定义策略,在通过AddPolicyHandler方法添加,改方法接收一个泛型的IAsyncPolicy<HttpResponseMessage>。HttpResponseMessage我理解为出站请求上下文
var retryPolicy = Policy.Handle<HttpRequestException>() .OrResult<HttpResponseMessage>(response => { //此处实现处理改异常的逻辑 return true; }).WaitAndRetryAsync(3,t => TimeSpan.FromMilliseconds(50)); services.AddHttpClient<RequestClient>() .AddPolicyHandler(retryPolicy);
retryPolicy:发生HttpRequestException的异常,并且OrResult返回结果为true,采用这个策略
c. AddPolicyHandlerFromRegistry
先注册策略表服务,为策略表添加策略,最后通过AddPolicyHandlerFromRegistry方法选用某个或几个策略
//注册,策略表服务 var registry = services.AddPolicyRegistry(); //创建策略 var retryPolicy = Policy.Handle<HttpRequestException>() .OrResult<HttpResponseMessage>(response => { //此处实现处理改异常的逻辑 return true; }).WaitAndRetryAsync(3, t => TimeSpan.FromMilliseconds(50)); registry.Add("registry1", retryPolicy); services.AddHttpClient<RequestClient>() .AddPolicyHandlerFromRegistry("registry1");
添加多个 Polly 处理程序嵌套 Polly 策略以增强功
分别定义三种策略,timeoutPolicy,noOpPolicy,retryPolicy 通过策略表的方式和自定义。添加多个策略。
//注册,策略表服务 var registry = services.AddPolicyRegistry(); //创建策略 var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(10);//10秒超时 var noOpPolicy = Policy.NoOpAsync().AsAsyncPolicy<HttpResponseMessage>();//有时我们也需要一个没有任何行为的策略,Polly系统默认提供了一个. var retryPolicy = Policy.Handle<HttpRequestException>() .OrResult<HttpResponseMessage>(response => { //此处实现处理改异常的逻辑 return true; }).WaitAndRetryAsync(3, t => TimeSpan.FromMilliseconds(50)); registry.Add("registry1", retryPolicy); registry.Add("registry2", timeoutPolicy); services.AddHttpClient<RequestClient>() .AddPolicyHandlerFromRegistry("registry1") .AddPolicyHandler(retryPolicy) .AddPolicyHandler(timeoutPolicy);
未完待续................
使用过程中的问题接续......