1.简介
当业务中有非常多的微服务时,微服务之间进行互相调用时,假如一个服务出现了宕机,调用这个服务接口的服务就可能出现大量线程阻塞,甚至可能导致雪崩发生,所以针对这个问题,断路器就出现了。
2.hystrix使用
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
加入开启hystrix注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix //开启hystrix断路器
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class);
}
}
在调用的方法上加入异常调用方法
@HystrixCommand(fallbackMethod = "sentMessageError")//sentMessageError为sentMessage方法调用出现异常后调用的方法
public boolean sentMessage(String phoneNumber, String content) {
String url = "http://CommonIntegration/mail/send?phoneNumber=" + phoneNumber + "&content=" +content;
Boolean result = restTemplate.getForObject(url, Boolean.class);
return result;
}
public boolean sentMessageError(String phoneNumber,String content){
System.out.println("phoneNumber:" +phoneNumber + " content:" + content + " send error");
return false;
}
上述通过使用ribbon调用接口的hystrix的实现方法,feign调用方法本身就支持hystrix,默认是关闭的,在配置文件中设置为true即可
feign:
hystrix:
enabled: true
然后在定义的FeignClient接口加上异常回调类,该类实现了定义的接口
@FeignClient(value = "CommonIntegration",fallback = MessageServiceFeignError.class) //MessageServiceFeignError类为实现MessageServiceFeign接口的类
public interface MessageServiceFeign {
@GetMapping("/mail/send")
boolean sentMessage(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("content") String content);
}
@Component
public class MessageServiceFeignError implements MessageServiceFeign {
@Override
public boolean sentMessage(String phoneNumber, String content) { //实现了接口中的方法,如果出现错误就会调用此方法
System.out.println("send phoneNumber:"+phoneNumber + " content:" + content + "error !!!");
return false;
}
}