Hystrix
Hystrix介绍
在分布式系统环境中,微服务之间难免会互相依赖调用,也难免会遇到服务调用失败的情况,这时就需要一个公共组件来维护系统的健壮性,保证系统有一定的容错能力,并且对服务进行监控和保护,Hystrix就是这个公共组件,它能够在服务失效的情况下,通过隔离系统依赖的方式防止服务级联失败。
Hystrix是Netflix的一个开源组件,2011-2012年诞生并成熟,Netflix的很多项目都使用了Hystrix。
设计目标
1、为通过第三方客户端库访问的依赖项(通常通过网络)提供保护和控制延迟和故障
2、停止复杂分布式系统中的级联故障
3、故障快速恢复。
4、在可能的情况下,后退并优雅地降级
5、启用近实时监视、警报和操作控制
快速入手
对于服务熔断需要考虑两种情况:
1、服务提供方正常,但是接口报错
2、服务提供方失联
服务提供方正常,接口报错
对于这种情况更像是异常处理。
分以下三个步骤:
1、服务提供方引入Hystrix 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2、在服务提供方启动类加注解
@EnableDiscoveryClient @EnableCircuitBreaker @EnableEurekaClient @SpringBootApplication(scanBasePackages = {"site.sunlong.*.*"}) public class EurekaProviderApplication { public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } }
3、对外提供的接口添加@HystrixCommand注解,fallbackMethod配置调用类的指定方法
ProviderController.java
@RequestMapping("/provider") @RestController public class ProviderController { @Resource private ApplicationArguments applicationArguments; @Autowired private ProviderService providerService; @GetMapping("/hello") public String test(){ final String[] sourceArgs = applicationArguments.getSourceArgs(); System.out.println(Arrays.toString(sourceArgs)); return "Hello , I'm provider ,args:"+ Arrays.toString(sourceArgs); } @HystrixCommand(fallbackMethod = "testHystrixFallBack") @GetMapping("/getName/{name}") public String testHystrix(@PathVariable String name) throws Exception { return providerService.getArgs(name); } String testHystrixFallBack(@PathVariable String name){ return "name: "+name +" is not exist."; } }
ProviderServiceImpl.java
@Service public class ProviderServiceImpl implements ProviderService { @Resource private ApplicationArguments applicationArguments; /** * 获取启动参数 * * @return */ @Override public String getArgs(String name) throws Exception { if ("ex".equals(name)) { throw new Exception(); } return name+"---"+Arrays.toString(applicationArguments.getSourceArgs()); } }
测试:
浏览器地址栏输入服务者调用接口
正确调用:
输入报错参数调用:
服务提供方失联
如果服务提供方失联为了更友好的体验,要在消费端进行及时的降级
首先要在消费端配置文件中添加 feign.hystrix.enabled=true
然后进行反馈,降级反馈有两种实现方式
实现feign.hystrix.FallbackFactory
@Component public class ProviderFallbackFactory implements FallbackFactory<ProviderService> { @Override public ProviderService create(Throwable throwable) { return new ProviderServiceFallback(); } }
在消费端实现生产端接口
@Component public class ProviderServiceFallback implements ProviderService { @Override public String test() { return "consumer - test - fallback"; } @Override public String testHystrix(String name) { return "consumer -testHystrix- fallback"; } }
FeignClient注解修改:
如果是第一张方式添加属性fallbackFactory = ProviderFallbackFactory.class
否则添加属性fallback = ProviderServiceFallback.class
@FeignClient(name = "PROVIDER" , path = "provider" , fallback = ProviderServiceFallback.class) //@FeignClient(name = "PROVIDER" , path = "provider" , fallbackFactory = ProviderFallbackFactory.class) public interface ProviderService { @GetMapping("hello") public String test(); @GetMapping("getName/{name}") public String testHystrix(@PathVariable String name); }
测试:
停掉服务提供方,进行接口测试:
至此一个Hystrix的简单使用就完成了,下篇将会学习一下HystrixDashboard的使用
springcloud 搭建更多请查看:
springcloud 项目一步一步搭建(1)之eureka
springcloud 项目一步一步搭建(2)之Ribbon
GitHub地址:
https://github.com/ArronSun/micro-services-practice.git
能力一般,水平有限,如有错误,请多指出。