springcloud 入门(4) 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
springcloud 项目一步一步搭建(3)之Feign
GitHub地址:
https://github.com/ArronSun/micro-services-practice.git
能力一般,水平有限,如有错误,请多指出。