SpringCloud4:断路器Hystrix

本文分为三部分,1 Ribbon客户端中断路器的使用,2 Feign客户端中断路器的使用,3 Hystrix 仪表盘的使用

关于断路器的介绍可参考:https://www.cnblogs.com/lazio10000/p/6027581.html

一、改造上文的ribbon工程
加入依赖

1
2
3
4
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

二、在Ribbon启动类上添加@EnableHystrix注解
@EnableHystrix注解包含了@EnableCircuitBreaker注解
也可以使用@SpringCloudApplication注解,其包含了@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ServiceRibbonApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }
   
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

三、改造service类
添加@HystrixCommand注解,并指定fallbackMethod熔断方法,该方法返回一个字符串
getForObject有三个重载方法,可以理解为对getForEntity 的进一步封装。
post请求可用postForObject方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "helloError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-MY/hello?name=" + name, String.class);
    }
   
    public String helloError(String name) {
        return "Sorry, "+name+", error happens! ";
    }
}

四、测试
1、启动EurekaServer工程
2、启动EurekaClient工程
3、启动Ribbon工程,访问http://127.0.0.1:8940/hello

4、停止EurekaClient工程,访问http://127.0.0.1:8940/hello

实际测试过程中,EurekaClient必须先于Ribbon工程启动,否则ribbon仍然无法获取到服务

————————————断路器篇————————————
一、修改配置文件
application.properties添加一行,开启断路器

1
feign.hystrix.enabled=true

二、service类添加fallback参数

1
2
3
4
5
@FeignClient(value = "service-my",fallback = SchedualServiceHelloHystric.class)
public interface SchedualServiceHello {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

并在同目录下创建service接口的实现类SchedualServiceHelloHystric.java
@Component不能漏,否则启动会报错,找不到实现类

1
2
3
4
5
6
7
8
9
@Component
public class SchedualServiceHelloHystric implements SchedualServiceHello {

    @Override
    public String sayHiFromClientOne(String name) {
        return "Sorry, "+name+",error happens! ";
    }

}

三、测试
1、启动EurekaServer工程
2、启动EurekaClient工程
3、启动Feign工程,访问http://127.0.0.1:8950/hello

4、停止EurekaClient工程,访问http://127.0.0.1:8950/hello

————————————Hystrix Dashboard (Hystrix 仪表盘)————————————
说明:
监控也可以做成一个单独的工程。被监控工程和监控工程都需要添加相关依赖。
被监控的工程主类必须开启断路器。
对集群的监控,需要整合Turbine才能实现。

1、在ribbon pom依赖中加入

1
2
3
4
5
6
7
8
9
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

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

2、在主程序启动类中加入@EnableHystrixDashboard注解,开启hystrixDashboard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
public class ServiceRibbonApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }
   
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3、启动ribbon工程
访问http://localhost:8940/hystrix/


按图中输入后,点击Monitor Stream

在没有启动EurekaClient的情况下访问http://localhost:8940/hello?name=baozi
查看仪表盘

图解:

全部源码:https://github.com/baijy/springcloudlearn/tree/master/chapter4