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;
    }
}
03-05 22:29