当前位置:网站首页>容错、熔断的使用与扩展
容错、熔断的使用与扩展
2022-07-13 19:08:00 【InfoQ】
一、容错机制的介绍
- 概念当客户端调用微服务的时候,出现了故障,能够进行故障转移,就是容错机制。如图:

- 目的保证微服务的高可用。
二、为什么使用容错机制
- 故障转移机制如图:
三、如何在微服务中应用容错机制
- 实现条件
- 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("根据不同的服务定义不同的名称");
边栏推荐
猜你喜欢
随机推荐
从多语言数据集中提取出自己需要的语言并保存为csv
How to solve the problem that the computer shared file cannot be opened
快讯:京东科技发布“百亿收入计划”;博通软件业务总裁离职
面试诈骗:竟然还有靠面试挣钱的公司
Hj8 consolidated statement record hj08
[go] II. Introduction to restful API, API process and code structure
不刷新页面内容,改变浏览器访问地址url
【Day 2】机器阅读理解——常见机器阅读理解模型(上)
EMQX Cloud 更新:新增 Redis 和 JWT 外部认证授权
[server data recovery] a data recovery case in which a brand of MSA SAN storage RAID5 is paralyzed and the upper Lun cannot be used
匿名管道原理及详解(非常实用)
Otacle table query
Hcip day 4 notes
渲染流程,代码是如何变为页面的(一)
Either retire, change careers, or change management. PS hasn't blogged for two months
[day 2] machine reading comprehension -- common machine reading comprehension models (Part 1)
Brief discussion -- views on the management of technological transformation
创原会丨携手50+云原生企业,共探跨越数字化鸿沟新模式
如何报考PMP项目管理认证考试?
Programmer transformation project management? Get a PMP?










