Hystrix的使用

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

一 非Feign的Hystrix的使用

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

<dependencies>
    
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
    
     <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
  </dependencies>
     
     
     
     <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Brixton.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
     

 

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

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值