.NET Core微服务之基于Steeltoe使用Hystrix熔断保护与监控

Tip: 此篇已加入.NET Core微服务基础系列文章索引

=>  Steeltoe目录快速导航

1. 基于Steeltoe使用Spring Cloud Eureka

2. 基于Steeltoe使用Spring Cloud Zuul

3. 基于Steeltoe使用Spring Cloud Hystrix

一、关于Spring Cloud Hystrix

  

.NET Core微服务之基于Steeltoe使用Hystrix熔断保护与监控

  在微服务架构中,我们将系统拆分为很多个服务,各个服务之间通过注册与订阅的方式相互依赖,由于各个服务都是在各自的进程中运行,就有可能由于网络原因或者服务自身的问题导致调用故障或延迟,随着服务的积压,可能会导致服务崩溃。为了解决这一系列的问题,断路器等一系列服务保护机制出现了。

  断路器本身是一种开关保护机制,用于在电路上保护线路过载,当线路中有电器发生短路时,断路器能够及时切断故障电路,防止发生过载、发热甚至起火等严重后果。

  针对上述问题,Spring Cloud Hystrix 实现了断路器、线路隔离等一系列服务保护功能。它也是基于 Netflix 的开源框架 Hystrix 实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix 具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。

  

.NET Core微服务之基于Steeltoe使用Hystrix熔断保护与监控

二、快速集成Hystrix实现熔断保护 2.1 准备工作

  这里仍然基于第一篇的示例进行修改,各个项目的角色如下表所示:

微服务项目名称   项目微服务中的角色  
eureka-service     服务发现&注册(Spring Boot)  
zuul-service     API网关 (Spring Boot)  
agent-service     服务提供者 (ASP.NET Core  
client-service     服务提供者 (ASP.NET Core)  
premium-service     服务提供者&服务消费者 (ASP.NET Core)  

  所有相关服务注册到Eureka之后的服务列表:

  

.NET Core微服务之基于Steeltoe使用Hystrix熔断保护与监控

  这里仍然假设premium-service要调用client-service的接口,我们想要模拟的效果就是针对client-service的调用进行熔断保护。

  要使用Hystrix,需要对服务添加依赖包:

PM> Install-Package Steeltoe.CircuitBreaker.HystrixCore

2.2 为PremiumService添加Hystrix相关类与配置

  (1)增加一个HystrixCommand : ClientServiceCommand

public class ClientServiceCommand : HystrixCommand<string> { IClientService _clientService; ILogger<ClientServiceCommand> _logger; private int _clientId; public ClientServiceCommand(IHystrixCommandOptions options, IClientService clientService, ILogger<ClientServiceCommand> logger) : base(options) { _clientService = clientService; _logger = logger; IsFallbackUserDefined = true; } public async Task<string> GetClientName(int clientId) { _clientId = clientId; return await ExecuteAsync(); } protected override async Task<string> RunAsync() { var result = await _clientService.GetClientName(_clientId); _logger.LogInformation("Run: {0}", result); return result; } protected override async Task<string> RunFallbackAsync() { _logger.LogInformation("RunFallback"); return await Task.FromResult<string>("Sorry, the service is unavaliable now. Please try again later."); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppyyz.html