在微服务架构中,存在着那么多服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样架构较传统架构更加不稳定,在微服务中引入Hystrix来解决上述问题,当某个服务发生故障的时候,Hystrix通过故障的监控,向调用方返回一个错误的相应,而不是长时间的等待,这样就不会使得现场因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
一 非Feign的Hystrix的使用
1 创建一个hello-consumer的工程,作为服务的消费者,pom.xml如下
2 在主类中@EnableCircuitBreaker注解开启断路器功能
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class HelloConsumerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(HelloConsumerApplication.class, args);
}
}
3 在helloConsumer的方法上面增加@HystrixCommand注解来指定服务出现故障的时候回调的方法
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod="helloFallback")
public String helloConsumer( ) {
String ss=restTemplate.getForEntity("http://hello-service/hello2", String.class).getBody();
return ss;
}
public String helloFallback() {
return "error";
}
}
4 controller类
@RestController
public class HelloConsumerController {
@Autowired
HelloService HelloService;
@RequestMapping("/ribbon-consumer")
public String helloConsumer( ) {
String ss= HelloService.helloConsumer();
return ss;
}
}
5 application.yml的配置
server:
port: 9000
eureka:
client:
serviceUrl: #注册中心的注册地址
defaultZone: http://peer1:8761/eureka/,http://peer2:8771/eureka/
spring:
application:
name: hello-consumer
5 启动hello-consumer工程,并关闭服务端的工程,会发现访问http://127.0.0.1:9000/ribbon-consumer,返回的是error,也就是回调方法里面的返回值,如图
二 Feign中如何使用Hystrix
1 fallback指定失败的类
@FeignClient(name="hello-service",fallback=HelloServiceFallback.class)
public interface HelloService {
@RequestMapping("/hello")
String hello();
@RequestMapping("/hello3")
public String hello3(@RequestParam("name") String name ) ;
@RequestMapping("/hello5")
public User hello5(@RequestHeader("name") String name,@RequestHeader("age") int age ) ;
@RequestMapping("/hello6")
public String hello6(@RequestBody User user ) ;
@RequestMapping("/hello7/{name}/{age}")
public User hello7(@PathVariable("name") String name,@PathVariable("age") int age) ;
}
2 HelloServiceFallback继承HelloService,对于每个方法都重写一个失败的回调方法。
@Component
public class HelloServiceFallback implements HelloService {
@Override
public String hello() {
return "error hello()";
}
@Override
public String hello3(@RequestParam("name") String name ) {
return "error hello3(String name ) ";
}
@Override
public User hello5(@RequestHeader("name") String name,@RequestHeader("age") int age ){
return new User("hello5",0);
}
@Override
public String hello6(@RequestBody User user ){
return "error hello6( User user )";
}
@Override
public User hello7(@PathVariable("name") String name,@PathVariable("age") int age){
return new User("hello7",0);
}
}