什么是熔断器?
熔断器相当于电路当中的保险丝一样,如果在一段时间内发生多次失败,则会直接导致后续调用全部失败。如果已修正,则应用程序会再次发起调用操作。
如何使用?
- 在创建新的springboot项目中勾选【Hystrix】或者pom里增加
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 在XXXApllication文件中增加@EnableCircuitBreaker 注解
- 改造之前的服务消费者,将RestTemplate封装为service
- 在service 中使用HystrixCommand注解需要降级的方法。
@Service
public class RestService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod="indexfallback")
public String index(int i,int j)
{
return restTemplate.getForEntity("http://restservice1/xyf/hello",String.class).getBody();
}
public String indexfallback(int i,int j)
{
return "降级调用";
}
}
关键点:
@HystrixCommand(fallbackMethod=“indexfallback”)的意思是:当调用服务失败的时候,调用indexfallback方法,fallbackMethod参数返回值要和原方法一样。这种A方法调用失败(比如请求出错、服务器无法连接等),转而调用B方法的做法叫“服务降级”,也可以在indexfallback中继续标注@HystrixCommand,这样如果indexfallback失败那么会继续降级
异常处理
HystrixCommand方法中如果出现了任何异常,那么会导致降级,前文已经提到,那么如果说想要某些异常不导致服务降级,那么可以使用HystrixCommand的ignoreExceptions指定多个异常。可以给接受降级的方法增加一个Throwable类型的参数,这样当发生服务降级的时候,就可以得到异常信息。ignoreExceptions表示忽视异常。
例如:
@HystrixCommand(fallbackMethod="indexfallback",ignoreExceptions= {IllegalArgumentException.class)
@Service
public class RestService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod="indexfallback",ignoreExceptions= {IllegalArgumentException.class})
public String index()
{
int i = 3;
if(i>0)
{
throw new NullPointerException("i3错误");
}
if(i==3)
{
throw new IllegalArgumentException("i错误");
}
return restTemplate.getForEntity("http://restservice1/xyf/hello",String.class).getBody();
}
public String indexfallback(Throwable t)
{
return "降级调用"+t;
}
}