前言

在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:

《SpringCloud》4 容错处理(Hystrix)_字符串

较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。

《SpringCloud》4 容错处理(Hystrix)_spring_02

断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。

在ribbon使用断路器

引入依赖

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

@EnableHystrix注解开启Hystrix

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
/**
 * @EnableHystrix 开启Hystrix
 * */
public class RbbionApp {
    public static void main(String[] args) {
        SpringApplication.run(RbbionApp.class,args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

@HystrixCommand

Service方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为"hi,"+name+",sorry,error!",代码如下:

@Service
public class TestService {

    @Autowired
    RestTemplate restTemplate;
    
    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://eureka-service/hi?name="+name,String.class);
    }
    public String hiError(String name) {
        return "hi,"+name+",sorry,error!";
    }
}

启动ribbon-service 项目,访问http://localhost:8763/hi?name=gaolei
《SpringCloud》4 容错处理(Hystrix)_Java_03

此时关闭ribbon-service项目,访问http://localhost:8763/hi?name=gaolei
《SpringCloud》4 容错处理(Hystrix)_springcloud_04说明当eureka-service工程不可用的时候,rabbion-service调用 eureka-service_的API接口时,会执行快速失败,直接返回一组字符串,而不是等待响应超时,这很好的控制了容器的线程阻塞。

在Feign中使用断熔器

Feign是自带断路器的,在低版本的Spring Cloud中,它没有默认打开

# hystrix (Feign是自带断路器的,在低版本的Spring Cloud中,它没有默认打开)
feign:
  hystrix:
    enabled: true

基于feign-service工程进行改造,只需要在FeignClient的**TestServicei接口的注解中加上fallback**的指定类

@FeignClient(value = "eureka-service",fallback = TestServiceHystric.class)
public interface TestService {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

TestserviceHystric需要实现SchedualServiceHi 接口,并注入到Ioc容器中,代码如下:

@Component
public class TestServiceHystric implements TestService {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

启动eureka-service工程,访问http://localhost:8765/hi?name=gaolei
《SpringCloud》4 容错处理(Hystrix)_字符串_05
此刻停止eureka-service工程,访问http://localhost:8765/hi?name=gaolei
《SpringCloud》4 容错处理(Hystrix)_断路器_06
断路器配置成功。

Hystrix Dashboard (Hystrix 仪表盘)

Hystrix简介

Hystrix的主要好处之一是它收集的关于每个*HystrixCommand**的指标集。Hystrix仪表板以高效的方式显示每个断路器的运行状况。_

基于ribbon-service项目改造,feign-service同理。

引入依赖

 		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

@EnableHystrixDashboard 开启hystrixDashboard

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
/**
 * @EnableHystrix 开启Hystrix
 * @EnableHystrixDashboard 开启hystrixDashboard
 * */
@EnableHystrixDashboard
public class RbbionApp {
    public static void main(String[] args) {
        SpringApplication.run(RbbionApp.class,args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return  new RestTemplate();
    }
}

访问 http://localhost:8763/hystrix
《SpringCloud》4 容错处理(Hystrix)_spring_07

项目源码

Gitee码云