微服务入门07 Hystrix 降级框架
这是一个模仿Java的Hystrix的熔断降级框架,对polly进行了封装 提供了熔断、降级、重试、超时、缓存等功能
github 最新地址 https://github.com/yangzhongke/RuPeng.HystrixCore 由杨中科老师维护
- 重试:MaxRetryTimes 表示最多重试几次,如果为 0 则不重试,RetryIntervalMilliseconds 表
- 示重试间隔的毫秒数;
- 熔断:EnableCircuitBreaker 是否启用熔断,ExceptionsAllowedBeforeBreaking 表示熔断前出
- 现允许错误几次,MillisecondsOfBreak 表示熔断多长时间(毫秒);
- 超时:TimeOutMilliseconds 执行超过多少毫秒则认为超时(0 表示不检测超时)
- 缓存:CacheTTLMilliseconds 缓存多少毫秒(0 表示不缓存),用“类名+方法名+所有参数值
- ToString 拼接”做缓存 Key(唯一的要求就是参数的类型 ToString 对于不同对象一定要不一样)
基本使用
安装
Install-Package RuPeng.HystrixCore
降级
//创建Person类
[HystrixCommand(nameof(Hello1FallBackAsync), MaxRetryTimes = 3, EnableCircuitBreaker = true)]
public virtual async Task<string> HelloAsync(string name)//需要是虚方法
{
Console.WriteLine("尝试执行HelloAsync" + name);
String s = null;
s.ToString();
return "ok" + name;
}
[HystrixCommand(nameof(Hello2FallBackAsync))]
public virtual async Task<string> Hello1FallBackAsync(string name)
{
Console.WriteLine("Hello降级1" + name);
String s = null;
s.ToString();
return "fail_1";
}
public virtual async Task<string> Hello2FallBackAsync(string name)
{
Console.WriteLine("Hello降级2" + name);
return "fail_2";
}
ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
{
Person p = proxyGenerator.CreateClassProxy<Person>();
Console.WriteLine(p.HelloAsync("yzk").Result);
}
mvc 中怎么使用
Install-Package AspectCore.Extensions.DependencyInjection
改 Startup.cs 的 ConfigureServices 方法,把返回值从 void 改为 IServiceProvider
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<Person>();
return services.BuildAspectCoreServiceProvider();
}
其 中 services.AddSingleton
BuildAspectCoreServiceProvider 是让 aspectcore 接管注入。
在 Controller 中就可以通过构造函数进行依赖注入了:
public class ValuesController : Controller
{
private Person p;
public ValuesController(Person p)
{
this.p = p;
}
}
通过反射扫描所有 Service 类,只要类中有标记了 CustomInterceptorAttribute 的方法 都算作服务实现类
在Startup ConfigureServices 中
RegisterServices(this.GetType().Assembly, services);
private static void RegisterServices(Assembly asm, IServiceCollection services)
{
//遍历程序集中的所有 public 类型
foreach (Type type in asm.GetExportedTypes())
{
//判断类中是否有标注了 CustomInterceptorAttribute 的方法
bool hasCustomInterceptorAttr = type.GetMethods()
.Any(m => m.GetCustomAttribute(typeof(CustomInterceptorAttribute)) != null);
if (hasCustomInterceptorAttr)
{
services.AddSingleton(type);
}
}
}