@[toc]
一、容错机制的介绍
- 概念
当客户端调用微服务的时候,呈现了故障,可能进行故障转移,就是容错机制。
如图: -
目标
保障微服务的高可用。二、为什么应用容错机制
- 故障转移机制
如图:
三、如何在微服务中利用容错机制
-
实现条件
- while
-
实现步骤
int count = 0; // 故障转移 for(int i=0;i<=3;i++) { // 判断是否达到阀值 if (count == 3) { // 退出循环,返回异样信息 throw Exception("微服务重试操作超出阀值"); } // 业务代码 try { // HttpClient 申请微服务代码 ................... } catch(Exception ex) { // 捕捉异样信息 count ++; } }
四、容错机制的缺点
-
缺点
- 性能低,耗资源
-
解决方案
- 设置固定的次数
-
应用熔断机制
五、如何在微服务零碎中应用 Polly
-
熔断
- 概念
熔断的是一个申请。
当申请到服务器的时候,该申请重试了 3 次【测试次数】,没有申请胜利,间接熔断该申请,下次申请进来,不用再去重试,间接返回异样信息。
- 概念
-
条件
- Polly
-
代码实现
-
条件
- 装置 Polly
-
步骤
-
装置
Microsoft.Extensions.Http.Polly
-
在 Startup.cs 文件中注册
-
办法名 ConfigureServices
// 异样降级信息 var fallBack = new HttpResponseMessage(){Content = new StringContent("零碎忙!"), StatusCode = 504 }; //5:断路器阀值 //10:熔断工夫 //ExecutionRejectedException: 捕捉熔断的所有异样信息 //10:应用的线程总数 services.AddHttpClient("micro[申请复用:自定义名称]") .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<ExecutionRejectedException>().Fallback(fallBack)) // 异样信息降级 .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().CircuitBreakerAsync(5,TimeSpan.FromSeconds(10))) // 断路器 .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMeaage>(60))// 设置超时工夫 .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().RetryAsync(1))// 重试次数 .AddPolicyHandler(Policy.BulkheadAsync<HttpResponseMeaage>(10,100));// 资源(线程)隔离 //10:应用的线程总数 100: 申请缓存总数
-
业务代码
private HttpClientFactory _httpClientFactory; // 构造函数中注入 构造函数(HttpClientFactory httpClientFactory) {_httpClientFactory = httpClientFactory;} int count = 0; // 故障转移 for(int i=0;i<=3;i++) { // 判断是否达到阀值 if (count == 3) { // 退出循环,返回异样信息 throw Exception("微服务重试操作超出阀值"); } // 业务代码 try { // 微服务申请 HttpClient client = _httpClientFactory.CreateClient("micro"); ......... } catch(HttpRequestException ex) { // 捕捉异样信息 count ++; } }
六、微服务容错机制 Polly 扩大
-
-
-
-
如果在聚合微服务中同时调用了两个微服务,当第一个服务挂掉,为了不影响前面的服务调用,咱们要做服务隔离,代码如下:
-
在 Startup.cs 文件中注册
-
办法名 ConfigureServices
services.AddHttpClient("依据不同的服务定义不同的名称") .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<ExecutionRejectedException>().Fallback(fallBack)) // 异样信息降级 .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().CircuitBreakerAsync(5,TimeSpan.FromSeconds(10))) // 断路器 .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMeaage>(60))// 设置超时工夫 .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().RetryAsync(1))// 重试次数 .AddPolicyHandler(Policy.Bulkhead<HttpResponseMeaage>(10,100));// 资源隔离
== 留神:当 http 申请的时候,申请各自服务的名称必须和注册名称统一。==
-
-
调用方代码
HttpClient client = _httpClientFactory.CreateClient("依据不同的服务定义不同的名称");
-