SpringCloud 学习之 Hystrix

Hystrix是啥

hystrix是用来做服务保护的,在微服务框架中,可能会有A服务调用B服务,B服务再去调用C服务的情况,这个时候如果C服务挂了,就会产生服务雪崩效应。
hystrix就是用来防止这种情况发生的。

简单使用

先把依赖引进来

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

哦对了,我们应该在调用方来防止服务雪崩,在提供方防止的话万一挂了还不是一样= =所以在服务消费者上使用hystrix

引入依赖后再入口类上加上注解@EnableHystrix 然后发现我擦怎么一个入口类这么多注解- -
不慌,spring提供了一个叫@SpringCloudApplication的注解,点进去就会发现他包含了@SpringBootApplication,@EnableDiscoveryClient,@EnableCircuitBreaker三个注解

接下来改造一下controller

1
2
3
4
5
6
7
8
9
@GetMapping("/msg")
@HystrixCommand(fallbackMethod = "getMsgFallBack")
public String getMsg(){
return msgClient.getMsg();
}

public String getMsgFallBack(){
return "触发服务降级...";
}

在getMsg方法上加上了@HystrixCommand(fallbackMethod = "getMsgFallBack")神马意思呢?就是当服务提供方挂掉了,超时了,就会去调用getMsgFallBack方法,返回错误提示
好像在方法上加也是挺麻烦的哦~没关系,可以用@DefaultProperties(defaultFallback = "getMsgFallBack").加在类上,就不需要每个都配置啦!

超时

刚刚说到服务提供者如果超时或者挂了,就会触发服务降级,那么默认超时是多少啊,看了下源码…1s!😱 我去,这个可不太行!
应该需要修改一下!
修改下刚刚的注解

1
@DefaultProperties(defaultFallback = "getMsgFallBack",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})

加上了commandProperties这个属性,然后value就是你想要的超时时间。
这个属性在@HystrixCommand上也有,是一样的。
在服务提供者的返回方法里让他睡上2秒钟,发现…他还是触发了降级!哈哈哈惊喜~因为我们已经集成了Feign了,而Feign是基于Ribbon的封装,本身有一套重试机制,原则上Ribbon的超时重试要大于Hystrix,不然就没意义了!
在yml里面加点配置就好了

1
2
3
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000

然后再记录下全局的Hystrix超时配置,虽然百度一大堆= =

1
2
3
4
5
6
7
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000

一寸长一寸强!

熔断

Hystrix有一套熔断机制,就比如一个服务你请求了20次,10几次都是超时的,就会触发熔断,这个服务就相当于被挂起,过了一定时间他就会尝试让请求通过,如果没问题了服务就会恢复正常。

就了解到这吧够用了应该- -不懂再看文档了,点这看帅逼群主的博客!