Hystrix的使用

在微服务架构中,存在着那么多服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样架构较传统架构更加不稳定,在微服务中引入Hystrix来解决上述问题,当某个服务发生故障的时候,Hystrix通过故障的监控,向调用方返回一个错误的相应,而不是长时间的等待,这样就不会使得现场因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

一 非Feign的Hystrix的使用

1 创建一个hello-consumer的工程,作为服务的消费者,pom.xml如下


    
        
            org.springframework.cloud
            spring-cloud-starter-ribbon
        

        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
      
      org.springframework.cloud
      spring-cloud-starter-eureka-server
   

    
     
      org.springframework.cloud
      spring-cloud-starter-hystrix
   

 
     
     
     
     
       
           
                org.springframework.cloud
                spring-cloud-dependencies
                Brixton.SR5
                pom
                import
           

       

   

     

 

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,也就是回调方法里面的返回值,如图

Hystrix的使用_第1张图片

 

二 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);
    }

}

 

 

你可能感兴趣的:(SpringCloud)